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

cleaning and debugging

This commit is contained in:
travis-farmer 2024-12-13 05:16:36 -05:00
parent 53d23770f6
commit cf833b3bb0
No known key found for this signature in database
GPG Key ID: 0BC296791D14CB35
2 changed files with 19 additions and 5 deletions

View File

@ -154,6 +154,7 @@ if (taskCnt > 0) {
} }
} while (micros() - startMicros <= 500 && len < 256); } while (micros() - startMicros <= 500 && len < 256);
if (crcGood(responseBuffer,sizeof(responseBuffer)-2)) { if (crcGood(responseBuffer,sizeof(responseBuffer)-2)) {
if (!testAndStripMasterFlag(responseBuffer)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_currentNode->getNodeID());
if (responseBuffer[0] == EXIORDY) { if (responseBuffer[0] == EXIORDY) {
} else { } else {
DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital input pin"), (int)taskData[3]); DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital input pin"), (int)taskData[3]);
@ -196,6 +197,7 @@ if (taskCnt > 0) {
} while (micros() - startMicros <= 500 && len < 256); } while (micros() - startMicros <= 500 && len < 256);
if (crcGood(responseBuffer,sizeof(responseBuffer)-2)) { if (crcGood(responseBuffer,sizeof(responseBuffer)-2)) {
if (!testAndStripMasterFlag(responseBuffer)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_currentNode->getNodeID());
if (responseBuffer[0] != EXIORDY) { if (responseBuffer[0] != EXIORDY) {
DIAG(F("EX-IOExpander485: Vpin %u on node %d cannot be used as an analogue input pin"), (int) taskData[3], (int) taskData[0]); DIAG(F("EX-IOExpander485: Vpin %u on node %d cannot be used as an analogue input pin"), (int) taskData[3], (int) taskData[0]);
} }
@ -234,6 +236,7 @@ if (taskCnt > 0) {
} }
} while (micros() - startMicros <= 500 && len < 256); } while (micros() - startMicros <= 500 && len < 256);
if (crcGood(responseBuffer,sizeof(responseBuffer)-2)) { if (crcGood(responseBuffer,sizeof(responseBuffer)-2)) {
if (!testAndStripMasterFlag(responseBuffer)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_currentNode->getNodeID());
if (responseBuffer[0] != EXIORDY) { if (responseBuffer[0] != EXIORDY) {
DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital output pin"), (int)taskData[3]); DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital output pin"), (int)taskData[3]);
} }
@ -280,10 +283,11 @@ if (taskCnt > 0) {
} }
} while (micros() - startMicros <= 500 && len < 256); } while (micros() - startMicros <= 500 && len < 256);
if (!crcGood(responseBuffer,sizeof(responseBuffer)-2)) { if (!crcGood(responseBuffer,sizeof(responseBuffer)-2)) {
DIAG(F("EX-IOExpander485 node %d CRC Error"), (int) taskData[0]); DIAG(F("EX-IOExpander485 node %d CRC Error"), (int) taskData[0]);
flagOK = false; flagOK = false;
_deviceState = DEVSTATE_FAILED; _deviceState = DEVSTATE_FAILED;
} else { } else {
if (!testAndStripMasterFlag(responseBuffer)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_currentNode->getNodeID());
if (responseBuffer[0] != EXIORDY) { if (responseBuffer[0] != EXIORDY) {
DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a servo/PWM pin"), (int) taskData[3]); DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a servo/PWM pin"), (int) taskData[3]);
} }
@ -324,6 +328,7 @@ if (taskCnt > 0) {
DIAG(F("EX-IOExpander485 CRC error on node %d"), _currentNode->getNodeID()); DIAG(F("EX-IOExpander485 CRC error on node %d"), _currentNode->getNodeID());
flagOK = false; flagOK = false;
} }
if (!testAndStripMasterFlag(_currentNode->_digitalInputStates)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_currentNode->getNodeID());
if (!waitReceive) _refreshOperation++; if (!waitReceive) _refreshOperation++;
_lastDigitalRead = currentMicros; _lastDigitalRead = currentMicros;
_readState = RDS_DIGITAL; _readState = RDS_DIGITAL;
@ -360,6 +365,7 @@ if (taskCnt > 0) {
DIAG(F("EX-IOExpander485 CRC error on node %d"), _currentNode->getNodeID()); DIAG(F("EX-IOExpander485 CRC error on node %d"), _currentNode->getNodeID());
flagOK = false; flagOK = false;
} }
if (!testAndStripMasterFlag(_currentNode->_digitalInputStates)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_currentNode->getNodeID());
if (!waitReceive) _refreshOperation = 0; if (!waitReceive) _refreshOperation = 0;
_lastAnalogueRead = currentMicros; _lastAnalogueRead = currentMicros;
_readState = RDS_ANALOGUE; _readState = RDS_ANALOGUE;
@ -406,7 +412,7 @@ RS485node::RS485node(VPIN firstVpin, int nPins, uint8_t nodeID) {
_nPins = nPins; _nPins = nPins;
_busNo = 0; _busNo = 0;
_nodeID = nodeID; _nodeID = nodeID;
if (_nodeID > 255) _nodeID = 255; if (_nodeID > 254) _nodeID = 254;
// Add this device to HAL device list // Add this device to HAL device list
IODevice::addDevice(this); IODevice::addDevice(this);

View File

@ -37,7 +37,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 = 0-255 * nodeID = 0-254
*/ */
#ifndef IO_RS485_H #ifndef IO_RS485_H
@ -170,7 +170,8 @@ public:
len++; len++;
} }
} while (micros() - startMicros <= 500 && len < 256); } while (micros() - startMicros <= 500 && len < 256);
if (receiveBuffer[0] == EXIOPINS && bus->crcGood(receiveBuffer,sizeof(receiveBuffer)-2)) { if (receiveBuffer[1] == EXIOPINS && bus->crcGood(receiveBuffer,sizeof(receiveBuffer)-2)) {
if (!bus->testAndStripMasterFlag(receiveBuffer)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_nodeID);
_numDigitalPins = receiveBuffer[1]; _numDigitalPins = receiveBuffer[1];
_numAnaloguePins = receiveBuffer[2]; _numAnaloguePins = receiveBuffer[2];
@ -241,6 +242,7 @@ public:
} }
} while (micros() - startMicros <= 500 && len < 256); } while (micros() - startMicros <= 500 && len < 256);
if (bus->crcGood(receiveBuffer,sizeof(receiveBuffer)-2)) { if (bus->crcGood(receiveBuffer,sizeof(receiveBuffer)-2)) {
if (!bus->testAndStripMasterFlag(receiveBuffer)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_nodeID);
for (int i = 0; i < _numAnaloguePins; i++) { for (int i = 0; i < _numAnaloguePins; i++) {
_analoguePinMap[i] = receiveBuffer[i]; _analoguePinMap[i] = receiveBuffer[i];
} }
@ -267,6 +269,7 @@ public:
} }
} while (micros() - startMicros <= 500 && len < 256); } while (micros() - startMicros <= 500 && len < 256);
if (bus->crcGood(versionBuffer,sizeof(versionBuffer)-2)) { if (bus->crcGood(versionBuffer,sizeof(versionBuffer)-2)) {
if (!bus->testAndStripMasterFlag(versionBuffer)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_nodeID);
_majorVer = versionBuffer[0]; _majorVer = versionBuffer[0];
_minorVer = versionBuffer[1]; _minorVer = versionBuffer[1];
_patchVer = versionBuffer[2]; _patchVer = versionBuffer[2];
@ -420,6 +423,11 @@ public:
int8_t _txPin; int8_t _txPin;
int taskCnt = 0; int taskCnt = 0;
HardwareSerial *_serialD; HardwareSerial *_serialD;
bool testAndStripMasterFlag(uint8_t *buf) {
if (buf[0] != 0xFF) return false; // why did we not get a master flag? bad node?
for (int i = 0; i < sizeof(buf)-1; i++) buf[i] = buf[i+1]; // shift array to begining
return true;
}
void addTask(int nodeID, int taskNum, int paramCnt, int *param[]) { void addTask(int nodeID, int taskNum, int paramCnt, int *param[]) {
taskCnt++; taskCnt++;
tasks[taskCnt][0] = nodeID; tasks[taskCnt][0] = nodeID;