diff --git a/item.cpp b/item.cpp index 4aada35..93877a9 100644 --- a/item.cpp +++ b/item.cpp @@ -74,7 +74,7 @@ void Item::sendAddress(uint8_t address) } -void Item::sendRawAddr(const uint8_t address, const uint16_t data) +void Item::sendRawAddr(const uint8_t address, const uint16_t data, bool single) { for(uint8_t j = 0; j < SEND_COUNT; j++) { @@ -83,11 +83,13 @@ void Item::sendRawAddr(const uint8_t address, const uint16_t data) { sendBit(data & (1 << i)); } + if(single || SEND_COUNT == 1) + return; _delay_ms(1); } } -void Item::sendRaw(const uint16_t data) +void Item::sendRaw(const uint16_t data, bool single) { - sendRawAddr(_address, data); + sendRawAddr(_address, data, single); } diff --git a/item.h b/item.h index a62bcd6..d08f73e 100644 --- a/item.h +++ b/item.h @@ -18,7 +18,7 @@ private: static constexpr unsigned char _pinLowA = PD4; static constexpr unsigned char _pinHighB = PD2; static constexpr unsigned char _pinLowB = PD3; - static constexpr uint8_t SEND_COUNT = 2; + static constexpr uint8_t SEND_COUNT = 1; uint8_t _address; @@ -40,8 +40,8 @@ public: Item(const uint8_t address); - void sendRaw(const uint16_t data); - static void sendRawAddr(const uint8_t address, const uint16_t data); + void sendRaw(const uint16_t data, bool single = false); + static void sendRawAddr(const uint8_t address, const uint16_t data, bool single = false); void setAddress(const uint8_t address); uint8_t getAddress(); diff --git a/main.cpp b/main.cpp index 7b3cad2..65da1e7 100644 --- a/main.cpp +++ b/main.cpp @@ -252,7 +252,7 @@ void serialDispatch(Serial* serial) { token = strtok(NULL, " "); if(token != NULL) - ret = nfcBoard.dispatch(token, serial); + ret = nfcBoard.dispatch(token); } else if(strncmp(token, "erase", 4) == 0) { @@ -349,23 +349,32 @@ int main() Serial* serial = Serial::getInstance(); serial->write_p(PSTR("TrainController v0.5 starting\n")); + + uint8_t repeatCount = 0; while(true) { if(resendEvent && (trains.count() || turnouts.count() || signals.count())) { - timer0InterruptEnable(false); if(itemToResend < trains.count()) - trains[itemToResend].sendData(); + trains[itemToResend].sendData(true); else if(itemToResend < trains.count() + turnouts.count()) - turnouts[itemToResend-trains.count()].sendData(); + turnouts[itemToResend-trains.count()].sendData(true); else if(itemToResend < trains.count() + turnouts.count()+signals.count()) - signals[itemToResend-trains.count()-turnouts.count()].sendData(); - itemToResend++; - if(trains.count()+turnouts.count()+signals.count() <= itemToResend) - itemToResend = 0; + signals[itemToResend-trains.count()-turnouts.count()].sendData(true); resendEvent = false; - timer0InterruptEnable(true); + if(repeatCount == 0) + { + TCNT0 = 190; + repeatCount = 1; + } + else + { + itemToResend++; + if(trains.count()+turnouts.count()+signals.count() <= itemToResend) + itemToResend = 0; + repeatCount = 0; + } } if(autoff) @@ -380,7 +389,9 @@ int main() Train::setOutput(Train::OFF); } } + serialDispatch(serial); + nfcBoard.poll(serial); } return 0; } diff --git a/signal.cpp b/signal.cpp index 7387ff6..a980c37 100644 --- a/signal.cpp +++ b/signal.cpp @@ -40,9 +40,9 @@ uint16_t Signal::getPacket() return data; } -void Signal::sendData() +void Signal::sendData(bool single) { - sendRaw(getPacket()); + sendRaw(getPacket(), single); } uint8_t Signal::getType() diff --git a/train.cpp b/train.cpp index 7630a37..4633772 100644 --- a/train.cpp +++ b/train.cpp @@ -132,9 +132,9 @@ uint16_t Train::assembleSpeedPacket() return packet; } -void Train::sendData() +void Train::sendData(bool single) { - sendRaw(assembleSpeedPacket()); + sendRaw(assembleSpeedPacket(), single); if(_functionmask) { uint8_t functionToResend = (_function & 0xF0) >> 4; @@ -144,7 +144,7 @@ void Train::sendData() if(_functionmask & (1 << functionToResend)) { _delay_ms(2); - sendRaw(packetAddSpeed() | packetAddFunction(functionToResend) | packetAddFunction(0)); + sendRaw(packetAddSpeed() | packetAddFunction(functionToResend) | packetAddFunction(0), single); } _function &= ~0xF0; _function |= functionToResend << 4; diff --git a/train.h b/train.h index f5c35e6..07a7303 100644 --- a/train.h +++ b/train.h @@ -20,7 +20,7 @@ public: Train(const uint8_t address, uint8_t functionmask = 0, uint8_t quirks = 0); - void sendData(); + void sendData(bool single = false); void reverse(); void stop(); diff --git a/turnout.cpp b/turnout.cpp index f21d005..d8a87aa 100644 --- a/turnout.cpp +++ b/turnout.cpp @@ -33,7 +33,7 @@ uint16_t Turnout::getPacket() return data; } -void Turnout::sendData() +void Turnout::sendData(bool single) { - sendRaw(getPacket()); + sendRaw(getPacket(), single); } diff --git a/turnout.h b/turnout.h index 662079f..a39d45a 100644 --- a/turnout.h +++ b/turnout.h @@ -18,5 +18,5 @@ public: uint8_t getDirection(); uint8_t getSubaddress(); uint16_t getPacket(); - void sendData(); + void sendData(bool single = false); };