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

save current

This commit is contained in:
travis-farmer 2024-12-17 17:28:10 -05:00
parent 943eaa0484
commit f0b3f5dc16
No known key found for this signature in database
GPG Key ID: 0BC296791D14CB35
2 changed files with 63 additions and 62 deletions

View File

@ -41,19 +41,25 @@ taskBuffer::~taskBuffer()
// destructor // destructor
} }
void taskBuffer::doCommand(uint8_t *commandBuffer, int commandSize) { void taskBuffer::doCommand(char *commandBuffer, int commandSize) {
for (taskBuffer * t=first;t;t=t->next) t->doCommand2(commandBuffer,commandSize); for (taskBuffer * t=first;t;t=t->next) t->doCommand2(commandBuffer,commandSize);
} }
void taskBuffer::doCommand2(uint8_t *commandBuffer, int commandSize) { void taskBuffer::doCommand2(char *commandBuffer, int commandSize) {
// process commands here to be sent // process commands here to be sent
//_serial->begin(115200); //_serial->begin(115200);
//ArduinoPins::fastWriteDigital(bus->_txPin, HIGH); //ArduinoPins::fastWriteDigital(bus->_txPin, HIGH);
if (_txPin != -1) digitalWrite(_txPin,HIGH); //int counter = 0;
serial->write(commandBuffer, 7); //RSproto *bus = RSproto::findBus(0);
//serial->flush(); //RSprotonode *node = bus->findNode(commandSize);
if (_txPin != -1) digitalWrite(_txPin,LOW); //while (node->resFlag == 0 && counter < 5) {
if (_txPin != -1) digitalWrite(_txPin,HIGH);
serial->print(commandBuffer);
if (_txPin != -1) digitalWrite(_txPin,LOW);
//counter++;
//}
} }
void taskBuffer::init(HardwareSerial &hwSerial, unsigned long baud, int8_t txPin) { void taskBuffer::init(HardwareSerial &hwSerial, unsigned long baud, int8_t txPin) {
@ -73,7 +79,7 @@ void taskBuffer::loop2() {
while (serial->available()) { while (serial->available()) {
char ch = serial->read(); char ch = serial->read();
if (!inCommandPayload) { if (!inCommandPayload) {
if (ch == STARTBYTE) { if (ch == '<') {
inCommandPayload = PAYLOAD_NORMAL; inCommandPayload = PAYLOAD_NORMAL;
bufferLength = 0; bufferLength = 0;
buffer[0] = '\0'; buffer[0] = '\0';
@ -94,7 +100,7 @@ void taskBuffer::loop2() {
inCommandPayload++; inCommandPayload++;
} }
if (inCommandPayload == PAYLOAD_NORMAL) { if (inCommandPayload == PAYLOAD_NORMAL) {
if (ch == ENDBYTE) { if (ch == '>') {
buffer[bufferLength] = '\0'; buffer[bufferLength] = '\0';
parseRx(buffer); parseRx(buffer);
inCommandPayload = PAYLOAD_FALSE; inCommandPayload = PAYLOAD_FALSE;
@ -125,17 +131,33 @@ void taskBuffer::parseOne(uint8_t *buf) {
while (buf[0] == '<' || buf[0] == ' ') while (buf[0] == '<' || buf[0] == ' ')
buf++; // strip off any number of < or spaces buf++; // strip off any number of < or spaces
uint8_t toNode = buf[0]; char curBuff[10];
byte outArray[25];
int chrCntr = 0;
int byteCntr = 0;
for (int i = 0; i< 200; i++) {
if (buf[i] == '\n') break;
else if (buf[i] == 0x20) {
chrCntr = 0;
sscanf(curBuff, "%d", &outArray[byteCntr]);
byteCntr++;
} else {
curBuff[chrCntr] = buffer[i];
chrCntr++;
}
}
uint8_t toNode = outArray[0];
if (toNode != 0) return; // not for master if (toNode != 0) return; // not for master
uint8_t fromNode = buf[1]; uint8_t fromNode = outArray[1];
if (fromNode == 0) return; // why did out own data come round the ring back to us? if (fromNode == 0) return; // why did out own data come round the ring back to us?
uint8_t opcode = buf[2]; uint8_t opcode = outArray[2];
RSproto *bus = RSproto::findBus(0); RSproto *bus = RSproto::findBus(0);
RSprotonode *node = bus->findNode(fromNode); RSprotonode *node = bus->findNode(fromNode);
switch (opcode) { switch (opcode) {
case EXIOPINS: case EXIOPINS:
{node->_numDigitalPins = buf[3]; {node->_numDigitalPins = outArray[3];
node->_numAnaloguePins = buf[4]; node->_numAnaloguePins = outArray[4];
// See if we already have suitable buffers assigned // See if we already have suitable buffers assigned
if (node->_numDigitalPins>0) { if (node->_numDigitalPins>0) {
@ -182,15 +204,15 @@ void taskBuffer::parseOne(uint8_t *buf) {
break;} break;}
case EXIOINITA: { case EXIOINITA: {
for (int i = 3; i < node->_numAnaloguePins; i++) { for (int i = 3; i < node->_numAnaloguePins; i++) {
node->_analoguePinMap[i] = buf[i]; node->_analoguePinMap[i] = outArray[i];
} }
node->resFlag = 1; node->resFlag = 1;
break; break;
} }
case EXIOVER: { case EXIOVER: {
node->_majorVer = buf[3]; node->_majorVer = outArray[3];
node->_minorVer = buf[4]; node->_minorVer = outArray[4];
node->_patchVer = buf[5]; node->_patchVer = outArray[5];
node->resFlag = 1; node->resFlag = 1;
break; break;
} }
@ -204,14 +226,14 @@ void taskBuffer::parseOne(uint8_t *buf) {
} }
case EXIORDD: { case EXIORDD: {
for (int i = 3; i < (node->_numDigitalPins+7)/8; i++) { for (int i = 3; i < (node->_numDigitalPins+7)/8; i++) {
node->_digitalInputStates[i-3] = buf[i]; node->_digitalInputStates[i-3] = outArray[i];
} }
node->resFlag = 1; node->resFlag = 1;
break; break;
} }
case EXIORDAN: { case EXIORDAN: {
for (int i = 3; i < node->_numAnaloguePins*2; i++) { for (int i = 3; i < node->_numAnaloguePins*2; i++) {
node->_analogueInputBuffer[i-3] = buf[i]; node->_analogueInputBuffer[i-3] = outArray[i];
} }
node->resFlag = 1; node->resFlag = 1;
break; break;
@ -299,9 +321,10 @@ bool RSprotonode::_configure(VPIN vpin, ConfigTypeEnum configType, int paramCoun
int pin = vpin - _firstVpin; int pin = vpin - _firstVpin;
uint8_t pullup = (uint8_t)params[0]; uint8_t pullup = (uint8_t)params[0];
uint8_t outBuffer[] = {0xFD, _nodeID, 0, EXIODPUP, (uint8_t)pin, pullup, 0xFE}; char buff[25];
sprintf(buff, "<%i %i %i %i %i>", _nodeID, 0, EXIODPUP, pin, pullup);
unsigned long startMillis = millis(); unsigned long startMillis = millis();
task->doCommand(outBuffer,7); task->doCommand(buff,_nodeID);
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
if (resFlag != 1) { if (resFlag != 1) {
DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital input pin"), pin); DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital input pin"), pin);
@ -314,9 +337,10 @@ bool RSprotonode::_configure(VPIN vpin, ConfigTypeEnum configType, int paramCoun
int RSprotonode::_configureAnalogIn(VPIN vpin) { int RSprotonode::_configureAnalogIn(VPIN vpin) {
int pin = vpin - _firstVpin; int pin = vpin - _firstVpin;
//RSproto *mainrs = RSproto::findBus(_busNo); //RSproto *mainrs = RSproto::findBus(_busNo);
uint8_t commandBuffer[] = {0xFD, _nodeID, 0, EXIOENAN, (uint8_t) pin, 0xFE}; char buff[25];
sprintf(buff, "<%i %i %i %i %i %i>", _nodeID, 0, EXIOENAN, pin, _firstVpin);
unsigned long startMillis = millis(); unsigned long startMillis = millis();
task->doCommand(commandBuffer, 6); task->doCommand(buff, _nodeID);
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
if (resFlag != 1) { if (resFlag != 1) {
DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital input pin"), pin); DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital input pin"), pin);
@ -327,33 +351,26 @@ bool RSprotonode::_configure(VPIN vpin, ConfigTypeEnum configType, int paramCoun
} }
void RSprotonode::_begin() { void RSprotonode::_begin() {
uint8_t commandBuffer[] = {0xFD, _nodeID, 0, EXIOINIT, (uint8_t)_nPins, (uint8_t)(_firstVpin & 0xFF), (uint8_t)(_firstVpin >> 8), 0xFE}; char buff[25];
sprintf(buff, "<%i %i %i %i %i %i %i>", _nodeID, 0, EXIOINIT, _nPins, (_firstVpin & 0xFF), (_firstVpin >> 8));
unsigned long startMillis = millis(); unsigned long startMillis = millis();
task->doCommand(commandBuffer,8); task->doCommand(buff,_nodeID);
while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now
if (resFlag != 1) { if (resFlag != 1) {
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOINIT"), _nodeID); DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOINIT"), _nodeID);
} }
resFlag = 0; resFlag = 0;
commandBuffer[0] = 0xFD; sprintf(buff, "<%i %i %i>", _nodeID, 0, EXIOINITA);
commandBuffer[1] = _nodeID;
commandBuffer[2] = 0;
commandBuffer[3] = EXIOINITA;
commandBuffer[4] = 0xFE;
startMillis = millis(); startMillis = millis();
task->doCommand(commandBuffer,5); task->doCommand(buff,_nodeID);
while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now
if (resFlag != 1) { if (resFlag != 1) {
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOINITA"), _nodeID); DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOINITA"), _nodeID);
} }
resFlag = 0; resFlag = 0;
commandBuffer[0] = 0xFD; sprintf(buff, "<%i %i %i>", _nodeID, 0, EXIOVER);
commandBuffer[1] = _nodeID;
commandBuffer[2] = 0;
commandBuffer[3] = EXIOVER;
commandBuffer[4] = 0xFE;
startMillis = millis(); startMillis = millis();
task->doCommand(commandBuffer,3); task->doCommand(buff,_nodeID);
while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now
if (resFlag != 1) { if (resFlag != 1) {
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID); DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID);
@ -376,16 +393,10 @@ int RSprotonode::_read(VPIN vpin) {
void RSprotonode::_write(VPIN vpin, int value) { void RSprotonode::_write(VPIN vpin, int value) {
if (_deviceState == DEVSTATE_FAILED) return; if (_deviceState == DEVSTATE_FAILED) return;
int pin = vpin - _firstVpin; int pin = vpin - _firstVpin;
uint8_t digitalOutBuffer[7]; char buff[25];
digitalOutBuffer[0] = 0xFD; sprintf(buff, "<%i %i %i %i %i>", _nodeID, 0, EXIOWRD, pin, value);
digitalOutBuffer[1] = _nodeID;
digitalOutBuffer[2] = 0;
digitalOutBuffer[3] = EXIOWRD;
digitalOutBuffer[4] = (uint8_t) pin;
digitalOutBuffer[5] = (uint8_t) value;
digitalOutBuffer[6] = 0xFE;
unsigned long startMillis = millis(); unsigned long startMillis = millis();
task->doCommand(digitalOutBuffer,7); task->doCommand(buff,_nodeID);
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
if (resFlag != 1) { if (resFlag != 1) {
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID); DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID);
@ -407,21 +418,11 @@ void RSprotonode::_write(VPIN vpin, int value) {
} }
void RSprotonode::_writeAnalogue(VPIN vpin, int value, uint8_t profile, uint16_t duration) { void RSprotonode::_writeAnalogue(VPIN vpin, int value, uint8_t profile, uint16_t duration) {
uint8_t servoBuffer[11];
int pin = vpin - _firstVpin; int pin = vpin - _firstVpin;
servoBuffer[0] = 0xFD; char buff[25];
servoBuffer[1] = _nodeID; sprintf(buff, "<%i %i %i %i %i %i %i>", _nodeID, 0, EXIOWRAN, pin, value, profile, duration);
servoBuffer[2] = 0;
servoBuffer[3] = EXIOWRAN;
servoBuffer[4] = (uint8_t) pin;
servoBuffer[5] = (uint8_t) value & 0xFF;
servoBuffer[6] = (uint8_t) value >> 8;
servoBuffer[7] = (uint8_t) profile;
servoBuffer[8] = (uint8_t) duration & 0xFF;
servoBuffer[9] = (uint8_t) duration >> 8;
servoBuffer[10] = 0xFE;
unsigned long startMillis = millis(); unsigned long startMillis = millis();
task->doCommand(servoBuffer,11); task->doCommand(buff,_nodeID);
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
if (resFlag != 1) { if (resFlag != 1) {
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID); DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID);

View File

@ -39,7 +39,7 @@
* *
* firstVPIN = first vpin in block allocated to this device * firstVPIN = first vpin in block allocated to this device
* numVPINs = number of vpins * numVPINs = number of vpins
* nodeID = 1-252 * nodeID = 1-251
*/ */
#ifndef IO_RS485_H #ifndef IO_RS485_H
@ -111,14 +111,14 @@ static taskBuffer *first;
STARTBYTE = 0xFD, STARTBYTE = 0xFD,
ENDBYTE = 0xFE, ENDBYTE = 0xFE,
}; };
void doCommand2(uint8_t *commandBuffer=NULL, int commandSize=0); void doCommand2(char *commandBuffer, int commandSize=0);
void loop2(); void loop2();
void parseRx(uint8_t *buf); void parseRx(uint8_t *buf);
void parseOne(uint8_t *buf); void parseOne(uint8_t *buf);
public: public:
taskBuffer(Stream * myserial); taskBuffer(Stream * myserial);
~taskBuffer(); ~taskBuffer();
static void doCommand(uint8_t *commandBuffer=NULL, int commandSize=0); static void doCommand(char *commandBuffer, int commandSize=0);
static void init(HardwareSerial &hwSerial, unsigned long baud, int8_t txPin=-1); static void init(HardwareSerial &hwSerial, unsigned long baud, int8_t txPin=-1);
static void loop(); static void loop();
}; };