Split train class into item and train
Use SVector to store trains
This commit is contained in:
83
main.cpp
83
main.cpp
@ -9,16 +9,15 @@
|
||||
#include "eeprom.h"
|
||||
#include "bitrep.h"
|
||||
#include "ringbuffer.h"
|
||||
#include "staticvector.h"
|
||||
|
||||
#define MAX_TRAINS 16
|
||||
#define COMMAND_BUFFER_SIZE 64
|
||||
#define SNPRINTF_BUFFER_SIZE 128
|
||||
#define EPPROM_SIZE 1024
|
||||
|
||||
char buffer[SNPRINTF_BUFFER_SIZE];
|
||||
|
||||
uint16_t storedTrains = 0;
|
||||
Train trains[MAX_TRAINS];
|
||||
SVector<Train, 16> trains;
|
||||
|
||||
bool autoff = true;
|
||||
bool powerIsOn = true;
|
||||
@ -54,9 +53,9 @@ void timer0InterruptEnable(const bool enable)
|
||||
void save_state()
|
||||
{
|
||||
cli();
|
||||
EEPROM_write_char( 0, storedTrains );
|
||||
EEPROM_write_char( 0, trains.count() );
|
||||
EEPROM_write_char( 1, autoff );
|
||||
for(uint16_t i = 0; i < storedTrains; i++)
|
||||
for(uint16_t i = 0; i < trains.count(); i++)
|
||||
{
|
||||
EEPROM_write_char( i*2+32, trains[i].getAddress());
|
||||
EEPROM_write_char( i*2+32+1, trains[i].getFunctionMask());
|
||||
@ -66,17 +65,19 @@ void save_state()
|
||||
|
||||
void restore_state()
|
||||
{
|
||||
storedTrains = EEPROM_read_char(0);
|
||||
uint8_t trainCount = EEPROM_read_char(0);
|
||||
autoff = EEPROM_read_char(1);
|
||||
if(storedTrains > MAX_TRAINS )
|
||||
|
||||
trains.clear();
|
||||
if(trainCount > trains.maxSize() )
|
||||
{
|
||||
for(uint16_t i = 0; i < EPPROM_SIZE; i++) EEPROM_write_char(i, 0);
|
||||
storedTrains = 0;
|
||||
for(uint16_t i = 0; i < EPPROM_SIZE; i++)
|
||||
EEPROM_write_char(i, 0);
|
||||
}
|
||||
else for(uint8_t i = 0; i < storedTrains; i++)
|
||||
else
|
||||
{
|
||||
trains[i].setAddress(EEPROM_read_char(32+i*2));
|
||||
trains[i].setFunctionMask(EEPROM_read_char(32+1+i*2));
|
||||
for(uint8_t i = 0; i < trainCount; i++)
|
||||
trains.push_back(Train(EEPROM_read_char(32+i*2), EEPROM_read_char(32+1+i*2)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -108,42 +109,32 @@ int trainDispatch(char* inBuffer, Serial* serial)
|
||||
uint8_t address = 0;
|
||||
if(token != NULL)
|
||||
address = strtol(token, nullptr, 10);
|
||||
if(address != 0 && storedTrains < MAX_TRAINS)
|
||||
if(address != 0 && trains.remainingCapacity() > 0)
|
||||
{
|
||||
trains[storedTrains].setAddress(address);
|
||||
|
||||
uint8_t functionMask = 0;
|
||||
|
||||
token = strtok(NULL, " ");
|
||||
if(token != NULL)
|
||||
trains[storedTrains].setFunctionMask(strtol(token, nullptr, 2 ));
|
||||
|
||||
functionMask = strtol(token, nullptr, 2);
|
||||
|
||||
trains.push_back(Train(address, functionMask));
|
||||
|
||||
uint8_t size = snprintf(buffer, SNPRINTF_BUFFER_SIZE, "TRAIN saved! NUMBER: %u ADDRESS: %u FUNCTIONS: %s FUNCTIONMASK: %s\n",
|
||||
storedTrains,
|
||||
trains.count(),
|
||||
address,
|
||||
bit_rep[trains[storedTrains].getFunctions() & 0x0F],
|
||||
bit_rep[trains[storedTrains].getFunctionMask() & 0x0F]);
|
||||
bit_rep[trains.back().getFunctions() & 0x0F],
|
||||
bit_rep[trains.back().getFunctionMask() & 0x0F]);
|
||||
serial->write(buffer, size);
|
||||
|
||||
storedTrains++;
|
||||
|
||||
save_state();
|
||||
return 0;
|
||||
}
|
||||
serial->write_p(PSTR("Usage: train add [address] [functionmask]"));
|
||||
}
|
||||
else if( strcmp(inBuffer, "delete") == 0)
|
||||
{
|
||||
serial->write_p(PSTR("Train: "));
|
||||
serial->write(storedTrains-1);
|
||||
serial->write_p(PSTR(" deleted\n"));
|
||||
storedTrains--;
|
||||
if(storedTrains < 0)
|
||||
storedTrains = 0;
|
||||
save_state();
|
||||
return 0;
|
||||
}
|
||||
else if( strcmp(inBuffer, "list") == 0 )
|
||||
{
|
||||
serial->write_p(PSTR("Trains:\n"));
|
||||
for(uint8_t i = 0; i < storedTrains; i++)
|
||||
for(uint8_t i = 0; i < trains.count(); i++)
|
||||
{
|
||||
snprintf(buffer, SNPRINTF_BUFFER_SIZE, "NUMBER: %u ID: %u CURRENT PACKET: %x SPEED: %i FUNCTIONS: %s FUNCTIONMASK: %s\n",
|
||||
i, trains[i].getAddress(),
|
||||
@ -178,7 +169,7 @@ int trainDispatch(char* inBuffer, Serial* serial)
|
||||
else
|
||||
{
|
||||
uint8_t id = strtol(inBuffer, nullptr, 10);
|
||||
if(id < storedTrains )
|
||||
if(id < trains.count() )
|
||||
{
|
||||
if(powerIsOn == false)
|
||||
{
|
||||
@ -233,7 +224,7 @@ int trainDispatch(char* inBuffer, Serial* serial)
|
||||
uint16_t i = strtol(token, nullptr, 16 );
|
||||
snprintf(buffer, SNPRINTF_BUFFER_SIZE, "SENDING: %x to %x\n", i, trains[id].getAddress());
|
||||
serial->write(buffer, strlen(buffer));
|
||||
//for(uint8_t j = 0; j < 100; j++)
|
||||
for(uint8_t j = 0; j < 100; j++)
|
||||
{
|
||||
trains[id].sendRaw(i);
|
||||
_delay_ms(20);
|
||||
@ -254,6 +245,13 @@ int trainDispatch(char* inBuffer, Serial* serial)
|
||||
trains[id].stop();
|
||||
return 0;
|
||||
}
|
||||
else if( strcmp(inBuffer, "delete") == 0)
|
||||
{
|
||||
trains.erase(id);
|
||||
serial->write_p(PSTR("Train: "));
|
||||
serial->write(id);
|
||||
serial->write_p(PSTR(" deleted\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
serial->write_p(PSTR("Not a valid command\n"));
|
||||
@ -280,7 +278,7 @@ int powerDispatch(char* token, Serial* serial)
|
||||
}
|
||||
else if( strcmp(token, "on") == 0)
|
||||
{
|
||||
for(uint16_t i = 0; i < storedTrains; i++)
|
||||
for(uint16_t i = 0; i < trains.count(); i++)
|
||||
{
|
||||
trains[i].setSpeed(0);
|
||||
}
|
||||
@ -334,7 +332,7 @@ void serialDispatch(Serial* serial)
|
||||
{
|
||||
for(uint16_t i = 0; i < EPPROM_SIZE; i++) EEPROM_write_char(i, 0);
|
||||
serial->write_p(PSTR("EEPROM erased\n"));
|
||||
storedTrains = 0;
|
||||
trains.clear();
|
||||
ret = 0;
|
||||
}
|
||||
else if(strcmp(token, "dump") == 0)
|
||||
@ -349,7 +347,7 @@ void serialDispatch(Serial* serial)
|
||||
}
|
||||
else if((strcmp(token, "stop") == 0 || strcmp(token, "s") == 0 ))
|
||||
{
|
||||
for(uint16_t i = 0; i < storedTrains; i++)
|
||||
for(uint16_t i = 0; i < trains.count(); i++)
|
||||
{
|
||||
cli();
|
||||
trains[i].stop();
|
||||
@ -426,13 +424,12 @@ int main()
|
||||
|
||||
while(true)
|
||||
{
|
||||
if(resendEvent && storedTrains > 0)
|
||||
if(resendEvent && trains.count() > 0)
|
||||
{
|
||||
//_delay_ms(100);
|
||||
timer0InterruptEnable(false);
|
||||
trains[trainToResend].sendData();
|
||||
trainToResend++;
|
||||
if(storedTrains <= trainToResend)
|
||||
if(trains.count() <= trainToResend)
|
||||
trainToResend = 0;
|
||||
resendEvent = false;
|
||||
timer0InterruptEnable(true);
|
||||
@ -441,7 +438,7 @@ int main()
|
||||
if(autoff)
|
||||
{
|
||||
bool trainsRunning = false;
|
||||
for(uint16_t i = 0; i < storedTrains; i++)
|
||||
for(uint16_t i = 0; i < trains.count(); i++)
|
||||
trainsRunning = trainsRunning || trains[i].isActive();
|
||||
if(!trainsRunning)
|
||||
{
|
||||
|
Reference in New Issue
Block a user