diff --git a/vTally.ino b/vTally.ino
index 3f25093..73e2047 100644
--- a/vTally.ino
+++ b/vTally.ino
@@ -13,7 +13,7 @@
#include "FS.h"
// Constants
-const float vers = 1.6;
+const float vers = 1.7;
const int SsidMaxLength = 24;
const int PassMaxLength = 24;
@@ -101,8 +101,8 @@ SoftwareSerial viscaSerial;
int udpstate = 0;
//// RS232 Serial Settings
-const int txpin = D5;
-const int rxpin = D6;
+const int txpin = D6;
+const int rxpin = D5;
//// Use the following constants and functions to modify the speed of PTZ commands
const double ZOOMMULT = 0.3; // speed multiplier for the zoom functions
@@ -140,22 +140,21 @@ const uint8_t ifclearcompl[] = {0x90, 0x50, 0xff};
int ifclearcomplength = 3;
/*
- * Video formats values:
- * Value HDMI SDI
- * 0x00 1080p25 1080p25
- * 0x01 1080p30 1080p30
- * 0x02 1080p50 720p50
- * 0x03 1080p60 720p60
- * 0x04 720p25 720p25
- * 0x05 720p30 720p30
- * 0x06 720p50 720p50
- * 0x07 720p60 720p60
- */
+ Video formats values:
+ Value HDMI SDI
+ 0x00 1080p25 1080p25
+ 0x01 1080p30 1080p30
+ 0x02 1080p50 720p50
+ 0x03 1080p60 720p60
+ 0x04 720p25 720p25
+ 0x05 720p30 720p30
+ 0x06 720p50 720p50
+ 0x07 720p60 720p60
+*/
const uint8_t format = 0x01;
const uint8_t videoFormat[] = { 0x81, 0x01, 0x35, 0x00, format, 0x00, 0xff }; // 8x 01 35 0p 0q 0r ff p = reserved, q = video mode, r = Used in PrecisionHD 720p camera.
-
// Load settings from EEPROM
void loadSettings()
{
@@ -204,7 +203,7 @@ void loadSettings()
settings.prvgreen = EEPROM.read(ptr);
ptr++;
settings.prvblue = EEPROM.read(ptr);
-
+
ptr++;
settings.offred = EEPROM.read(ptr);
ptr++;
@@ -222,7 +221,7 @@ void loadSettings()
ptr++;
high = EEPROM.read(ptr);
settings.viscaport = low + ((high << 8) & 0xFF00);
-
+
if (strlen(settings.ssid) == 0 || strlen(settings.pass) == 0 || strlen(settings.hostName) == 0 || settings.tallyNumber == 0 || settings.intensFull == 0 || settings.intensDim == 0 || settings.viscabaud == 0 || settings.viscaport == 0)
{
@@ -310,7 +309,7 @@ void saveSettings()
EEPROM.write(ptr, settings.viscaport & 0xFF);
ptr++;
EEPROM.write(ptr, (settings.viscaport >> 8) & 0xFF);
-
+
EEPROM.commit();
Serial.println(F("| Settings saved"));
@@ -366,7 +365,7 @@ void ledSetIntensity(int intensity)
// Set LED's off
void ledSetOff()
{
- leds.setPixelColor(0, leds.Color(0,0,0));
+ leds.setPixelColor(0, leds.Color(0, 0, 0));
ledSetIntensity(0);
leds.show();
}
@@ -374,7 +373,7 @@ void ledSetOff()
// Draw corner dots
void ledSetCornerDots()
{
- leds.setPixelColor(0, leds.Color(settings.offred,settings.offgreen,settings.offblue));
+ leds.setPixelColor(0, leds.Color(settings.offred, settings.offgreen, settings.offblue));
ledSetIntensity(settings.intensDim);
leds.show();
}
@@ -382,7 +381,7 @@ void ledSetCornerDots()
// Draw L(ive) with LED's
void ledSetProgram()
{
- leds.setPixelColor(0, leds.Color(settings.prgred,settings.prggreen,settings.prgblue));
+ leds.setPixelColor(0, leds.Color(settings.prgred, settings.prggreen, settings.prgblue));
ledSetIntensity(settings.intensFull);
leds.show();
}
@@ -390,7 +389,7 @@ void ledSetProgram()
// Draw P(review) with LED's
void ledSetPreview()
{
- leds.setPixelColor(0, leds.Color(settings.prvred,settings.prvgreen,settings.prvblue));
+ leds.setPixelColor(0, leds.Color(settings.prvred, settings.prvgreen, settings.prvblue));
ledSetIntensity(settings.intensFull);
leds.show();
}
@@ -398,7 +397,7 @@ void ledSetPreview()
// Draw C(onnecting) with LED's
void ledSetConnecting()
{
- leds.setPixelColor(0, leds.Color(0,255,255));
+ leds.setPixelColor(0, leds.Color(0, 255, 255));
ledSetIntensity(settings.intensDim);
leds.show();
}
@@ -406,7 +405,7 @@ void ledSetConnecting()
// Draw S(ettings) with LED's
void ledSetSettings()
{
- leds.setPixelColor(0, leds.Color(255,0,255));
+ leds.setPixelColor(0, leds.Color(255, 0, 255));
ledSetIntensity(settings.intensDim);
leds.show();
}
@@ -479,7 +478,7 @@ void handleData(String data)
vmixcon = 1;
Serial.print(F("| Response from vMix: "));
Serial.println(data);
-
+
//Serial.print(F("| FreeHeap: "));
//Serial.println(ESP.getFreeHeap(),DEC);
}
@@ -514,7 +513,7 @@ void apStart()
void tallyPageHandler()
{
String response_message = F("");
-
+
response_message += F("");
response_message += F("
");
response_message += F("vTally by CaliHC - ") + String(deviceName) + F("");
@@ -528,149 +527,153 @@ void tallyPageHandler()
response_message += F("");
response_message += F("");
-
+
response_message += F("| |
|---|
");
-
-
+
+
response_message += F("
| ");
switch (currentState)
- {
- case '0':
- response_message += F("OFF"); //off
- break;
- case '1':
- response_message += F("PROGRAM"); //prg
- break;
- case '2':
- response_message += F("PREVIEW"); //prv
- break;
- case '3':
- response_message += F("vMix Server not found!"); // no vMix Server
- break;
- case '4':
- response_message += F("connected to vMix Server, waiting for data."); // no vMix Server
- break;
- default:
- response_message += F("OFF"); //default off
- }
+ {
+ case '0':
+ response_message += F("OFF"); //off
+ break;
+ case '1':
+ response_message += F("PROGRAM"); //prg
+ break;
+ case '2':
+ response_message += F("PREVIEW"); //prv
+ break;
+ case '3':
+ response_message += F("vMix Server not found!"); // no vMix Server
+ break;
+ case '4':
+ response_message += F("connected to vMix Server, waiting for data."); // no vMix Server
+ break;
+ default:
+ response_message += F("OFF"); //default off
+ }
response_message += F(" |
");
-
+
response_message += F("| |
|---|
");
-
+
response_message += F("
| |
|---|
");
-
+
response_message += F("
");
-
+
response_message += F("");
httpServer.sendHeader("Connection", "close");
@@ -693,7 +696,7 @@ void rootPageHandler()
response_message += F("");
response_message += F("");
response_message += F("");
response_message += F("");
response_message += F("");
@@ -724,7 +727,7 @@ void rootPageHandler()
response_message += F("vTally ID: ") + String(settings.tallyNumber) + F("
");
response_message += F("");
response_message += F("");
response_message += F("
");
-
+
response_message += F("");
response_message += F("
");
@@ -902,14 +905,20 @@ void rootPageHandler()
sprintf(ip, "%d.%d.%d.%d", WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], WiFi.localIP()[3]);
response_message += F("
| IP | ") + String(ip) + F(" | WiFi Signal Strength | ") + String(WiFi.RSSI()) + F(" dBm |
");
response_message += F("| MAC | ") + String(WiFi.macAddress()) + F(" | ");
@@ -925,9 +934,9 @@ void rootPageHandler()
response_message += F("Inactive");
}
response_message += F(" | ");
-
+
response_message += F("
");
-
+
response_message += F("| Device Name | ") + String(deviceName) + F(" | ");
response_message += F("vMix Status | Disconnected");
}
response_message += F(" | ");
-
+
response_message += F("
");
response_message += F("| | | ");
@@ -953,9 +962,9 @@ void rootPageHandler()
response_message += F("style='border-radius: 0px 0px 10px 0px;background-color:red;color:white;'>Not Running");
}
response_message += F("");
-
+
response_message += F("
");
-
+
response_message += F("");
response_message += F("");
@@ -966,11 +975,11 @@ void rootPageHandler()
response_message += F("
");
response_message += F("");
-
+
response_message += F("
");
-
+
response_message += F("");
response_message += F("vTally v") + String(vers) + F(" © 2021 by CaliHC
");
@@ -1046,7 +1055,7 @@ void handleSave()
doRestart = true;
}
}
-
+
if (httpServer.hasArg("prgred"))
{
if (httpServer.arg("prgred").toInt() >= 0 and httpServer.arg("prgred").toInt() < 255)
@@ -1096,7 +1105,7 @@ void handleSave()
doRestart = true;
}
}
-
+
if (httpServer.hasArg("offred"))
{
if (httpServer.arg("offred").toInt() >= 0 and httpServer.arg("offred").toInt() < 255)
@@ -1226,7 +1235,7 @@ void connectTovMix()
Serial.println(F("+--------------------+"));
Serial.println(F("| vMix Message Log |"));
Serial.println(F("+--------------------+"));
-
+
tallySetOff();
// Subscribe to the tally events
@@ -1272,9 +1281,9 @@ void banner()
void start()
{
tallySetConnecting();
-
+
loadSettings();
-
+
Serial.println(F(""));
sprintf(deviceName, "vTally_%d", settings.tallyNumber);
sprintf(apPass, "%s%s", deviceName, "_pwd");
@@ -1285,6 +1294,7 @@ void start()
{
viscaSerial.begin(settings.viscabaud, SWSERIAL_8N1, rxpin, txpin, false, 200);
start_visca();
+ visca_power(true);
connectTovMix();
}
}
@@ -1377,38 +1387,56 @@ void visca_power(bool turnon)
void handle_visca(uint8_t *buf, size_t len)
{
- uint8_t modified[16];
+ uint8_t modified[18];
size_t lastelement = 0;
- for (int i = 0; (i < len && i < 16); i++)
- {
- modified[i] = buf[i];
- lastelement = i;
+
+ if ((buf[0] == 0x01 && buf[1] == 0x00 && buf[2] == 0x00)) { // && buf[3] == 0x09) || (buf[0] == 0x01 && buf[1] == 0x00 && buf[2] == 0x00 && buf[3] == 0x06)) {
+ int j = 0;
+ for (int i = 8; (i < len && i < 18); i++)
+ {
+ modified[j] = buf[i];
+ lastelement = j;
+ j++;
+ }
+ //modified[0] = 0x01;
+ } else {
+ for (int i = 0; (i < len && i < 18); i++)
+ {
+ modified[i] = buf[i];
+ lastelement = i;
+ }
}
+ Serial.print(F("| Payload short (hex):"));
+ debug(modified, lastelement+1);
+ Serial.println(F(""));
+
// is this a PTZ?
if (modified[1] == 0x01 && modified[2] == 0x06 && modified[3] == 0x01)
{
Serial.println(F("| PTZ CONTROL DETECTED... ADJUSTING SPEED"));
- modified[4] = (int)ptzcurve(modified[4]);
- modified[5] = (int)ptzcurve(modified[5]);
+ //modified[4] = (int)ptzcurve(modified[4]);
+ //modified[5] = (int)ptzcurve(modified[5]);
}
+
+ // is this ZOOM?
if (modified[1] == 0x01 && modified[2] == 0x04 && modified[3] == 0x07)
{
Serial.println(F("| ZOOM CONTROL DETECTED, ADJUSTING SPEED"));
- int zoomspeed = modified[4] & 0b00001111;
- zoomspeed = (int)zoomcurve(zoomspeed);
- int zoomval = (modified[4] & 0b11110000) + zoomspeed;
- modified[4] = zoomval;
- }
-
- Serial1.write(modified, lastelement + 1);
- Serial.println(F("| VISCA IP: Send ACK"));
- udp.writeTo(modified, lastelement+1, lastclientip, lastclientport);
- //udp.writeTo(ifclearcompl, ifclearcomplength, lastclientip, lastclientport);
- //udp.writeTo(ack, 3, lastclientip, lastclientport);
- //udp.writeTo(complete, 3, lastclientip, lastclientport);
- //udp.writeTo(ack2, 3, lastclientip, lastclientport);
- //udp.writeTo(complete, 2, lastclientip, lastclientport);
+ //int zoomspeed = modified[4] & 0b00001111;
+ //zoomspeed = (int)zoomcurve(zoomspeed);
+ //int zoomval = (modified[4] & 0b11110000) + zoomspeed;
+ //modified[4] = zoomval;
+ }
+
+ if (modified[1] == 0x01 && modified[2] == 0x04 && modified[3] == 0x08)
+ {
+ Serial.println(F("| FOCUS CONTROL DETECTED, ADJUSTING SPEED"));
+ }
+
+ viscaSerial.write(modified, lastelement + 1);
+ //Serial.println(F("| VISCA IP: Send ACK"));
+ udp.writeTo(modified, lastelement + 1, lastclientip, lastclientport);
}
void start_visca()
@@ -1430,7 +1458,7 @@ void start_visca()
Serial.print(F("| Type of UDP datagram: "));
Serial.println(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast"
- : "Unicast");
+ : "Unicast");
Serial.print(F("| Sender: "));
Serial.print(lastclientip);
Serial.print(F(":"));
@@ -1472,12 +1500,11 @@ void check_serial()
debug(lastser_in, actual);
if (lastclientport > 0)
udp.writeTo(lastser_in, actual, lastclientip, lastclientport);
-
+
available = viscaSerial.available();
}
}
-
void setup()
{
Serial.begin(9600);
@@ -1490,18 +1517,18 @@ void setup()
httpServer.on("/", HTTP_GET, rootPageHandler);
httpServer.on("/save", HTTP_POST, handleSave);
httpServer.on("/tally", HTTP_GET, tallyPageHandler);
- httpServer.on("/zend", [](){
+ httpServer.on("/zend", []() {
//httpServer.sendHeader("Connection", "close");
httpServer.sendHeader("Cache-Control", "no-cache");
httpServer.sendHeader("Access-Control-Allow-Origin", "*");
-
+
if (currentState != oldState) {
- httpServer.send(200, "text/event-stream", "event: message\ndata: refresh"+String(vmixcon)+"\nretry: 500\n\n");
+ httpServer.send(200, "text/event-stream", "event: message\ndata: refresh" + String(vmixcon) + "\nretry: 500\n\n");
oldState = currentState;
} else {
httpServer.send(200, "text/event-stream", "event: message\ndata: norefresh\nretry: 500\n\n");
}
-
+
//Serial.print(F("| FreeHeap: "));
//Serial.println(ESP.getFreeHeap(),DEC);
});
@@ -1509,7 +1536,7 @@ void setup()
httpServer.begin();
banner();
-
+
start();
}