diff --git a/WirelessRelay.cpp b/WirelessRelay.cpp index 1e79cfb..5cf5701 100644 --- a/WirelessRelay.cpp +++ b/WirelessRelay.cpp @@ -1,5 +1,8 @@ #include"WirelessRelay.h" +#include +volatile unsigned char *_port = &PORTB; +unsigned char _pin = PB5; void WirelessRelay::sendId() { @@ -85,16 +88,14 @@ bool WirelessRelay::getExpectedState() } -void WirelessRelay::init( volatile unsigned char *port, const unsigned char pin, const uint16_t id) +void WirelessRelay::init( const uint16_t id) { - _port=port; _id=id; - _pin=pin; } -WirelessRelay::WirelessRelay( volatile unsigned char *port, const unsigned char pin, const uint16_t id) +WirelessRelay::WirelessRelay(const uint16_t id) { - init( port, pin, id); + init(id); } WirelessRelay::WirelessRelay(){} diff --git a/WirelessRelay.h b/WirelessRelay.h index 60fe869..d2a4fc5 100644 --- a/WirelessRelay.h +++ b/WirelessRelay.h @@ -12,16 +12,14 @@ class WirelessRelay private: bool _state = false; uint16_t _id; - volatile unsigned char *_port; - unsigned char _pin; void sendBit( const bool i); void sync(); void sendId(); public: - WirelessRelay( volatile unsigned char *port, const unsigned char pin, const uint16_t id); + WirelessRelay(const uint16_t id); WirelessRelay(); - void init( volatile unsigned char *port, const unsigned char pin, const uint16_t id); + void init(const uint16_t id); void on(); void off(); uint16_t getId(); diff --git a/main.cpp b/main.cpp index 61072f2..f97e43e 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "serial.h" #include "writepin.h" #include "WirelessRelay.h" @@ -10,6 +11,9 @@ #define MAX_RELAYS 32 #define COMMAND_BUFFER_SIZE 32 +#define SNPRINTF_BUFFER_SIZE 32 + +char buffer[SNPRINTF_BUFFER_SIZE]; struct WirelessRelayStore { @@ -19,9 +23,12 @@ struct WirelessRelayStore uint8_t count; }; +WirelessRelayStore relays; + inline static void printHelp(Serial* serial) { - serial->write("Available Commands: \n\ + + serial->write_p(PSTR("Available Commands: \n\ help : Show this prompt \n\ relay add [id] : Add Wireless Relay\n\ relay list : Print list of saved Wireless Relays \n\ @@ -35,7 +42,7 @@ inline static void printHelp(Serial* serial) rgb pattern [id] : RGB pattern\n\ rgb preset [id] : set preset color\n\ rgb fade [on/off] : turn Colorfade on or off\n\ - version : Print Version.\n"); + version : Print Version.\n")); } void writeState( WirelessRelayStore* relays, Serial* serial ) @@ -57,27 +64,25 @@ void relayDispatch(WirelessRelayStore* relays, char* inBuffer, Serial* serial) uint16_t id = strtol( inBuffer+4, nullptr, 16 ); if(id != 0 && relays->count < MAX_RELAYS) { - relays->array[relays->count].init(&PORTB, PB5, id); - char buffer[64]; + relays->array[relays->count].init(id); EEPROM_write_char( 0, relays->count+1 ); EEPROM_write_string( relays->count*2+1, (char*) &id, 2 ); - sprintf(buffer, "Relay saved! NUMBER: %u ID: %X\n", relays->count, id); - serial->write(buffer, 64); + snprintf(buffer, SNPRINTF_BUFFER_SIZE, "Relay saved! NUMBER: %u ID: %X\n", relays->count, id); + serial->write(buffer, SNPRINTF_BUFFER_SIZE); relays->count++; } - else serial->write("Usage: relay add [id] [id] being a 16bit hex nummber\n"); + else serial->write_p(PSTR("Usage: relay add [id] [id] being a 16bit hex nummber\n")); } else if( strncmp(inBuffer, "list", 4) == 0) { - serial->write("Relays:\n"); + serial->write_p(PSTR("Relays:\n")); for(uint8_t i = 0; i < relays->count; i++) { - char buffer[64]; - sprintf(buffer, "NUMBER: %u ID: %X\n", i, relays->array[i].getId()); - serial->write(buffer, 64); + snprintf(buffer, SNPRINTF_BUFFER_SIZE, "NUMBER: %u ID: %X\n", i, relays->array[i].getId()); + serial->write(buffer, SNPRINTF_BUFFER_SIZE); } serial->putChar('\n'); } @@ -88,10 +93,8 @@ void relayDispatch(WirelessRelayStore* relays, char* inBuffer, Serial* serial) { relays->array[selected].on(); - - char buffer[64]; - sprintf(buffer, "RELAY: %u turned on\n", selected); - serial->write(buffer, 64); + snprintf(buffer, SNPRINTF_BUFFER_SIZE, "RELAY: %u turned on\n", selected); + serial->write(buffer, SNPRINTF_BUFFER_SIZE); if(relays->printState) writeState(relays, serial); } else serial->write("No sutch Relay\n"); @@ -103,14 +106,13 @@ void relayDispatch(WirelessRelayStore* relays, char* inBuffer, Serial* serial) { relays->array[selected].off(); - char buffer[64]; - sprintf(buffer, "RELAY: %u turned off\n", selected); - serial->write(buffer, 64); + snprintf(buffer, SNPRINTF_BUFFER_SIZE, "RELAY: %u turned off\n", selected); + serial->write(buffer, SNPRINTF_BUFFER_SIZE); if(relays->printState) writeState(relays, serial); } else serial->write("No sutch Relay\n"); } - else if( strncmp(inBuffer, "state", 5) == 0 && inBuffer[3] != '\0') + else if( strncmp(inBuffer, "state", 5) == 0 && inBuffer[5] != '\0') { writeState(relays, serial); } @@ -127,7 +129,7 @@ void relayDispatch(WirelessRelayStore* relays, char* inBuffer, Serial* serial) else { serial->write(inBuffer, COMMAND_BUFFER_SIZE-5); - serial->write(" is not a valid subcommand: relay [add/list/on/off]\n"); + serial->write_p(PSTR(" is not a valid subcommand: relay [add/list/on/off]\n")); } } @@ -136,18 +138,18 @@ void rgbDispatch(RgbLed* rgbled, char* inBuffer, Serial* serial) if( strncmp(inBuffer, "on", 2) == 0 ) { rgbled->on(); - serial->write("RGB lights on\n"); + serial->write_p(PSTR("RGB lights on\n")); } else if( strncmp(inBuffer, "off", 3) == 0 ) { rgbled->off(); - serial->write("RGB lights off\n"); + serial->write_p(PSTR("RGB lights off\n")); } else if( strncmp(inBuffer, "print", 5) == 0 ) { - char buffer[64]; - sprintf(buffer, "Current RGB values:\nR: %u G: %u B: %u\n", rgbled->getR(), rgbled->getG(), rgbled->getB()); - serial->write(buffer, 64); + + 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 ) { @@ -158,34 +160,34 @@ void rgbDispatch(RgbLed* rgbled, char* inBuffer, Serial* serial) inBuffer[7] = '\0'; inBuffer[11] = '\0'; rgbled->setSolidColor(atoi(inBuffer+4), atoi(inBuffer+8), atoi(inBuffer+12)); - serial->write("Set RGB values\n"); + serial->write_p(PSTR("Set RGB values\n")); } - else serial->write("Usage: rgb set [RRR] [GGG] [BBB]\n"); + else serial->write_p(PSTR("Usage: rgb set [RRR] [GGG] [BBB]\n")); } else if( strncmp(inBuffer, "pattern", 7) == 0 ) { rgbled->setPattern(atoi(inBuffer+8)); - serial->write("Set Pattern\n"); + serial->write_p(PSTR("Set Pattern\n")); } else if( strncmp(inBuffer, "preset", 6) == 0 ) { rgbled->setPreset(atoi(inBuffer+7)); - serial->write("Set Preset\n"); + serial->write_p(PSTR("Set Preset\n")); } else if( strncmp(inBuffer, "fade on", 7) == 0 ) { rgbled->setFade(true); - serial->write("Turned on Fade\n"); + serial->write_p(PSTR("Turned on Fade\n")); } else if( strncmp(inBuffer, "fade off", 8) == 0 ) { rgbled->setFade(false); - serial->write("Turned off Fade\n"); + serial->write_p(PSTR("Turned off Fade\n")); } else { serial->write(inBuffer, COMMAND_BUFFER_SIZE-4); - serial->write(" is not a valid subcommand: rgb [/on/off/print/set/pattern/preset]\n"); + serial->write_p(PSTR(" is not a valid subcommand: rgb [/on/off/print/set/pattern/preset]\n")); } } @@ -196,7 +198,7 @@ void serialDispatch(Serial* serial , WirelessRelayStore* relays, RgbLed* rgbled) { char buffer[COMMAND_BUFFER_SIZE]; unsigned int length = serial->getString(buffer, COMMAND_BUFFER_SIZE); - if(length != 0) + if(length > 2) { if(length > 4 && strncmp(buffer, "relay", 5) == 0) { @@ -213,16 +215,16 @@ void serialDispatch(Serial* serial , WirelessRelayStore* relays, RgbLed* rgbled) else if(length > 4 && strncmp(buffer, "erase", 5) == 0) { for(uint16_t i = 0; i < MAX_RELAYS*2+1; i++) EEPROM_write_char(i, 0); - serial->write("EEPROM erased\n"); + serial->write_p(PSTR("EEPROM erased\n")); relays->count = 0; } - else if(buffer[0] == '?' || ( length > 3 && strncmp(buffer, "help", 4) == 0)) + else if(length > 3 && strncmp(buffer, "help", 4) == 0) { printHelp(serial); } else { - serial->write("Not a valid command\n"); + serial->write_p(PSTR("Not a valid command\n")); } } } @@ -240,7 +242,7 @@ void restore_relays(WirelessRelayStore* relays) { uint16_t id; EEPROM_read_string(1+i*2, (char*) &id, 2); - relays->array[i].init(&PORTB, PB5, id); + relays->array[i].init(id); } } @@ -255,12 +257,6 @@ int main() sei(); Serial serial; - /* - Pwm16b pwmA; - pwmA.setDuty(10); - pwmA.on(); - */ - Pwm8b pwmTc0( &TCCR0A, &TCCR0B, &OCR0A, &OCR0B, 0b00000011, true, true ); Pwm8b pwmTc2( &TCCR2A, &TCCR2B, &OCR2A, &OCR2B, 0b00000101, false, true ); pwmTc0.off(); @@ -268,11 +264,10 @@ int main() RgbLed rgbled( &pwmTc0, &pwmTc2 ); - WirelessRelayStore relays; relays.count=0; restore_relays(&relays); - serial.write("RGBController v0.4 starting\n"); + serial.write_p(PSTR("RGBController v0.4 starting\n")); while(true) { serialDispatch(&serial, &relays, &rgbled); diff --git a/rgbled.cpp b/rgbled.cpp index 680fb53..745f1d8 100644 --- a/rgbled.cpp +++ b/rgbled.cpp @@ -139,16 +139,16 @@ void RgbLed::patternStep() _pwmA->setDutyA(_counter >> 8); _pwmB->setDutyB(_counter >> 3); } - else if(_pattern == 4) //Sunrise + else if(_pattern == 4) { - ( _counter < 8192 ) ? _pwmA->setDutyB(_counter >> 6) : _pwmA->setDutyB( 128 + (_counter >> 11)); - if( _counter > 8192 ) ( _counter < 16384 ) ? _pwmA->setDutyA((_counter-8192) >> 6) : _pwmA->setDutyA( 128 + (_counter >> 9 )); - if( _counter > 16384 ) _pwmB->setDutyB((_counter >> 14)*20); + ( _counter < 8192 ) ? _pwmA->setDutyB(_counter >> 6) : _pwmA->setDutyB( 128 + (_counter >> 11)); + if( _counter > 1024 ) ( 8192 < _counter && _counter < 16384 ) ? _pwmA->setDutyA((_counter-8192) >> 6) : _pwmA->setDutyA( 128 + (_counter >> 9 )); + if( _counter > 8192 ) _pwmB->setDutyB(_counter >> 9); - if( _counter < 65535 ) _counter++; - //else _pwmB->setDutyB(140); + if(_counter<65530) _counter++; + else _pwmB->setDutyB(140); - //_delay_ms(18); //honey dose this make me look slow? + _delay_ms(18); //honey dose this make me look slow? } } diff --git a/serial.cpp b/serial.cpp index 3f19a03..674919d 100644 --- a/serial.cpp +++ b/serial.cpp @@ -1,26 +1,12 @@ #include "serial.h" char rxBuffer[BUFFER_SIZE]; -volatile uint32_t interruptIndex = 0; -volatile uint32_t _rxIndex = 0; - -bool stopped = false; +volatile uint16_t interruptIndex = 0; ISR (USART_RX_vect) //I have seen worse interrupt sintax { rxBuffer[interruptIndex % BUFFER_SIZE] = UDR0; - if (interruptIndex - BUFFER_SIZE > 0 && _rxIndex - BUFFER_SIZE > 0) - { - interruptIndex -= BUFFER_SIZE; - _rxIndex -= BUFFER_SIZE; - } - if(serialFlowControl && !stopped && interruptIndex - _rxIndex > BUFFER_SIZE - 64) - { - loop_until_bit_is_set(UCSR0A, UDRE0); - UDR0 = 0x13; - stopped = true; - } - if(interruptIndex - _rxIndex < BUFFER_SIZE )interruptIndex++; + interruptIndex++; } Serial::Serial() @@ -54,6 +40,14 @@ void Serial::write(const char in[]) } } +void Serial::write_p(const char *in) +{ + while (pgm_read_byte(in) != '\0') + { + + putChar(pgm_read_byte(in++)); + } +} void Serial::write(int32_t in) { @@ -83,6 +77,7 @@ void Serial::write(int32_t in) } } + bool Serial::dataIsWaiting() { return (interruptIndex > _rxIndex); @@ -90,15 +85,10 @@ bool Serial::dataIsWaiting() char Serial::getChar() { + if( _rxIndex >= (32768) - 2*BUFFER_SIZE ) flush(); //may explode only occasionaly if(dataIsWaiting()) { _rxIndex++; - if(serialFlowControl && stopped && interruptIndex - _rxIndex < 64) - { - loop_until_bit_is_set(UCSR0A, UDRE0); - UDR0 = 0x11; - stopped = false; - } return rxBuffer[(_rxIndex -1) % BUFFER_SIZE]; } else return '\0'; @@ -106,12 +96,12 @@ char Serial::getChar() unsigned int Serial::getString(char* buffer, const int bufferLength) { - unsigned int i = 0; + int i = 0; for(; i <= (interruptIndex-_rxIndex) && i <= BUFFER_SIZE && rxBuffer[(_rxIndex+i) % BUFFER_SIZE] != _terminator; i++); if( i < (interruptIndex-_rxIndex) && i > 0) { - unsigned int j = 0; + int j = 0; for(; j < i && j < bufferLength-1 ; j++) { buffer[j] = getChar(); @@ -119,8 +109,12 @@ unsigned int Serial::getString(char* buffer, const int bufferLength) buffer[j+1]='\0'; _rxIndex++; } - else i = 0; - + else + { + i = 0; + if( _rxIndex >= (32768) - 2*BUFFER_SIZE ) flush(); + } + if (rxBuffer[(_rxIndex+i) % BUFFER_SIZE] == _terminator) _rxIndex++; return i; diff --git a/serial.h b/serial.h index a1576f9..cea321c 100644 --- a/serial.h +++ b/serial.h @@ -2,27 +2,28 @@ #define SERIAL_H #define BAUD 38400 -#define BUFFER_SIZE 1024 +#define BUFFER_SIZE 128 #include #include #include #include #include +#include -const bool serialFlowControl = false; class Serial { private: char _terminator = '\n'; - + uint16_t _rxIndex=0; public: Serial(); void putChar(const char c); void write(const char* in, const unsigned int length); void write(const char in[]); + void write_p(const char in[]); void write(const int32_t in); bool dataIsWaiting(); char getChar();