From d6278192a01ec217c13afd059d0666469c3af3fe Mon Sep 17 00:00:00 2001 From: Bernator Date: Tue, 23 Jul 2019 20:39:41 +0200 Subject: [PATCH] add timeout for TPUART reset (#23) * bugfix, print not allowed in constructor * add timeout for chip reset --- src/knx/tpuart_data_link_layer.cpp | 22 ++++++++++++++++------ src/knx/tpuart_data_link_layer.h | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/knx/tpuart_data_link_layer.cpp b/src/knx/tpuart_data_link_layer.cpp index 0715163..9804701 100644 --- a/src/knx/tpuart_data_link_layer.cpp +++ b/src/knx/tpuart_data_link_layer.cpp @@ -82,6 +82,7 @@ #define BYTE_TIMEOUT 3 //milli seconds #define CONFIRM_TIMEOUT 500 //milli seconds +#define RESET_TIMEOUT 100 //milli seconds void TpUartDataLinkLayer::loop() { @@ -369,15 +370,18 @@ bool TpUartDataLinkLayer::sendFrame(CemiFrame& frame) return true; } -void TpUartDataLinkLayer::resetChip() +bool TpUartDataLinkLayer::resetChip() { uint8_t cmd = U_RESET_REQ; _platform.writeUart(cmd); + _waitConfirmStartTime = _platform.millis(); while (true) { int resp = _platform.readUart(); if (resp == U_RESET_IND) - break; + return true; + else if (_platform.millis() - _waitConfirmStartTime > RESET_TIMEOUT) + return false; } } @@ -421,10 +425,16 @@ void TpUartDataLinkLayer::enabled(bool value) if (value && !_enabled) { _platform.setupUart(); - print("ownaddr "); - println(_deviceObject.induvidualAddress(), HEX); - resetChip(); - _enabled = true; + + if (resetChip()){ + _enabled = true; + print("ownaddr "); + println(_deviceObject.induvidualAddress(), HEX); + } + else{ + _enabled = false; + println("ERROR, TPUART not responding"); + } return; } diff --git a/src/knx/tpuart_data_link_layer.h b/src/knx/tpuart_data_link_layer.h index 6c080e5..39efd9c 100644 --- a/src/knx/tpuart_data_link_layer.h +++ b/src/knx/tpuart_data_link_layer.h @@ -56,6 +56,6 @@ class TpUartDataLinkLayer : public DataLinkLayer bool sendFrame(CemiFrame& frame); void frameBytesReceived(uint8_t* buffer, uint16_t length); void dataConBytesReceived(uint8_t* buffer, uint16_t length, bool success); - void resetChip(); + bool resetChip(); void stopChip(); };