Split train class into item and train

Use SVector to store trains
This commit is contained in:
2022-01-20 20:25:51 +01:00
parent 86c36f7a21
commit 0b528fbf1e
7 changed files with 285 additions and 187 deletions

93
item.cpp Normal file
View File

@ -0,0 +1,93 @@
#include "item.h"
#include <stdlib.h>
static volatile unsigned char *_port = &PORTD;
Item::Item(const uint8_t address): _address(address)
{
}
void Item::setAddress(const uint8_t address)
{
_address = address;
}
uint8_t Item::getAddress()
{
return _address;
}
void Item::off()
{
writePin(_port, _pinHighA, false);
writePin(_port, _pinHighB, false);
writePin(_port, _pinLowA, true);
writePin(_port, _pinLowB, true);
}
void Item::setOutput(const uint8_t state)
{
if(state == HIGH)
{
off();
_delay_us(3);
writePin(_port, _pinHighA, true);
writePin(_port, _pinLowB, false);
}
else if (state == LOW)
{
off();
_delay_us(3);
writePin(_port, _pinHighB, true);
writePin(_port, _pinLowA, false);
}
else
{
off();
}
}
void Item::sendBit(const bool bit)
{
if(bit)
{
setOutput(HIGH);
_delay_us(170);
setOutput(LOW);
_delay_us(25);
}
else
{
setOutput(HIGH);
_delay_us(20);
setOutput(LOW);
_delay_us(175);
}
}
void Item::sendAddress(uint8_t address)
{
for(uint8_t i = 0; i < 8; i++)
{
sendBit(address & (1 << i));
}
}
void Item::sendRawAddr(const uint16_t address, const uint16_t data)
{
for(uint8_t j = 0; j < SEND_COUNT; j++)
{
sendAddress(address);
for(uint8_t i = 0; i < 10; i++)
{
sendBit(data & (1 << i));
}
_delay_ms(1);
}
}
void Item::sendRaw(const uint16_t data)
{
sendRawAddr(_address, data);
}