diff --git a/src/lib/ebus/device.cpp b/src/lib/ebus/device.cpp index 5d712042..953fb551 100755 --- a/src/lib/ebus/device.cpp +++ b/src/lib/ebus/device.cpp @@ -80,7 +80,8 @@ Device::Device(const char* name, bool checkDevice, unsigned int latency, bool re bool enhancedProto) : m_name(name), m_checkDevice(checkDevice), m_latency(HOST_LATENCY_MS+(enhancedProto?ENHANCED_LATENCY_MS:0)+latency), m_readOnly(readOnly), - m_initialSend(initialSend), m_enhancedProto(enhancedProto), m_fd(-1), m_listener(nullptr), m_arbitrationMaster(SYN), + m_initialSend(initialSend), m_enhancedProto(enhancedProto), m_fd(-1), m_resetRequested(false), + m_listener(nullptr), m_arbitrationMaster(SYN), m_arbitrationCheck(0), m_bufSize(((MAX_LEN+1+3)/4)*4), m_bufLen(0), m_bufPos(0), m_extraFatures(0), m_infoId(0xff), m_infoLen(0), m_infoPos(0) { m_buffer = reinterpret_cast(malloc(m_bufSize)); @@ -158,6 +159,7 @@ result_t Device::afterOpen() { if (m_listener != nullptr) { m_listener->notifyStatus(false, "resetting"); } + m_resetRequested = true; } else if (m_initialSend && !write(ESC)) { return RESULT_ERR_SEND; } @@ -612,6 +614,16 @@ bool Device::read(symbol_t* value, bool isAvailable, ArbitrationState* arbitrati m_arbitrationMaster = SYN; m_arbitrationCheck = 0; } + m_enhInfoTemperature = ""; + m_enhInfoSupplyVoltage = ""; + m_enhInfoBusVoltage = ""; + m_infoId = 0xff; + if (m_resetRequested) { + m_resetRequested = false; + } else { + close(); // on self-reset of device close and reopen it to have a clean startup + cancelRunningArbitration(arbitrationState); + } m_extraFatures = data; if (m_listener != nullptr) { m_listener->notifyStatus(false, (m_extraFatures&0x01) ? "reset, supports info" : "reset"); diff --git a/src/lib/ebus/device.h b/src/lib/ebus/device.h index e77312a3..1cf944aa 100755 --- a/src/lib/ebus/device.h +++ b/src/lib/ebus/device.h @@ -283,6 +283,8 @@ class Device { /** the opened file descriptor, or -1. */ int m_fd; + /** whether the reset of an enhanced device was already requested. */ + bool m_resetRequested; private: /** the @a DeviceListener, or nullptr. */