programmable wireless relay store changes

This commit is contained in:
IMback
2018-10-28 21:49:08 +01:00
parent 4ae82c698c
commit 2fa8104164
5 changed files with 30 additions and 17 deletions

View File

@ -14,7 +14,7 @@ void WirelessRelay::sendId()
for(short i = 0; i<10; i++) for(short i = 0; i<10; i++)
{ {
sendBit( _id & 1 << (15 - i) ? true : false ); sendBit( _id & 1 << (15 - i) );
} }
} }

View File

@ -4,12 +4,11 @@
#include<util/delay.h> #include<util/delay.h>
#include"writepin.h" #include"writepin.h"
#define LARGE_TIME 750
#define SMALL_TIME 250
class WirelessRelay class WirelessRelay
{ {
public: public:
static const uint16_t LARGE_TIME = 750;
static const uint8_t SMALL_TIME = 250;
static const uint16_t MAX_NAME_LENGTH = 32; static const uint16_t MAX_NAME_LENGTH = 32;

View File

@ -47,5 +47,5 @@ template <class T> T EEPROM_read_class(uint16_t address)
template <class T> void EEPROM_read_class(uint16_t address, T* in) template <class T> void EEPROM_read_class(uint16_t address, T* in)
{ {
EEPROM_read_string( address, reinterpret_cast<char*>(&in), sizeof(T) ); EEPROM_read_string( address, reinterpret_cast<char*>(in), sizeof(T) );
} }

View File

@ -11,7 +11,7 @@
#include "bitrep.h" #include "bitrep.h"
#include "staticvector.h" #include "staticvector.h"
#define COMMAND_BUFFER_SIZE 32 #define COMMAND_BUFFER_SIZE 64
#define SNPRINTF_BUFFER_SIZE 64 #define SNPRINTF_BUFFER_SIZE 64
#define MAX_RELAYS 16 #define MAX_RELAYS 16
@ -26,13 +26,13 @@ inline static void printHelp(Serial* serial)
serial->write_p(PSTR("Available Commands: \n\ serial->write_p(PSTR("Available Commands: \n\
help : Show this prompt.\n\ help : Show this prompt.\n\
relay add [id] : Add Wireless Relay.\n\ relay add [id] [name] : Add Wireless Relay.\n\
relay delete : Delete last Relay.\n\ relay delete : Delete last Relay.\n\
relay list : Print list of saved Wireless Relays.\n\ relay list : Print list of saved Wireless Relays.\n\
relay machine [on/off] : Get machine readable relay state when state changes.\n\
relay [on/off] [nn] : Turn on/off nth relay.\n\ relay [on/off] [nn] : Turn on/off nth relay.\n\
state : Get machine readable state.\n\ state : Get machine readable state.\n\
erase : Erase epprom.\n\ erase : Erase epprom.\n\
dump : Dump epprom.\n\
rgb [on/off] : Turn on/off RGB leds at current value.\n\ rgb [on/off] : Turn on/off RGB leds at current value.\n\
rgb print : Print current RGB value.\n\ rgb print : Print current RGB value.\n\
rgb set [RRR] [GGG] [BBB] : Set RGB value, pattern must be 0.\n\ rgb set [RRR] [GGG] [BBB] : Set RGB value, pattern must be 0.\n\
@ -40,7 +40,7 @@ inline static void printHelp(Serial* serial)
rgb preset [id] : set preset color.\n\ rgb preset [id] : set preset color.\n\
rgb fade [on/off] : turn Colorfade on or off.\n\ rgb fade [on/off] : turn Colorfade on or off.\n\
aux [on/off] : Turn on/off PWM Channel.\n\ aux [on/off] : Turn on/off PWM Channel.\n\
aux set [VAL] : Set PWM value, pattern must be 0.\n")); aux set [VAL] : Set PWM value.\n"));
} }
void save() void save()
@ -75,7 +75,8 @@ void relayDispatch(SVector<WirelessRelay, MAX_RELAYS>* relays, Pwm16b* auxPwm, c
uint16_t id = strtol(token, nullptr, 2 ); uint16_t id = strtol(token, nullptr, 2 );
if(id != 0 && relays->remainingCapacity() > 0) if(id != 0 && relays->remainingCapacity() > 0)
{ {
token = strtok(NULL, " \n"); id = id << 4;
token = strtok(NULL, "\0");
if( token == NULL ) if( token == NULL )
{ {
char name[] = ""; char name[] = "";
@ -87,6 +88,8 @@ void relayDispatch(SVector<WirelessRelay, MAX_RELAYS>* relays, Pwm16b* auxPwm, c
WirelessRelay relay(id, token); WirelessRelay relay(id, token);
relays->push_back(relay); relays->push_back(relay);
} }
snprintf(buffer, SNPRINTF_BUFFER_SIZE, "Adding relay NUMBER: %u NAME: %s\n", relays->count()-1, relays->back().getName());
serial->write(buffer, SNPRINTF_BUFFER_SIZE);
save(); save();
} }
else if(relays->remainingCapacity() == 0) serial->write_p(PSTR("Relay storage full.\n")); else if(relays->remainingCapacity() == 0) serial->write_p(PSTR("Relay storage full.\n"));
@ -95,6 +98,8 @@ void relayDispatch(SVector<WirelessRelay, MAX_RELAYS>* relays, Pwm16b* auxPwm, c
else if( strcmp(token, "delete") == 0 ) else if( strcmp(token, "delete") == 0 )
{ {
relays->erase(relays->count()); relays->erase(relays->count());
snprintf(buffer, SNPRINTF_BUFFER_SIZE, "Deleting relay NUMBER: %u NAME: %s\n", relays->count(), relays->at(relays->count()).getName());
serial->write(buffer, SNPRINTF_BUFFER_SIZE);
save(); save();
} }
else if( strcmp(token, "list") == 0 ) else if( strcmp(token, "list") == 0 )
@ -103,15 +108,14 @@ void relayDispatch(SVector<WirelessRelay, MAX_RELAYS>* relays, Pwm16b* auxPwm, c
for(uint8_t i = 0; i < relays->count(); i++) for(uint8_t i = 0; i < relays->count(); i++)
{ {
uint16_t id = relays->at(i).getId(); uint16_t id = relays->at(i).getId();
snprintf(buffer, SNPRINTF_BUFFER_SIZE, "NUMBER: %u ID: %s%s%s%s NAME: %s\n", i, snprintf(buffer, SNPRINTF_BUFFER_SIZE, "NUMBER: %u ID: %s%s%s NAME: %s\n", i,
bit_rep[ id >> 12], bit_rep[ id >> 12],
bit_rep[(id & 0x0F00) >> 8 ], bit_rep[(id & 0x0F00) >> 8 ],
bit_rep[(id & 0x00F0) >> 4 ], bit_rep[(id & 0x00F0) >> 4 ],
bit_rep[ id & 0x000F ],
relays->at(i).getName()); relays->at(i).getName());
serial->write(buffer, SNPRINTF_BUFFER_SIZE); serial->write(buffer, SNPRINTF_BUFFER_SIZE);
} }
serial->putChar('\n'); serial->write_p(PSTR("EOL\n"));
} }
else if( strcmp(token, "on") == 0 ) else if( strcmp(token, "on") == 0 )
{ {
@ -286,10 +290,19 @@ void serialDispatch(Serial* serial, SVector<WirelessRelay, MAX_RELAYS>* relays,
} }
else if(strcmp(token, "erase") == 0) else if(strcmp(token, "erase") == 0)
{ {
for(uint16_t i = 0; i < MAX_RELAYS*2+1; i++) EEPROM_write_char(i, 0); for(uint16_t i = 0; i < sizeof(*relays)+RELAY_VECTOR_EEPROM_ADDR; i++) EEPROM_write_char(i, 0);
serial->write_p(PSTR("EEPROM erased\n")); serial->write_p(PSTR("EEPROM erased\n"));
load(); load();
} }
else if(strcmp(token, "dump") == 0)
{
for(uint16_t i = 0; i < sizeof(*relays)+RELAY_VECTOR_EEPROM_ADDR; i++)
{
if(i != 0) serial->putChar(',');
serial->write((uint16_t)EEPROM_read_char(i));
}
serial->putChar('\n');
}
else if(strcmp(token, "help") == 0) else if(strcmp(token, "help") == 0)
{ {
printHelp(serial); printHelp(serial);
@ -328,9 +341,10 @@ int main()
Pwm16b pwmTc1 ( &TCCR1A, &TCCR1B, &OCR1A, &OCR1B, &ICR1, 0b00000001, true, false); Pwm16b pwmTc1 ( &TCCR1A, &TCCR1B, &OCR1A, &OCR1B, &ICR1, 0b00000001, true, false);
serial.write_p(PSTR("RGBController v0.7 starting\n"));
load(); load();
serial.write_p(PSTR("RGBController v0.7 starting\n"));
while(true) while(true)
{ {
serialDispatch(&serial, &relays, &rgbled, &pwmTc1); serialDispatch(&serial, &relays, &rgbled, &pwmTc1);

View File

@ -32,7 +32,7 @@ public:
T back() T back()
{ {
return array[stored]; return array[stored-1];
} }
bool empty() const bool empty() const