working with delta only
This commit is contained in:
94
main.cpp
94
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<<CS02) /*| (1<<CS00)*/; // run timer0 with /1024 scaler
|
||||
|
||||
DDRD = (1 << PD2) | (1 << PD3);
|
||||
DDRD = (1 << PD2) | (1 << PD3) | (1 << PD4) | (1 << PD5);
|
||||
|
||||
restore_state();
|
||||
|
||||
@ -294,7 +312,7 @@ int main()
|
||||
|
||||
serial.write_p(PSTR("TrainController v0.1 starting\n"));
|
||||
while(true)
|
||||
{
|
||||
{
|
||||
serialDispatch(&serial);
|
||||
}
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user