1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2025-04-21 12:31:19 +02:00

change to full-duplex token ring style

This commit is contained in:
travis-farmer 2024-12-16 06:14:59 -05:00
parent 74bfb0ca6e
commit e97830542e
No known key found for this signature in database
GPG Key ID: 0BC296791D14CB35
2 changed files with 68 additions and 46 deletions

View File

@ -1,6 +1,6 @@
/*
* © 2024, Travis Farmer. All rights reserved.
* © 2024, Chris Bulliner. All rights reserved. https://github.com/CMB27
* © 2021 Chris Harlow
*
* This file is part of DCC++EX API
*
@ -47,25 +47,22 @@ void taskBuffer::doCommand(uint8_t *commandBuffer, int commandSize) {
void taskBuffer::doCommand2(uint8_t *commandBuffer, int commandSize) {
// process commands here to be sent
uint8_t crcBuffer[2];
//_serial->begin(115200);
//ArduinoPins::fastWriteDigital(bus->_txPin, HIGH);
digitalWrite(_txPin,HIGH);
if (_txPin != -1) digitalWrite(_txPin,HIGH);
serial->write(commandBuffer, 7);
serial->write(endChar, 1);
serial->flush();
digitalWrite(_txPin,LOW);
if (_txPin != -1) digitalWrite(_txPin,LOW);
}
void taskBuffer::init(unsigned long baud, int8_t txPin) {
#ifdef RS485_SERIAL
RS485_SERIAL.begin(baud, SERIAL_8N1);
new taskBuffer(&RS485_SERIAL);
#endif
void taskBuffer::init(HardwareSerial &hwSerial, unsigned long baud, int8_t txPin) {
hwSerial.begin(baud, SERIAL_8N1);
new taskBuffer(&hwSerial);
for (taskBuffer * t=first;t;t=t->next) t->_txPin = txPin;
pinMode(txPin, OUTPUT);
digitalWrite(txPin, LOW);
if (txPin != -1) pinMode(txPin, OUTPUT);
if (txPin != -1) digitalWrite(txPin, LOW);
}
void taskBuffer::loop() {
@ -132,6 +129,7 @@ void taskBuffer::parseOne(uint8_t *buf) {
uint8_t toNode = buf[0];
if (toNode != 0) return; // not for master
uint8_t fromNode = buf[1];
if (fromNode == 0) return; // why did out own data come round the ring back to us?
uint8_t opcode = buf[2];
RSproto *bus = RSproto::findBus(0);
RSprotonode *node = bus->findNode(fromNode);
@ -227,11 +225,12 @@ void taskBuffer::parseOne(uint8_t *buf) {
************************************************************/
// Constructor for RSproto
RSproto::RSproto(unsigned long baud, int8_t txPin) {
RSproto::RSproto(uint8_t busNo, HardwareSerial &serial, unsigned long baud, int8_t txPin) {
_serial = &serial;
_baud = baud;
_txPin = txPin;
_busNo = 0;
task->init(baud, txPin);
_busNo = busNo;
task->init(serial, baud, txPin);
if (_waitA < 3) _waitA = 3;
// Add device to HAL device chain
IODevice::addDevice(this);
@ -281,7 +280,8 @@ RSprotonode::RSprotonode(VPIN firstVpin, int nPins, uint8_t nodeID) {
_nodeID = nodeID;
//bus = bus->findBus(0);
//_serial = bus->_serialD;
if (_nodeID > 254) _nodeID = 254;
if (_nodeID > 252) _nodeID = 252; // cannot have a node with the frame flags
if (_nodeID < 1) _nodeID = 1; // cannot have a node with the master ID
// Add this device to HAL device list
IODevice::addDevice(this);
@ -299,8 +299,8 @@ bool RSprotonode::_configure(VPIN vpin, ConfigTypeEnum configType, int paramCoun
if (paramCount != 1) return false;
int pin = vpin - _firstVpin;
uint16_t pullup = params[0];
uint8_t outBuffer[6] = {EXIODPUP, pin, pullup};
uint8_t pullup = (uint8_t)params[0];
uint8_t outBuffer[6] = {EXIODPUP, (uint8_t)pin, pullup};
unsigned long startMillis = millis();
task->doCommand(outBuffer,3);
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now

View File

@ -1,6 +1,6 @@
/*
* © 2024, Travis Farmer. All rights reserved.
* © 2024, Chris Bulliner. All rights reserved. https://github.com/CMB27
* © 2021 Chris Harlow
*
* This file is part of DCC++EX API
*
@ -22,12 +22,14 @@
* RSproto
* =======
* To define a RSproto, example syntax:
* RSproto::create(serial, baud[, cycletime[, pin]]);
* RSproto::create(busNo, serial, baud[, pin]);
*
* busNo = the Bus no of the instance. should = 0, unless more than one bus configured for some reason.
* serial = serial port to be used (e.g. Serial3)
* baud = baud rate (9600, 19200, 28800, 57600 or 115200)
* cycletime = minimum time between successive updates/reads of a node in millisecs (default 500ms)
* pin = pin number connected to RSproto module's DE and !RE terminals for half-duplex operation (default VPIN_NONE)
* pin = pin number connected to RSproto module's DE and !RE terminals for half-duplex operation (default -1)
* if omitted (default), hardware MUST support full-duplex opperation!
*
*
* RSprotoNode
@ -37,7 +39,7 @@
*
* firstVPIN = first vpin in block allocated to this device
* numVPINs = number of vpins
* nodeID = 0-254
* nodeID = 1-252
*/
#ifndef IO_RS485_H
@ -48,12 +50,32 @@
class RSproto;
class RSprotonode;
#ifndef COMMAND_BUFFER_SIZE
#define COMMAND_BUFFER_SIZE 100
#endif
#ifndef RS485_SERIAL
#define RS485_SERIAL Serial1
#endif
/**********************************************************************
* taskBuffer class
*
* this stores the task list, and processes the data within it for
* sending. it also handles the incomming data responce.
* Data Frame:
* 0xFD : toNode : fromNode : ~data packet~ : 0xFE
* Start: TO : FROM : DATA : End
*
* Data frame must always start with the Start byte, follow with the
* destination (toNode), follow with the Source (fromNode), contain
* the data packet, and follow with the End byte.
*
*
* Data Packet:
* Command Byte : ~Command Params~
*
* Data Packet must always precede the parameters with the Command byte.
* this way the data is processed by the correct routine.
**********************************************************************/
class taskBuffer
{
private:
@ -96,7 +118,7 @@ public:
taskBuffer(Stream * myserial);
~taskBuffer();
static void doCommand(uint8_t *commandBuffer=NULL, int commandSize=0);
static void init(unsigned long baud, int8_t txPin=-1);
static void init(HardwareSerial &hwSerial, unsigned long baud, int8_t txPin=-1);
static void loop();
};
@ -259,10 +281,10 @@ private:
}
public:
static void create(unsigned long baud, int8_t txPin=-1) {
new RSproto(baud, txPin);
static void create(uint8_t busNo, HardwareSerial &serial, unsigned long baud, int8_t txPin=-1) {
new RSproto(busNo, serial, baud, txPin);
}
HardwareSerial* _serial;
int _CommMode = 0;
int _opperation = 0;
uint16_t _pullup;
@ -333,7 +355,7 @@ public:
}
protected:
RSproto(unsigned long baud, int8_t txPin);
RSproto(uint8_t busNo, HardwareSerial &serial, unsigned long baud, int8_t txPin);
public: