Split train class into item and train
Use SVector to store trains
This commit is contained in:
115
train.cpp
115
train.cpp
@ -1,109 +1,10 @@
|
||||
#include "train.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
static volatile unsigned char *_port = &PORTD;
|
||||
|
||||
Train::Train(const uint8_t address, uint8_t functionmask): _address(address), _functionmask(functionmask)
|
||||
Train::Train(const uint8_t address, uint8_t functionmask): Item(address), _functionmask(functionmask)
|
||||
{
|
||||
}
|
||||
|
||||
Train::Train()
|
||||
{
|
||||
_address = 0;
|
||||
}
|
||||
|
||||
void Train::setAddress(const uint8_t address)
|
||||
{
|
||||
_address = address;
|
||||
}
|
||||
|
||||
uint8_t Train::getAddress()
|
||||
{
|
||||
return _address;
|
||||
}
|
||||
|
||||
void Train::stop()
|
||||
{
|
||||
_speed = 0;
|
||||
_function = 0;
|
||||
sendData();
|
||||
}
|
||||
|
||||
void Train::off()
|
||||
{
|
||||
writePin(_port, _pinHighA, false);
|
||||
writePin(_port, _pinHighB, false);
|
||||
writePin(_port, _pinLowA, true);
|
||||
writePin(_port, _pinLowB, true);
|
||||
}
|
||||
|
||||
void Train::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 Train::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 Train::sendAddress(uint8_t address)
|
||||
{
|
||||
for(uint8_t i = 0; i < 8; i++)
|
||||
{
|
||||
sendBit(address & (1 << i));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Train::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 Train::sendRaw(const uint16_t data)
|
||||
{
|
||||
sendRawAddr(_address, data);
|
||||
}
|
||||
|
||||
uint16_t Train::packetAddSpeed()
|
||||
{
|
||||
uint16_t packet = 0;
|
||||
@ -181,7 +82,15 @@ uint8_t Train::getSpeed()
|
||||
return _speed;
|
||||
}
|
||||
|
||||
uint16_t Train::assemblePacket()
|
||||
void Train::stop()
|
||||
{
|
||||
_speed = 0;
|
||||
_function = 0;
|
||||
sendData();
|
||||
}
|
||||
|
||||
|
||||
uint16_t Train::assembleSpeedPacket()
|
||||
{
|
||||
uint16_t packet = packetAddSpeed() | packetAddFunction(0) | packetAddDirection();
|
||||
return packet;
|
||||
@ -189,7 +98,7 @@ uint16_t Train::assemblePacket()
|
||||
|
||||
void Train::sendData()
|
||||
{
|
||||
sendRaw(assemblePacket());
|
||||
sendRaw(assembleSpeedPacket());
|
||||
if(_functionmask)
|
||||
{
|
||||
uint8_t functionToResend = (_function & 0xF0) >> 4;
|
||||
@ -208,7 +117,7 @@ void Train::sendData()
|
||||
|
||||
uint16_t Train::getLastPacket()
|
||||
{
|
||||
return assemblePacket();
|
||||
return assembleSpeedPacket();
|
||||
}
|
||||
|
||||
void Train::reverse()
|
||||
|
Reference in New Issue
Block a user