Files
MarklinController/train.cpp
2018-10-05 21:13:22 +02:00

117 lines
1.9 KiB
C++

#include "train.h"
static volatile unsigned char *_port = &PORTD;
Train::Train(const uint8_t address): _address(address)
{
}
Train::Train()
{
writePin(_port, _pinHigh, false);
writePin(_port, _pinLow, true);
_address = 0;
}
void Train::setAddress(const uint8_t address)
{
_address = address;
}
uint8_t Train::getAddress()
{
return _address;
}
void Train::setOutput(const uint8_t state)
{
if(state == HIGH)
{
writePin(_port, _pinLow, true);
_delay_us(5);
writePin(_port, _pinHigh, true);
}
else if (state == LOW)
{
writePin(_port, _pinHigh, false);
_delay_us(5);
writePin(_port, _pinLow, false);
}
else
{
writePin(_port, _pinHigh, false);
writePin(_port, _pinLow, true);
}
}
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()
{
for(uint8_t i = 0; i < 8; i++)
{
sendBit(_address & (1 << i));
}
}
void Train::sendData(const uint8_t data)
{
for(uint8_t j = 0; j < SEND_COUNT; j++)
{
sendAddress();
for(uint8_t i = 0; i < 5; i++)
{
sendBit(data & (1 << i));
sendBit(data & (1 << i));
}
_delay_ms(2);
}
}
void Train::setSpeed(uint8_t speed)
{
if(speed > 0) ++speed;
if(speed <= 15)
{
lastSpeed = speed;
sendData(speed << 1);
}
}
void Train::resendSpeed()
{
uint8_t data = lastSpeed;
sendData(data << 1);
}
uint8_t Train::getSpeed()
{
return lastSpeed;
}
void Train::reverse()
{
sendData(1 << 1);
}
void Train::sendFunction(const uint8_t function)
{
sendData((function << 1) | 1);
}