diff --git a/src/system.cpp b/src/system.cpp index bff937bb3..45dd90758 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -245,9 +245,7 @@ void System::start() { } #ifndef EMSESP_FORCE_SERIAL - if (tx_mode_) { - EMSuart::start(tx_mode_); // start UART, if tx_mode is not 0 - } + EMSuart::start(tx_mode_); // start UART #endif } @@ -581,29 +579,30 @@ void System::console_commands(Shell & shell, unsigned int context) { shell.println("Use `wifi reconnect` to apply the new settings"); }); - EMSESPShell::commands - ->add_command(ShellContext::SYSTEM, - CommandFlags::ADMIN, - flash_string_vector{F_(set), F_(wifi), F_(password)}, - [](Shell & shell, const std::vector & arguments __attribute__((unused))) { - shell.enter_password(F_(new_password_prompt1), [](Shell & shell, bool completed, const std::string & password1) { - if (completed) { - shell.enter_password(F_(new_password_prompt2), [password1](Shell & shell, bool completed, const std::string & password2) { - if (completed) { - if (password1 == password2) { - EMSESP::esp8266React.getWiFiSettingsService()->updateWithoutPropagation([&](WiFiSettings & wifiSettings) { - wifiSettings.password = password2.c_str(); - return StateUpdateResult::CHANGED; - }); - shell.println("Use `wifi reconnect` to apply the new settings"); - } else { - shell.println(F("Passwords do not match")); - } - } - }); - } - }); - }); + EMSESPShell::commands->add_command(ShellContext::SYSTEM, + CommandFlags::ADMIN, + flash_string_vector{F_(set), F_(wifi), F_(password)}, + [](Shell & shell, const std::vector & arguments __attribute__((unused))) { + shell.enter_password(F_(new_password_prompt1), [](Shell & shell, bool completed, const std::string & password1) { + if (completed) { + shell.enter_password(F_(new_password_prompt2), + [password1](Shell & shell, bool completed, const std::string & password2) { + if (completed) { + if (password1 == password2) { + EMSESP::esp8266React.getWiFiSettingsService()->updateWithoutPropagation( + [&](WiFiSettings & wifiSettings) { + wifiSettings.password = password2.c_str(); + return StateUpdateResult::CHANGED; + }); + shell.println("Use `wifi reconnect` to apply the new settings"); + } else { + shell.println(F("Passwords do not match")); + } + } + }); + } + }); + }); EMSESPShell::commands->add_command(ShellContext::SYSTEM, CommandFlags::USER, diff --git a/src/telegram.cpp b/src/telegram.cpp index c9a6dc40e..002374d75 100644 --- a/src/telegram.cpp +++ b/src/telegram.cpp @@ -42,6 +42,7 @@ uint32_t EMSbus::last_bus_activity_ = 0; // timestamp of last time bool EMSbus::bus_connected_ = false; // start assuming the bus hasn't been connected uint8_t EMSbus::ems_mask_ = EMS_MASK_UNSET; // unset so its triggered when booting, the its 0x00=buderus, 0x80=junker/ht3 uint8_t EMSbus::ems_bus_id_ = EMSESP_DEFAULT_EMS_BUS_ID; +uint8_t EMSbus::tx_mode_ = EMSESP_DEFAULT_TX_MODE; uint8_t EMSbus::tx_state_ = Telegram::Operation::NONE; uuid::log::Logger EMSbus::logger_{F_(logger_name), uuid::log::Facility::CONSOLE}; @@ -255,8 +256,16 @@ void TxService::flush_tx_queue() { // start and initialize Tx void TxService::start() { - // grab the bus ID - EMSESP::emsespSettingsService.read([&](EMSESPSettings & settings) { ems_bus_id(settings.ems_bus_id); }); + // grab the bus ID and tx_mode + EMSESP::emsespSettingsService.read([&](EMSESPSettings & settings) { + ems_bus_id(settings.ems_bus_id); + tx_mode(settings.tx_mode); + }); + + // reset counters + telegram_read_count(0); + telegram_write_count(0); + telegram_fail_count(0); // send first Tx request to bus master (boiler) for its registered devices // this will be added to the queue and sent during the first tx loop() @@ -266,24 +275,32 @@ void TxService::start() { // sends a 1 byte poll which is our own device ID void TxService::send_poll() { //LOG_DEBUG(F("Ack %02X"),ems_bus_id() ^ ems_mask()); - EMSuart::send_poll(ems_bus_id() ^ ems_mask()); + if (tx_mode()) { + EMSuart::send_poll(ems_bus_id() ^ ems_mask()); + } } // Process the next telegram on the Tx queue // This is sent when we receieve a poll request void TxService::send() { // don't process if we don't have a connection to the EMS bus - // or we're in read-only mode if (!bus_connected()) { return; } // if there's nothing in the queue to transmit, send back a poll and quit + // unless tx_mode is 0 if (tx_telegrams_.empty()) { send_poll(); return; } + // if we're in read-only mode (tx_mode 0) forget the Tx call + if (tx_mode() == 0) { + tx_telegrams_.pop_front(); + return; + } + // send next telegram in the queue (which is actually a list!) send_telegram(tx_telegrams_.front()); diff --git a/src/telegram.h b/src/telegram.h index 9a375d7e0..fa19c2c5f 100644 --- a/src/telegram.h +++ b/src/telegram.h @@ -126,22 +126,10 @@ class EMSbus { public: static uuid::log::Logger logger_; - static constexpr uint8_t EMS_MASK_UNSET = 0xFF; // EMS bus type (budrus/junkers) hasn't been detected yet - static constexpr uint8_t EMS_MASK_HT3 = 0x80; // EMS bus type Junkers/HT3 - static constexpr uint8_t EMS_MASK_BUDERUS = 0xFF; // EMS bus type Buderus - - static constexpr uint8_t EMS_TX_ERROR_LIMIT = 10; // % limit of failed Tx read/write attempts before showing a warning - - static bool bus_connected() { -#ifndef EMSESP_STANDALONE - if ((uuid::get_uptime() - last_bus_activity_) > EMS_BUS_TIMEOUT) { - bus_connected_ = false; - } - return bus_connected_; -#else - return true; -#endif - } + static constexpr uint8_t EMS_MASK_UNSET = 0xFF; // EMS bus type (budrus/junkers) hasn't been detected yet + static constexpr uint8_t EMS_MASK_HT3 = 0x80; // EMS bus type Junkers/HT3 + static constexpr uint8_t EMS_MASK_BUDERUS = 0xFF; // EMS bus type Buderus + static constexpr uint8_t EMS_TX_ERROR_LIMIT = 10; // % limit of failed Tx read/write attempts before showing a warning static bool is_ht3() { return (ems_mask_ == EMS_MASK_HT3); @@ -159,6 +147,14 @@ class EMSbus { ems_mask_ = ems_mask & 0x80; // only keep the MSB (8th bit) } + static uint8_t tx_mode() { + return tx_mode_; + } + + static void tx_mode(uint8_t tx_mode) { + tx_mode_ = tx_mode; + } + static uint8_t ems_bus_id() { return ems_bus_id_; } @@ -167,6 +163,17 @@ class EMSbus { ems_bus_id_ = ems_bus_id; } + static bool bus_connected() { +#ifndef EMSESP_STANDALONE + if ((uuid::get_uptime() - last_bus_activity_) > EMS_BUS_TIMEOUT) { + bus_connected_ = false; + } + return bus_connected_; +#else + return true; +#endif + } + // sets the flag for EMS bus connected static void last_bus_activity(uint32_t timestamp) { last_bus_activity_ = timestamp; @@ -189,6 +196,7 @@ class EMSbus { static bool bus_connected_; // start assuming the bus hasn't been connected static uint8_t ems_mask_; // unset=0xFF, buderus=0x00, junkers/ht3=0x80 static uint8_t ems_bus_id_; // the bus id, which configurable and stored in settings + static uint8_t tx_mode_; // local copy of the tx mode static uint8_t tx_state_; // state of the Tx line (NONE or waiting on a TX_READ or TX_WRITE) }; @@ -350,7 +358,7 @@ class TxService : public EMSbus { private: uint8_t tx_telegram_id_ = 0; // queue counter - uint32_t last_tx_check_ = 0; + uint32_t last_tx_check_ = 0; std::deque tx_telegrams_;