From f3d030c137b9c53a829e7e1ef37e72354267a86b Mon Sep 17 00:00:00 2001 From: John Date: Sat, 17 Dec 2022 17:16:55 +0100 Subject: [PATCH] reveal enhanced device version in info cmd and add to update check, unify wait --- src/ebusd/mainloop.cpp | 15 ++++++++++++++ src/lib/ebus/device.cpp | 46 +++++++++++++++++++++++++++-------------- src/lib/ebus/device.h | 19 ++++++++++++++++- 3 files changed, 64 insertions(+), 16 deletions(-) diff --git a/src/ebusd/mainloop.cpp b/src/ebusd/mainloop.cpp index 970f21b9..2f136edb 100644 --- a/src/ebusd/mainloop.cpp +++ b/src/ebusd/mainloop.cpp @@ -365,6 +365,12 @@ void MainLoop::run() { << ",\"a\":\"other\"" #endif << ",\"u\":" << (now-start); + if (m_device->isEnhancedProto()) { + string ver = m_device->getEnhancedVersion(); + if (!ver.empty()) { + ostr << ",\"dv\":\"" << ver << "\""; + } + } if (m_reconnectCount) { ostr << ",\"rc\":" << m_reconnectCount; } @@ -1937,12 +1943,21 @@ result_t MainLoop::executeInfo(const vector& args, const string& user, o if (!m_device->isValid()) { *ostream << ", invalid"; } + bool infoAdded = false; if (verbose) { string info = m_device->getEnhancedInfos(); if (!info.empty()) { *ostream << ", " << info; + infoAdded = true; } } + if (!infoAdded) { + string info = m_device->getEnhancedVersion(); + if (!info.empty()) { + *ostream << ", firmware " << info; + } + } + *ostream << "\n"; if (!user.empty()) { *ostream << "user: " << user << "\n"; diff --git a/src/lib/ebus/device.cpp b/src/lib/ebus/device.cpp index c43c8784..5fe40ed2 100755 --- a/src/lib/ebus/device.cpp +++ b/src/lib/ebus/device.cpp @@ -184,7 +184,7 @@ bool Device::isValid() { } result_t Device::requestEnhancedInfo(symbol_t infoId) { - if (!m_enhancedProto || m_extraFatures == 0 || infoId == 0xff) { + if (!m_enhancedProto || m_extraFatures == 0) { return RESULT_ERR_INVALID_ARG; } for (unsigned int i = 0; i < 4; i++) { @@ -196,16 +196,24 @@ result_t Device::requestEnhancedInfo(symbol_t infoId) { if (m_infoId != 0xff) { return RESULT_ERR_DUPLICATE; } + if (infoId == 0xff) { + // just waited for completion + return RESULT_OK; + } + return sendEnhancedInfoRequest(infoId); +} + +result_t Device::sendEnhancedInfoRequest(symbol_t infoId) { symbol_t buf[2] = makeEnhancedSequence(ENH_REQ_INFO, infoId); #ifdef DEBUG_RAW_TRAFFIC fprintf(stdout, "raw enhanced > %2.2x %2.2x\n", buf[0], buf[1]); fflush(stdout); #endif - m_infoPos = 0; - m_infoId = infoId; if (::write(m_fd, buf, 2) != 2) { return RESULT_ERR_DEVICE; } + m_infoPos = 0; + m_infoId = infoId; return RESULT_OK; } @@ -214,7 +222,7 @@ string Device::getEnhancedInfos() { return ""; } result_t res; - if (m_enhInfoTemperature.empty()) { + if (m_enhInfoTemperature.empty()) { // use empty temperature for potential refresh after reset res = requestEnhancedInfo(0); if (res != RESULT_OK) { return "cannot request version"; @@ -244,11 +252,11 @@ string Device::getEnhancedInfos() { if (res != RESULT_OK) { return "cannot request bus voltage"; } - usleep(8*40000); - if (m_infoPos == 0) { - return "did not get info"; + res = requestEnhancedInfo(0xff); + if (res != RESULT_OK) { + m_enhInfoBusVoltage = "bus voltage unknown"; } - return m_enhInfoTemperature + ", " + m_enhInfoSupplyVoltage + ", " + m_enhInfoBusVoltage; + return "firmware " + m_enhInfoVersion + ", " + m_enhInfoTemperature + ", " + m_enhInfoSupplyVoltage + ", " + m_enhInfoBusVoltage; } result_t Device::send(symbol_t value) { @@ -644,13 +652,16 @@ bool Device::read(symbol_t* value, bool isAvailable, ArbitrationState* arbitrati m_enhInfoSupplyVoltage = ""; m_enhInfoBusVoltage = ""; m_infoId = 0xff; + m_extraFatures = data; if (m_resetRequested) { m_resetRequested = false; + if (m_extraFatures&0x01) { + sendEnhancedInfoRequest(0); // request version, ignore result + } } 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"); } @@ -670,19 +681,24 @@ bool Device::read(symbol_t* value, bool isAvailable, ArbitrationState* arbitrati case 0x0200: case 0x0500: // with firmware version and jumper info case 0x0800: // with firmware version, jumper info, and bootloader version - stream << "firmware " << static_cast(m_infoBuf[0]) << "." // version minor + stream << static_cast(m_infoBuf[0]) << "." // version minor << std::hex << static_cast(m_infoBuf[1]); // features mask if (m_infoLen >= 5) { - stream << " [" << std::setfill('0') << std::setw(2) << std::hex << static_cast(m_infoBuf[2]) + stream << "[" << std::setfill('0') << std::setw(2) << std::hex << static_cast(m_infoBuf[2]) << std::setw(2) << static_cast(m_infoBuf[3]) << "]"; - stream << ", jumpers 0x" << std::setw(2) << static_cast(m_infoBuf[4]); - stream << std::setfill(' '); // reset } if (m_infoLen >= 8) { - stream << ", bootloader " << std::dec << static_cast(m_infoBuf[5]); - stream << " [" << std::setfill('0') << std::setw(2) << std::hex << static_cast(m_infoBuf[6]) + stream << "." << std::dec << static_cast(m_infoBuf[5]); + stream << "[" << std::setfill('0') << std::setw(2) << std::hex << static_cast(m_infoBuf[6]) << std::setw(2) << static_cast(m_infoBuf[7]) << "]"; } + m_enhInfoVersion = stream.str(); + stream.str(" "); + stream << "firmware " << m_enhInfoVersion; + if (m_infoLen >= 5) { + stream << ", jumpers 0x" << std::setw(2) << static_cast(m_infoBuf[4]); + } + stream << std::setfill(' '); // reset break; case 0x0901: case 0x0802: diff --git a/src/lib/ebus/device.h b/src/lib/ebus/device.h index 33ca04e3..46c8d3a6 100755 --- a/src/lib/ebus/device.h +++ b/src/lib/ebus/device.h @@ -212,12 +212,26 @@ class Device { void setListener(DeviceListener* listener) { m_listener = listener; } /** - * Send a request for extra infos to enhanced device. + * Check for a running extra infos request, wait for it to complete, + * and then send a new request for extra infos to enhanced device. * @param infoId the ID of the info to request. * @return @a RESULT_OK on success, or an error code otherwise. */ result_t requestEnhancedInfo(symbol_t infoId); + /** + * Send a request for extra infos to enhanced device. + * @param infoId the ID of the info to request. + * @return @a RESULT_OK on success, or an error code otherwise. + */ + result_t sendEnhancedInfoRequest(symbol_t infoId); + + /** + * Get the enhanced device version. + * @return @a a string with the version infos, or empty. + */ + string getEnhancedVersion() const { return m_enhInfoVersion; } + /** * Retrieve/update all extra infos from an enhanced device. * @return @a a string with the extra infos, or empty. @@ -324,6 +338,9 @@ class Device { /** the info buffer. */ symbol_t m_infoBuf[16]; + /** a string describing the enhanced device version. */ + string m_enhInfoVersion; + /** a string describing the enhanced device temperature. */ string m_enhInfoTemperature;