diff --git a/bitrep.h b/bitrep.h new file mode 100644 index 0000000..8cf1d25 --- /dev/null +++ b/bitrep.h @@ -0,0 +1,9 @@ +#pragma once + +const char *bit_rep[16] = +{ + [ 0] = "0000", [ 1] = "0001", [ 2] = "0010", [ 3] = "0011", + [ 4] = "0100", [ 5] = "0101", [ 6] = "0110", [ 7] = "0111", + [ 8] = "1000", [ 9] = "1001", [10] = "1010", [11] = "1011", + [12] = "1100", [13] = "1101", [14] = "1110", [15] = "1111", +}; diff --git a/main.cpp b/main.cpp index 4be10b4..79809c6 100644 --- a/main.cpp +++ b/main.cpp @@ -8,6 +8,7 @@ #include "pwm.h" #include "rgbled.h" #include "eeprom.h" +#include "bitrep.h" #define MAX_RELAYS 32 #define COMMAND_BUFFER_SIZE 32 @@ -61,11 +62,12 @@ void writeState( WirelessRelayStore* relays, Pwm16b* auxPwm, Serial* serial ) serial->putChar('\n'); } -void relayDispatch(WirelessRelayStore* relays, Pwm16b* auxPwm, char* inBuffer, Serial* serial) +void relayDispatch(WirelessRelayStore* relays, Pwm16b* auxPwm, char* token, Serial* serial) { - if( strncmp(inBuffer, "add", 3) == 0 && inBuffer[3] != '\0') + if( strcmp(token, "add") == 0 ) { - uint16_t id = strtol( inBuffer+3, nullptr, 16 ); + char* token = strtok(NULL, " \n"); + uint16_t id = strtol(token, nullptr, 2 ); if(id != 0 && relays->count < MAX_RELAYS) { relays->array[relays->count].init(id); @@ -78,153 +80,188 @@ void relayDispatch(WirelessRelayStore* relays, Pwm16b* auxPwm, char* inBuffer, relays->count++; } - else serial->write_p(PSTR("Usage: relay add [id] [id] being a 16bit hex nummber\n")); + else serial->write_p(PSTR("Usage: relay add [id] [id] being a 16bit binary nummber\n")); } - else if( strncmp(inBuffer, "delete", 6) == 0 && inBuffer[5] != '\0') + else if( strcmp(token, "delete") == 0 ) { serial->write_p(PSTR("Relay: ")); serial->write(relays->count); serial->write_p(PSTR(" deleted\n")); relays->count--; } - else if( strncmp(inBuffer, "list", 4) == 0) + else if( strcmp(token, "list") == 0 ) { serial->write_p(PSTR("Relays:\n")); for(uint8_t i = 0; i < relays->count; i++) { - snprintf(buffer, SNPRINTF_BUFFER_SIZE, "NUMBER: %u ID: %X\n", i, relays->array[i].getId()); + uint16_t id = relays->array[i].getId(); + snprintf(buffer, SNPRINTF_BUFFER_SIZE, "NUMBER: %u ID: %s%s%s%s\n", i, + bit_rep[ id >> 12], + bit_rep[(id & 0x0F00) >> 8 ], + bit_rep[(id & 0x00F0) >> 4 ], + bit_rep[ id & 0x000F ]); serial->write(buffer, SNPRINTF_BUFFER_SIZE); } serial->putChar('\n'); } - else if( strncmp(inBuffer, "on", 2) == 0 && inBuffer[2] != '\0') + else if( strcmp(token, "on") == 0 ) { - uint8_t selected = atoi(inBuffer+2); - if (selected <= relays->count) + char* token = strtok(NULL, " \n"); + if( token != NULL) { - relays->array[selected].on(); - - snprintf(buffer, SNPRINTF_BUFFER_SIZE, "RELAY: %u turned on\n", selected); - serial->write(buffer, SNPRINTF_BUFFER_SIZE); - if(relays->printState) writeState(relays, auxPwm, serial); + uint8_t selected = atoi(token); + if (selected <= relays->count) + { + relays->array[selected].on(); + + snprintf(buffer, SNPRINTF_BUFFER_SIZE, "RELAY: %u turned on\n", selected); + serial->write(buffer, SNPRINTF_BUFFER_SIZE); + if(relays->printState) writeState(relays, auxPwm, serial); + } + else serial->write("No sutch Relay\n"); } - else serial->write("No sutch Relay\n"); } - else if( strncmp(inBuffer, "off", 3) == 0 && inBuffer[3] != '\0') + else if( strcmp(token, "off") == 0 ) { - uint8_t selected = atoi(inBuffer+3); - if (selected <= relays->count) + char* token = strtok(NULL, " \n"); + if( token != NULL) { - relays->array[selected].off(); - - snprintf(buffer, SNPRINTF_BUFFER_SIZE, "RELAY: %u turned off\n", selected); - serial->write(buffer, SNPRINTF_BUFFER_SIZE); - if(relays->printState) writeState(relays, auxPwm, serial); + uint8_t selected = atoi(token); + if (selected <= relays->count) + { + relays->array[selected].off(); + + snprintf(buffer, SNPRINTF_BUFFER_SIZE, "RELAY: %u turned off\n", selected); + serial->write(buffer, SNPRINTF_BUFFER_SIZE); + if(relays->printState) writeState(relays, auxPwm, serial); + } + else serial->write("No sutch Relay\n"); } - else serial->write("No sutch Relay\n"); } - else if( strncmp(inBuffer, "machine on", 7) == 0 ) + else if( strcmp(token, "machine") == 0 ) { - relays->printState = true; - serial->write_p(PSTR("Turned on State printing\n")); - } - else if( strncmp(inBuffer, "machine off", 8) == 0 ) - { - relays->printState = false; - serial->write("Turned off State printing\n"); + char* token = strtok(NULL, " \n"); + if( token != NULL) + { + if( strcmp(token, "on") == 0 ) + { + relays->printState = true; + serial->write_p(PSTR("Turned on State printing\n")); + } + else + { + relays->printState = false; + serial->write("Turned off State printing\n"); + } + } + else serial->write_p(PSTR("Usage: relay machine [on/off]\n")); } else { - serial->write(inBuffer, COMMAND_BUFFER_SIZE-5); + serial->write(token); serial->write_p(PSTR(" is not a valid subcommand: relay [add/delete/list/on/off/state/machine]\n")); } } -void rgbDispatch(RgbLed* rgbled, char* inBuffer, Serial* serial) +void rgbDispatch(RgbLed* rgbled, char* token, Serial* serial) { - if( strncmp(inBuffer, "on", 2) == 0 ) + if( strcmp(token, "on") == 0 ) { rgbled->on(); serial->write_p(PSTR("RGB lights on\n")); } - else if( strncmp(inBuffer, "off", 3) == 0 ) + else if( strcmp(token, "off") == 0 ) { rgbled->off(); serial->write_p(PSTR("RGB lights off\n")); } - else if( strncmp(inBuffer, "print", 5) == 0 ) + else if( strcmp(token, "print") == 0 ) { - snprintf(buffer, SNPRINTF_BUFFER_SIZE, "Current RGB values:\nR: %u G: %u B: %u\n", rgbled->getR(), rgbled->getG(), rgbled->getB()); serial->write(buffer, SNPRINTF_BUFFER_SIZE); } - else if( strncmp(inBuffer, "set", 3) == 0 ) + else if( strcmp(token, "set") == 0 ) { - uint8_t i = 0; - for(; inBuffer[i] != '\0' && i < COMMAND_BUFFER_SIZE-4; i++ ); - if( i > 14) + char* rToken = strtok(NULL, " \n"); + char* gToken = strtok(NULL, " \n"); + char* bToken = strtok(NULL, " \n"); + if(rToken != NULL && gToken != NULL && bToken != NULL) { - inBuffer[7] = '\0'; - inBuffer[11] = '\0'; - rgbled->setSolidColor(atoi(inBuffer+4), atoi(inBuffer+8), atoi(inBuffer+12)); + rgbled->setSolidColor(atoi(rToken), atoi(gToken), atoi(bToken)); serial->write_p(PSTR("Set RGB values\n")); } else serial->write_p(PSTR("Usage: rgb set [RRR] [GGG] [BBB]\n")); } - else if( strncmp(inBuffer, "pattern", 7) == 0 ) + else if( strcmp(token, "pattern") == 0 ) { - rgbled->setPattern(atoi(inBuffer+8)); - serial->write_p(PSTR("Set Pattern\n")); + token = strtok(NULL, " \n"); + if( token != NULL ) + { + rgbled->setPattern(atoi(token)); + serial->write_p(PSTR("Set Pattern\n")); + } + else serial->write_p(PSTR("Usage: rgb pattern [id]\n")); } - else if( strncmp(inBuffer, "preset", 6) == 0 ) + else if( strcmp(token, "preset") == 0 ) { - rgbled->setPreset(atoi(inBuffer+7)); - serial->write_p(PSTR("Set Preset\n")); + token = strtok(NULL, " \n"); + if( token != NULL ) + { + rgbled->setPreset(atoi(token)); + serial->write_p(PSTR("Set Preset\n")); + } + else serial->write_p(PSTR("Usage: rgb preset [ID]\n")); } - else if( strncmp(inBuffer, "fade on", 7) == 0 ) + else if( strcmp(token, "fade") == 0 ) { - rgbled->setFade(true); - serial->write_p(PSTR("Turned on Fade\n")); - } - else if( strncmp(inBuffer, "fade off", 8) == 0 ) - { - rgbled->setFade(false); - serial->write_p(PSTR("Turned off Fade\n")); + token = strtok(NULL, " \n"); + if( token != NULL ) + { + if( strcmp(token, "on") == 0 ) + { + rgbled->setFade(true); + serial->write_p(PSTR("Turned on Fade\n")); + } + else + { + rgbled->setFade(false); + serial->write_p(PSTR("Turned off Fade\n")); + } + } + else serial->write_p(PSTR("Usage: rgb fade [on/off]\n")); } else { - serial->write(inBuffer, COMMAND_BUFFER_SIZE-4); - serial->write_p(PSTR(" is not a valid subcommand: rgb [on/off/print/set/pattern/preset]\n")); + serial->write(token); + serial->write_p(PSTR(" is not a valid subcommand: rgb [on/off/print/set/pattern/preset/fade]\n")); } } -void auxDispatch(Pwm16b* auxPwm, char* inBuffer, Serial* serial) +void auxDispatch(Pwm16b* auxPwm, char* token, Serial* serial) { - if( strncmp(inBuffer, "on", 2) == 0 ) + if(strcmp(token, "on") == 0 ) { auxPwm->on(); serial->write_p(PSTR("Aux pwm on\n")); } - else if( strncmp(inBuffer, "off", 3) == 0 ) + else if(strcmp(token, "off") == 0 ) { auxPwm->off(); serial->write_p(PSTR("Aux pwm off\n")); } - else if( strncmp(inBuffer, "set", 3) == 0 ) + else if(strcmp(token, "set") == 0 ) { - uint8_t i = 0; - for(; inBuffer[i] != '\0' && i < COMMAND_BUFFER_SIZE-4; i++ ); - if( i > 4) + token = strtok(NULL, " \n"); + if(token != NULL) { - auxPwm->setDutyA(atoi(inBuffer+4) << 8); + auxPwm->setDutyA(atoi(token) << 8); serial->write_p(PSTR("Set PWM value\n")); } else serial->write_p(PSTR("Usage: aux set [VALUE]\n")); - } else { - serial->write(inBuffer, COMMAND_BUFFER_SIZE-4); + serial->write(token, COMMAND_BUFFER_SIZE-4); serial->write_p(PSTR(" is not a valid subcommand: aux [on/off/set]\n")); } } @@ -238,30 +275,31 @@ void serialDispatch(Serial* serial , WirelessRelayStore* relays, RgbLed* rgbled, unsigned int length = serial->getString(buffer, COMMAND_BUFFER_SIZE); if(length > 2) { - if(length > 4 && strncmp(buffer, "relay", 5) == 0) + char* token = strtok(buffer, " \n"); + if(strcmp(token, "relay") == 0) { - relayDispatch(relays, auxPwm, buffer+6, serial); + relayDispatch(relays, auxPwm, strtok(NULL, " \n"), serial); } - else if(length > 2 && strncmp(buffer, "rgb", 3) == 0) + else if(strcmp(token, "rgb") == 0) { - rgbDispatch(rgbled, buffer+4, serial); + rgbDispatch(rgbled, strtok(NULL, " \n"), serial); } - else if(length > 2 && strncmp(buffer, "aux", 3) == 0) + else if(strcmp(token, "aux") == 0) { - auxDispatch(auxPwm, buffer+4, serial); + auxDispatch(auxPwm, strtok(NULL, " \n"), serial); if(relays->printState == true) writeState(relays, auxPwm, serial); } - else if(length > 4 && strncmp(buffer, "state", 5) == 0) + else if(strcmp(token, "state") == 0) { writeState(relays, auxPwm, serial); } - else if(length > 4 && strncmp(buffer, "erase", 5) == 0) + else if(strcmp(token, "erase") == 0) { for(uint16_t i = 0; i < MAX_RELAYS*2+1; i++) EEPROM_write_char(i, 0); serial->write_p(PSTR("EEPROM erased\n")); relays->count = 0; } - else if(length > 3 && strncmp(buffer, "help", 4) == 0) + else if(strcmp(token, "help") == 0) { printHelp(serial); } diff --git a/serial.cpp b/serial.cpp index eee0156..6e95273 100644 --- a/serial.cpp +++ b/serial.cpp @@ -41,6 +41,7 @@ void Serial::write(const char* in, const unsigned int length) void Serial::write_p(const char in[]) { + cli(); char ch = pgm_read_byte(in); while (ch != '\0') { @@ -48,6 +49,7 @@ void Serial::write_p(const char in[]) in++; ch = pgm_read_byte(in); } + sei(); } void Serial::write(const char in[]) diff --git a/serial.h b/serial.h index 3610289..7153bf2 100644 --- a/serial.h +++ b/serial.h @@ -2,7 +2,7 @@ #define SERIAL_H #define BAUD 38400 -#define SERIAL_BUFFER_SIZE 256 +#define SERIAL_BUFFER_SIZE 128 #include #include