added periodic resending, free memory readout, rgb callibration.
This commit is contained in:
75
main.cpp
75
main.cpp
@ -9,6 +9,7 @@
|
||||
#include "rgbled.h"
|
||||
#include "eeprom.h"
|
||||
#include "bitrep.h"
|
||||
#include "watchdog.h"
|
||||
#include "staticvector.h"
|
||||
#include "W433DataReciver.h"
|
||||
|
||||
@ -22,12 +23,25 @@ char buffer[SNPRINTF_BUFFER_SIZE];
|
||||
|
||||
SVector<WirelessRelay, MAX_RELAYS> relays;
|
||||
|
||||
bool sensorsPaused = false;
|
||||
|
||||
static volatile bool resendNow = false;
|
||||
static volatile uint8_t resendCounter = 0;
|
||||
static bool resendEnabled = false;
|
||||
|
||||
ISR(PCINT1_vect)
|
||||
{
|
||||
W433DataReciver::staticInterrupt();
|
||||
}
|
||||
|
||||
bool sensorsPaused = false;
|
||||
ISR(WDT_vect)
|
||||
{
|
||||
if(++resendCounter > 225)
|
||||
{
|
||||
resendCounter = 0;
|
||||
if(resendEnabled)resendNow = true;
|
||||
}
|
||||
}
|
||||
|
||||
inline static void printHelp(Serial* serial)
|
||||
{
|
||||
@ -37,9 +51,11 @@ inline static void printHelp(Serial* serial)
|
||||
relay add [id] [name] : Add Wireless Relay.\n\
|
||||
relay delete : Delete last Relay.\n\
|
||||
relay [on/off] [nn] : Turn on/off nth relay.\n\
|
||||
relay resend [on/off] : Turn on/off periodic auto resend.\n\
|
||||
state : Get machine readable state.\n\
|
||||
erase : Erase epprom.\n\
|
||||
dump : Dump epprom.\n\
|
||||
free : show free ram.\n\
|
||||
pause : pause sensor output.\n\
|
||||
resume : resume sensor output.\n\
|
||||
rgb fade [on/off] : turn Colorfade on or off.\n\
|
||||
@ -52,8 +68,16 @@ inline static void printHelp(Serial* serial)
|
||||
aux set [VAL] : Set PWM value.\n"));
|
||||
}
|
||||
|
||||
int freeRAM()
|
||||
{
|
||||
extern int __heap_start, *__brkval;
|
||||
int v;
|
||||
return (int) &v - (__brkval == 0 ? (int) &__heap_start: (int) __brkval);
|
||||
}
|
||||
|
||||
void save()
|
||||
{
|
||||
EEPROM_write_char(4, resendEnabled);
|
||||
EEPROM_write_class< SVector<WirelessRelay, MAX_RELAYS> > (RELAY_VECTOR_EEPROM_ADDR, relays);
|
||||
}
|
||||
|
||||
@ -64,6 +88,7 @@ void loadRGB(RgbLed* rgbled)
|
||||
|
||||
void load()
|
||||
{
|
||||
resendEnabled = EEPROM_read_char(4);
|
||||
EEPROM_read_class< SVector<WirelessRelay, MAX_RELAYS> > (RELAY_VECTOR_EEPROM_ADDR, &relays);
|
||||
}
|
||||
|
||||
@ -122,16 +147,16 @@ void relayDispatch(SVector<WirelessRelay, MAX_RELAYS>* relays, Pwm16b* auxPwm, c
|
||||
char* token = strtok(NULL, " \n");
|
||||
if( token != NULL)
|
||||
{
|
||||
uint8_t selected = strtol(token, nullptr, 10);;
|
||||
uint8_t selected = strtol(token, nullptr, 10);
|
||||
if (selected < relays->count())
|
||||
{
|
||||
relays->at(selected).on();
|
||||
|
||||
writeRelayState(serial, &relays->at(selected), selected);
|
||||
}
|
||||
else serial->write(PSTR("No sutch Relay\n"));
|
||||
else serial->write_p(PSTR("No sutch Relay\n"));
|
||||
}
|
||||
else serial->write(PSTR("Usage: relay on [nn]\n"));
|
||||
else serial->write_p(PSTR("Usage: relay on [nn]\n"));
|
||||
}
|
||||
else if( strcmp(token, "off") == 0 )
|
||||
{
|
||||
@ -145,14 +170,27 @@ void relayDispatch(SVector<WirelessRelay, MAX_RELAYS>* relays, Pwm16b* auxPwm, c
|
||||
|
||||
writeRelayState(serial, &relays->at(selected), selected);
|
||||
}
|
||||
else serial->write(PSTR("No sutch Relay\n"));
|
||||
else serial->write_p(PSTR("No sutch Relay\n"));
|
||||
}
|
||||
else serial->write(PSTR("Usage: relay off [nn]\n"));
|
||||
else serial->write_p(PSTR("Usage: relay off [nn]\n"));
|
||||
}
|
||||
else if( strcmp(token, "resend") == 0 )
|
||||
{
|
||||
char* token = strtok(NULL, " \n");
|
||||
serial->write_p(PSTR("Resend every 30 min is "));
|
||||
if( token != NULL )
|
||||
{
|
||||
serial->write_p(PSTR("now "));
|
||||
if(strcmp(token, "on") == 0) resendEnabled = true;
|
||||
else resendEnabled = false;
|
||||
save();
|
||||
}
|
||||
resendEnabled ? serial->write_p(PSTR("enabled.\n")) : serial->write_p(PSTR("disabled.\n")) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
serial->write(token);
|
||||
serial->write_p(PSTR(" is not a valid subcommand: relay [add/delete/list/on/off]\n"));
|
||||
serial->write_p(PSTR(" is not a valid subcommand: relay [add/delete/on/off]\n"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -315,6 +353,12 @@ void serialDispatch(Serial* serial, SVector<WirelessRelay, MAX_RELAYS>* relays,
|
||||
}
|
||||
serial->putChar('\n');
|
||||
}
|
||||
else if(strcmp(token, "free") == 0)
|
||||
{
|
||||
serial->write_p(PSTR("Free Ram: "));
|
||||
serial->write(freeRAM());
|
||||
serial->write_p(PSTR(" Bytes.\n"));
|
||||
}
|
||||
else if(strcmp(token, "help") == 0)
|
||||
{
|
||||
printHelp(serial);
|
||||
@ -328,7 +372,7 @@ void serialDispatch(Serial* serial, SVector<WirelessRelay, MAX_RELAYS>* relays,
|
||||
}
|
||||
}
|
||||
|
||||
void temperaturePacketRecived(uint32_t data, void* userData)
|
||||
void sensorPacketRecived(uint32_t data, void* userData)
|
||||
{
|
||||
if(!sensorsPaused)
|
||||
{
|
||||
@ -353,6 +397,8 @@ void temperaturePacketRecived(uint32_t data, void* userData)
|
||||
|
||||
int main()
|
||||
{
|
||||
wdt_set(WDTO_8S);
|
||||
|
||||
DDRB = (1 << PB5) | ( 1 << PB1);
|
||||
DDRD = (1 << PD3) | (1 << PD5)| (1 << PD6);
|
||||
|
||||
@ -378,9 +424,9 @@ int main()
|
||||
|
||||
setBit(&PCICR, PCIE1, true);
|
||||
setBit(&PCMSK1, PCINT8, true);
|
||||
W433DataReciver reciver(&PINC, PC0, &TCNT1, &TIFR1, &temperaturePacketRecived, reinterpret_cast<void*>(&serial));
|
||||
W433DataReciver reciver(&PINC, PC0, &TCNT1, &TIFR1, &sensorPacketRecived, reinterpret_cast<void*>(&serial));
|
||||
|
||||
serial.write_p(PSTR("RGBController v0.9 starting\n"));
|
||||
serial.write_p(PSTR("RGBController v1.0 starting\n"));
|
||||
|
||||
load();
|
||||
|
||||
@ -422,6 +468,15 @@ int main()
|
||||
}
|
||||
}
|
||||
|
||||
if(resendNow)
|
||||
{
|
||||
for(uint16_t i = 0; i < relays.count(); i++)
|
||||
{
|
||||
relays[i].resend();
|
||||
_delay_ms(100);
|
||||
}
|
||||
resendNow = false;
|
||||
}
|
||||
_delay_ms(2);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user