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(""); - + 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(""); 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("
"); @@ -765,22 +768,22 @@ void rootPageHandler() response_message += F("
"); response_message += F(""); //response_message += F(""); @@ -799,7 +802,7 @@ void rootPageHandler() response_message += F("
"); response_message += F(""); - + response_message += F("
"); response_message += F("
"); @@ -840,7 +843,7 @@ void rootPageHandler() response_message += F("
  
"); response_message += F("
  Preview  
"); response_message += F("
"); - + response_message += F("
"); response_message += F(""); response_message += F("
"); @@ -869,9 +872,9 @@ void rootPageHandler() response_message += F("
"); response_message += F(""); response_message += F("
"); - response_message += F(""); + response_message += F(""); response_message += F("
"); - + response_message += F("
"); response_message += F("
"); @@ -885,13 +888,13 @@ void rootPageHandler() response_message += F("
"); response_message += F(""); - + response_message += 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 StatusDisconnected"); } 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(); }