Files
ESP32-IOBOX/ESP32-IOBOX_Protocol.ino
Martijn Scheepers bbc17d690d Save ?
2022-11-01 12:42:29 +01:00

211 lines
6.2 KiB
C++

void parseUCS(unsigned char *packet, size_t length) {
if (length == 8 && packet[7] == '$') {
shortMessage(packet);
}
if (length == 12 && packet[11] == '&') {
longMessage(packet);
}
}
void shortMessage(unsigned char *packet) {
if ( (packet[2] == localConfig.ucsId[0] && packet[3] == localConfig.ucsId[1]) || (packet[2] == '.' && packet[3] == '.') ) {
switch (packet[4]) {
case 'A': { //Ouput On
//Serial.println("A");
uint8_t output = uint8_t(packet[6] - 0x30);
mcp.digitalWrite(output, HIGH);
} break;
case 'B': { //Output Off
//Serial.println("B");
uint8_t output = uint8_t(packet[6] - 0x30);
mcp.digitalWrite(output, LOW);
} break;
case 'C': { //Alles aan/uit
//Serial.println("C");
if (packet[6] == '0') { //alles uit
mcp.writePort(MCP23017Port::A, 0x00);
} else if (packet[6] == '1') { //alles aan
mcp.writePort(MCP23017Port::A, 0xFF);
}
} break;
case 'D': { //Identification
//Serial.println("D");
sendInputState();
sendOutputState();
} break;
case 'E': { //Toggle
//Serial.println("E");
uint8_t output = uint8_t(packet[6] - 0x30);
mcp.digitalWrite(output, !mcp.digitalRead(output));
} break;
case 'F': { //Knipperen
//Serial.println("F knipperen");
sendError();
} break;
case 'a': { //Open permanent
Serial.println("a");
} break;
case 'b': { //Sluiten
Serial.println("b");
} break;
case 'c': { //Open volgens eeprom
Serial.println("c");
} break;
case 'd': { //Sluit permanent
Serial.println("d");
} break;
case 'e': { //Zomer / winter stand
Serial.println("e");
} break;
case 'f': { //Rolluik
Serial.println("f");
} break;
case 'ã': { //Reset
Serial.println("ã");
ESP.restart();
} break;
default:
//Serial.println("short default");
sendError();
break;
}
}
}
int eepromMap[] = {0, 0, 0, 'U', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'S', '2', '0', '0', '2', 'Q', '0', '1'};
void longMessage(unsigned char *packet) {
if ( (packet[2] == localConfig.ucsId[0] && packet[3] == localConfig.ucsId[1]) || (packet[2] == '.' && packet[3] == '.') ) {
//Serial.println("for box");
switch (packet[4]) {
case 'M': { //Ouput On
//Serial.println("M long");
if (packet[5] == '?' && packet[6] == '?') {
char str[] = {packet[7], packet[8], packet[9], packet[10]};
unsigned long value = strtoul(str, NULL, 10);
if (value <= 37) {
sendMessage('P', eepromMap[value]);
}
}
} break;
// case 'A': { //Ouput On
// //Serial.println("A");
// //Serial.println(packet[6]);
// uint8_t output = uint8_t(packet[6] - 0x30);
// mcp.digitalWrite(output, LOW);
// } break;
// case 'B': { //Output Off
// //Serial.println("B");
// uint8_t output = uint8_t(packet[6] - 0x30);
// mcp.digitalWrite(output, HIGH);
// } break;
// case 'C': { //Alles aan/uit
// //Serial.println("C");
// if (packet[6] == '0') { //alles uit
// mcp.writePort(MCP23017_PORT::A, 0xFF);
// } else if (packet[6] == '1') { //alles aan
// mcp.writePort(MCP23017_PORT::A, 0x00);
// }
// } break;
// case 'D': { //Identification
// //Serial.println("D");
// sendInputState();
// sendOutputState();
// } break;
// case 'E': { //Toggle
// //Serial.println("E");
// uint8_t output = uint8_t(packet[6] - 0x30);
// mcp.digitalWrite(output, !mcp.digitalRead(output));
// } break;
// case 'F': { //Knipperen
// Serial.println("F knipperen");
// } break;
// case 'a': { //Open permanent
// Serial.println("a");
//
// } break;
// case 'b': { //Sluiten
// Serial.println("b");
//
// } break;
// case 'c': { //Open volgens eeprom
// Serial.println("c");
//
// } break;
// case 'd': { //Sluit permanent
// Serial.println("d");
//
// } break;
// case 'e': { //Zomer / winter stand
// Serial.println("e");
//
// } break;
// case 'f': { //Rolluik
// Serial.println("f");
//
// } break;
default:
//Serial.println("long default");
sendError();
break;
}
}
}
void sendError() {
char msg[10] = "XX-ERROR&";
msg[0] = localConfig.ucsId[0];
msg[1] = localConfig.ucsId[1];
transmitMessage(msg);
}
void sendMessage(char command, int val) {
char msg[9] = "XX..XXX$";
msg[0] = localConfig.ucsId[0];
msg[1] = localConfig.ucsId[1];
msg[4] = command;
char hexval[3];
sprintf(hexval, "%02X", val);
msg[5] = hexval[0];
msg[6] = hexval[1];
transmitMessage(msg);
}
void sendInputState() {
char msg[9] = "XX..NXX$";
msg[0] = localConfig.ucsId[0];
msg[1] = localConfig.ucsId[1];
char hexval[3];
sprintf(hexval, "%02X", mcp.readPort(MCP23017Port::B));
msg[5] = hexval[0];
msg[6] = hexval[1];
transmitMessage(msg);
}
void sendOutputState() {
char msg[9] = "XX..OXX$";
msg[0] = localConfig.ucsId[0];
msg[1] = localConfig.ucsId[1];
char hexval[3];
sprintf(hexval, "%02X", mcp.readPort(MCP23017Port::A));
msg[5] = hexval[0];
msg[6] = hexval[1];
transmitMessage(msg);
}
void sendDoorState() {
}
void sendLockstate() {
}