diff --git a/IO_RS485.cpp b/IO_RS485.cpp index f3cbfc9..f8bc4f9 100644 --- a/IO_RS485.cpp +++ b/IO_RS485.cpp @@ -154,6 +154,7 @@ if (taskCnt > 0) { } } while (micros() - startMicros <= 500 && len < 256); 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) { } else { 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); 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) { 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); 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) { 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); if (!crcGood(responseBuffer,sizeof(responseBuffer)-2)) { - DIAG(F("EX-IOExpander485 node %d CRC Error"), (int) taskData[0]); - flagOK = false; + DIAG(F("EX-IOExpander485 node %d CRC Error"), (int) taskData[0]); + flagOK = false; _deviceState = DEVSTATE_FAILED; } else { + if (!testAndStripMasterFlag(responseBuffer)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_currentNode->getNodeID()); if (responseBuffer[0] != EXIORDY) { 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()); flagOK = false; } + if (!testAndStripMasterFlag(_currentNode->_digitalInputStates)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_currentNode->getNodeID()); if (!waitReceive) _refreshOperation++; _lastDigitalRead = currentMicros; _readState = RDS_DIGITAL; @@ -360,6 +365,7 @@ if (taskCnt > 0) { DIAG(F("EX-IOExpander485 CRC error on node %d"), _currentNode->getNodeID()); flagOK = false; } + if (!testAndStripMasterFlag(_currentNode->_digitalInputStates)) DIAG(F("Forgen RS485 Device! no master flag from node %d"),_currentNode->getNodeID()); if (!waitReceive) _refreshOperation = 0; _lastAnalogueRead = currentMicros; _readState = RDS_ANALOGUE; @@ -406,7 +412,7 @@ RS485node::RS485node(VPIN firstVpin, int nPins, uint8_t nodeID) { _nPins = nPins; _busNo = 0; _nodeID = nodeID; - if (_nodeID > 255) _nodeID = 255; + if (_nodeID > 254) _nodeID = 254; // Add this device to HAL device list IODevice::addDevice(this); diff --git a/IO_RS485.h b/IO_RS485.h index e562959..b21b69e 100644 --- a/IO_RS485.h +++ b/IO_RS485.h @@ -37,7 +37,7 @@ * * firstVPIN = first vpin in block allocated to this device * numVPINs = number of vpins - * nodeID = 0-255 + * nodeID = 0-254 */ #ifndef IO_RS485_H @@ -170,7 +170,8 @@ public: len++; } } 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]; _numAnaloguePins = receiveBuffer[2]; @@ -241,6 +242,7 @@ public: } } while (micros() - startMicros <= 500 && len < 256); 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++) { _analoguePinMap[i] = receiveBuffer[i]; } @@ -267,6 +269,7 @@ public: } } while (micros() - startMicros <= 500 && len < 256); 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]; _minorVer = versionBuffer[1]; _patchVer = versionBuffer[2]; @@ -420,6 +423,11 @@ public: int8_t _txPin; int taskCnt = 0; 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[]) { taskCnt++; tasks[taskCnt][0] = nodeID;