implement single item resend

This commit is contained in:
2022-03-15 22:39:13 +01:00
parent 97aa264b54
commit 6d8baa50eb
8 changed files with 37 additions and 24 deletions

View File

@ -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);
}

6
item.h
View File

@ -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();

View File

@ -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)
{
@ -350,22 +350,31 @@ int main()
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;
}

View File

@ -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()

View File

@ -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;

View File

@ -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();

View File

@ -33,7 +33,7 @@ uint16_t Turnout::getPacket()
return data;
}
void Turnout::sendData()
void Turnout::sendData(bool single)
{
sendRaw(getPacket());
sendRaw(getPacket(), single);
}

View File

@ -18,5 +18,5 @@ public:
uint8_t getDirection();
uint8_t getSubaddress();
uint16_t getPacket();
void sendData();
void sendData(bool single = false);
};