diff --git a/main.cpp b/main.cpp index fd64933..7a9e253 100644 --- a/main.cpp +++ b/main.cpp @@ -7,14 +7,7 @@ #include "writepin.h" #include "train.h" #include "eeprom.h" - -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", -}; +#include "bitrep.h" #define MAX_TRAINS 16 #define COMMAND_BUFFER_SIZE 64 @@ -35,29 +28,29 @@ ISR(TIMER0_OVF_vect) { if(powerIsOn) { - ++tick; - if(tick == TICK_MAX) - { - for(uint16_t i = 0; i < storedTrains; i++) trains[i].resendSpeed(); - if(autoff) + ++tick; + if(tick == TICK_MAX) { - bool trainsRunning = false; - for(uint16_t i = 0; i < storedTrains; i++) trainsRunning = trainsRunning || trains[i].getSpeed(); - if(!trainsRunning) + for(uint16_t i = 0; i < storedTrains; i++) trains[i].resendSpeed(); + if(autoff) { - powerIsOn = false; - Train::setOutput(Train::OFF); + bool trainsRunning = false; + for(uint16_t i = 0; i < storedTrains; i++) trainsRunning = trainsRunning || trains[i].getSpeed(); + if(!trainsRunning) + { + powerIsOn = false; + Train::setOutput(Train::OFF); + } } + tick = 0; + } + else + { + + Train::setOutput(Train::HIGH); + _delay_us(200); + Train::setOutput(Train::LOW); } - tick = 0; - } - else - { - - Train::setOutput(Train::HIGH); - _delay_us(200); - Train::setOutput(Train::LOW); - } } } @@ -110,6 +103,7 @@ inline static void printHelp(Serial* serial) void trainDispatch(char* inBuffer, Serial* serial) { + cli(); if(powerIsOn == false) { powerIsOn = true; @@ -149,28 +143,50 @@ void trainDispatch(char* inBuffer, Serial* serial) } serial->putChar('\n'); } - else\ + else { uint8_t id = strtol(inBuffer, nullptr, 10); if(id < storedTrains ) { char* token = strtok(NULL, " "); - if( strcmp(token, "speed") == 0 ) + if( token != NULL && strcmp(token, "speed") == 0 ) { token = strtok(NULL, " "); trains[id].setSpeed(atoi(token)); + serial->write_p(PSTR("Set Train speed\n")); } - else if( strcmp(token, "function") == 0 ) + else if(token != NULL && strcmp(token, "function") == 0 ) { token = strtok(NULL, " "); + if(token != NULL) + { + for(uint16_t j = 0; j < 8; j++) + { + uint16_t i = strtol(token, nullptr, 16 ); + trains[id].sendFunction(i); + snprintf(buffer, SNPRINTF_BUFFER_SIZE, "TRYING: %x\n", i); + serial->write(buffer, strlen(buffer)); + sei(); + _delay_ms(250); + cli(); + + } + } + /* trains[id].sendFunction(atoi(token)); + serial->write_p(PSTR("Set Train function\n"));*/ } - else if( strcmp(token, "reverse") == 0 ) trains[id].reverse(); - else if( strcmp(token, "stop") )trains[id].setSpeed(0); + else if( token != NULL && strcmp(token, "reverse") == 0 ) + { + trains[id].reverse(); + serial->write_p(PSTR("Reversed Train\n")); + } + else if( token != NULL && strcmp(token, "stop") )trains[id].setSpeed(0); else serial->write_p(PSTR("Not a valid command\n")); } else serial->write_p(PSTR("Id out of range.\n")); } + sei(); } void powerDispatch(char* token, Serial* serial) @@ -195,13 +211,13 @@ void powerDispatch(char* token, Serial* serial) else if(strcmp(token, "auto") == 0) { token = strtok(NULL, " "); - if(strcmp(token, "on") == 0) + if(token != NULL && strcmp(token, "on") == 0) { autoff = true; serial->write_p(PSTR("auto power off turned on.\n")); save_state(); } - else if(strcmp(token, "off") == 0) + else if(token != NULL && strcmp(token, "off") == 0) { autoff = false; serial->write_p(PSTR("auto power off turned off.\n")); @@ -232,7 +248,7 @@ void serialDispatch(Serial* serial) if(length > 4 && strcmp(token, "train") == 0) { token = strtok(NULL, " "); - trainDispatch(token, serial); + if(token != NULL)trainDispatch(token, serial); } else if(length > 4 && strncmp(token, "erase", 4) == 0) { @@ -253,13 +269,15 @@ void serialDispatch(Serial* serial) { for(uint16_t i = 0; i < storedTrains; i++) { + cli(); trains[i].setSpeed(0); + sei(); } } else if(length > 3 && strcmp(token, "power") == 0) { token = strtok(NULL, " "); - powerDispatch(token, serial); + if(token != NULL)powerDispatch(token, serial); } else if(length > 3 && strcmp(token, "help") == 0) { @@ -282,7 +300,7 @@ int main() TIMSK0 = 0b00000001; //turn on timer0 interupt on OCIEB TCCR0B = (1<