From 338aa1b825fdbed8f0fc8a002b78110e25458819 Mon Sep 17 00:00:00 2001 From: thewhobox <45664417+thewhobox@users.noreply.github.com> Date: Sun, 28 May 2023 12:06:55 +0200 Subject: [PATCH] fix reset chip --- src/knx/tpuart_data_link_layer.cpp | 40 ++++++++++++++++++++++-------- src/knx/tpuart_data_link_layer.h | 3 ++- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/knx/tpuart_data_link_layer.cpp b/src/knx/tpuart_data_link_layer.cpp index 1fafce5..bf28649 100644 --- a/src/knx/tpuart_data_link_layer.cpp +++ b/src/knx/tpuart_data_link_layer.cpp @@ -123,11 +123,16 @@ void TpUartDataLinkLayer::loop() { if (!_enabled) { - if (millis() - _lastResetChipTime > 1000) - { - //reset chip every 1 seconds - _lastResetChipTime = millis(); - _enabled = resetChip(); + if(_waitConfirmStartTime == 0) + { + if (millis() - _lastResetChipTime > 1000) + { + //reset chip every 1 seconds + _lastResetChipTime = millis(); + _enabled = resetChip(); + } + } else { + _enabled = resetChipTick(); } } @@ -485,17 +490,30 @@ bool TpUartDataLinkLayer::sendFrame(CemiFrame& frame) bool TpUartDataLinkLayer::resetChip() { + if(_waitConfirmStartTime > 0) return false; uint8_t cmd = U_RESET_REQ; _platform.writeUart(cmd); + + int resp = _platform.readUart(); + if (resp == U_RESET_IND) + return true; + _waitConfirmStartTime = millis(); - while (true) + return false; +} + +bool TpUartDataLinkLayer::resetChipTick() +{ + int resp = _platform.readUart(); + if (resp == U_RESET_IND) { - int resp = _platform.readUart(); - if (resp == U_RESET_IND) - return true; - else if (millis() - _waitConfirmStartTime > RESET_TIMEOUT) - return false; + _waitConfirmStartTime = 0; + return true; } + else if (millis() - _waitConfirmStartTime > RESET_TIMEOUT) + _waitConfirmStartTime = 0; + + return false; } void TpUartDataLinkLayer::stopChip() diff --git a/src/knx/tpuart_data_link_layer.h b/src/knx/tpuart_data_link_layer.h index 92332ad..9cc658b 100644 --- a/src/knx/tpuart_data_link_layer.h +++ b/src/knx/tpuart_data_link_layer.h @@ -45,7 +45,7 @@ class TpUartDataLinkLayer : public DataLinkLayer uint32_t _lastByteRxTime; uint32_t _lastByteTxTime; uint32_t _lastLoopTime; - uint32_t _waitConfirmStartTime; + uint32_t _waitConfirmStartTime = 0; uint32_t _lastResetChipTime = 0; struct _tx_queue_frame_t @@ -70,6 +70,7 @@ class TpUartDataLinkLayer : public DataLinkLayer void dataConBytesReceived(uint8_t* buffer, uint16_t length, bool success); void enterRxWaitEOP(); bool resetChip(); + bool resetChipTick(); void stopChip(); ITpUartCallBacks& _cb;