From c309ddf5eea895471ebde8c78ec6879b235179e1 Mon Sep 17 00:00:00 2001 From: leoujz Date: Sun, 28 Jun 2020 15:19:09 +0800 Subject: [PATCH] check chip state when enabled --- src/knx/tpuart_data_link_layer.cpp | 26 ++++++++++++++++++++++++++ src/knx/tpuart_data_link_layer.h | 1 + 2 files changed, 27 insertions(+) diff --git a/src/knx/tpuart_data_link_layer.cpp b/src/knx/tpuart_data_link_layer.cpp index c68db25..fb792a7 100644 --- a/src/knx/tpuart_data_link_layer.cpp +++ b/src/knx/tpuart_data_link_layer.cpp @@ -119,6 +119,10 @@ void TpUartDataLinkLayer::loop() loadNextTxFrame(); _loopState = TX_FRAME; } + else if (!_waitConfirm) { + // if idle, state chip to check it is live or not + stateChip(); + } } break; case TX_FRAME: @@ -383,6 +387,28 @@ bool TpUartDataLinkLayer::sendFrame(CemiFrame& frame) return true; } +void TpUartDataLinkLayer::stateChip() { + // check chip state if enabled and no data received more than 10 seconds + if (_enabled && millis() - _lastByteRxTime > 10000) { + uint8_t cmd = U_STATE_REQ; + _platform.writeUart(cmd); + _waitConfirmStartTime = millis(); + while (true) + { + int resp = _platform.readUart(); + // I'm not sure about the possible values of 'resp', so any data from chip is treated to be alive + // Sometimes hardare issue would make it seems to be alive, such as Rx Tx connected. + if (resp != -1) { + break; + } + else if (millis() - _waitConfirmStartTime > RESET_TIMEOUT) { + _enabled = false; + break; + } + } + } +} + bool TpUartDataLinkLayer::resetChip() { uint8_t cmd = U_RESET_REQ; diff --git a/src/knx/tpuart_data_link_layer.h b/src/knx/tpuart_data_link_layer.h index e84bc3e..c535d8a 100644 --- a/src/knx/tpuart_data_link_layer.h +++ b/src/knx/tpuart_data_link_layer.h @@ -62,5 +62,6 @@ class TpUartDataLinkLayer : public DataLinkLayer void dataConBytesReceived(uint8_t* buffer, uint16_t length, bool success); bool resetChip(); void stopChip(); + void stateChip(); }; #endif \ No newline at end of file