From 891c46986b2dff333ba59fef48f17fa5c18b3d8e Mon Sep 17 00:00:00 2001 From: Florian Date: Thu, 10 Oct 2024 12:35:56 +0200 Subject: [PATCH] Test --- components/tc_bus/memory.cpp | 22 ---- components/tc_bus/memory.h | 30 ----- components/tc_bus/protocol.cpp | 39 ++++++- components/tc_bus/protocol.h | 20 +++- components/tc_bus/tc_bus.cpp | 179 ++++++++++++------------------ components/tc_bus/tc_bus.h | 15 +-- firmware/addons/memory-utils.yaml | 10 +- 7 files changed, 131 insertions(+), 184 deletions(-) delete mode 100644 components/tc_bus/memory.cpp delete mode 100644 components/tc_bus/memory.h diff --git a/components/tc_bus/memory.cpp b/components/tc_bus/memory.cpp deleted file mode 100644 index 89146ddb..00000000 --- a/components/tc_bus/memory.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "memory.h" -#include "esphome.h" -#include "esphome/core/helpers.h" - -namespace esphome -{ - namespace tc_bus - { - const char* setting_type_to_string(SettingType type) - { - switch (type) - { - case SETTING_RINGTONE_FLOOR_CALL: return "ringtone_floor_call"; - case SETTING_RINGTONE_DOOR_CALL: return "ringtone_door_call"; - case SETTING_RINGTONE_INTERNAL_CALL: return "ringtone_internal_call"; - case SETTING_RINGTONE_VOLUME: return "volume_ringtone"; - case SETTING_HANDSET_VOLUME: return "volume_handset"; - default: return "UNKNOWN"; - } - } - } // namespace tc_bus -} // namespace esphome \ No newline at end of file diff --git a/components/tc_bus/memory.h b/components/tc_bus/memory.h deleted file mode 100644 index 704ca6a5..00000000 --- a/components/tc_bus/memory.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "esphome/core/hal.h" - -namespace esphome -{ - namespace tc_bus - { - enum SettingType { - SETTING_RINGTONE_FLOOR_CALL, - SETTING_RINGTONE_DOOR_CALL, - SETTING_RINGTONE_INTERNAL_CALL, - SETTING_RINGTONE_VOLUME, - SETTING_HANDSET_VOLUME - }; - - struct Settings { - uint8_t handset_volume = 4; - uint8_t ringtone_volume = 4; - uint8_t door_call_ringtone = 0; - uint8_t internal_call_ringtone = 0; - uint8_t floor_call_ringtone = 0; - }; - - struct SettingCellData { - uint8_t index = 0; - bool left_nibble = false; - }; - } -} \ No newline at end of file diff --git a/components/tc_bus/protocol.cpp b/components/tc_bus/protocol.cpp index 2acbb9e9..1017e554 100644 --- a/components/tc_bus/protocol.cpp +++ b/components/tc_bus/protocol.cpp @@ -341,16 +341,23 @@ namespace esphome return data; } - Model string_to_model(std::string str) + Model string_to_model(char* str) { - if (str == "ISH_3030") return MODEL_ISH_3030; + //if (str == "ISH_3030") return MODEL_ISH_3030; return MODEL_GENERIC; } - CommandType string_to_command_type(std::string str) + SettingType string_to_setting_type(char* str) { - if (str == "DOOR_CALL") return COMMAND_TYPE_DOOR_CALL; + //if (str == "ringtone_door_call") return SETTING_RINGTONE_DOOR_CALL; + + return SETTING_RINGTONE_DOOR_CALL; + } + + CommandType string_to_command_type(char* str) + { + /*if (str == "DOOR_CALL") return COMMAND_TYPE_DOOR_CALL; if (str == "FLOOR_CALL") return COMMAND_TYPE_FLOOR_CALL; if (str == "INTERNAL_CALL") return COMMAND_TYPE_INTERNAL_CALL; if (str == "CONTROL_FUNCTION") return COMMAND_TYPE_CONTROL_FUNCTION; @@ -374,7 +381,7 @@ namespace esphome if (str == "PROGRAMMING_MODE") return COMMAND_TYPE_PROGRAMMING_MODE; if (str == "READ_MEMORY_BLOCK") return COMMAND_TYPE_READ_MEMORY_BLOCK; if (str == "SELECT_MEMORY_PAGE") return COMMAND_TYPE_SELECT_MEMORY_PAGE; - if (str == "WRITE_MEMORY") return COMMAND_TYPE_WRITE_MEMORY; + if (str == "WRITE_MEMORY") return COMMAND_TYPE_WRITE_MEMORY;*/ return COMMAND_TYPE_UNKNOWN; } @@ -412,5 +419,27 @@ namespace esphome default: return "UNKNOWN"; } } + + const char* setting_type_to_string(SettingType type) + { + switch (type) + { + case SETTING_RINGTONE_FLOOR_CALL: return "ringtone_floor_call"; + case SETTING_RINGTONE_DOOR_CALL: return "ringtone_door_call"; + case SETTING_RINGTONE_INTERNAL_CALL: return "ringtone_internal_call"; + case SETTING_VOLUME_RINGTONE: return "volume_ringtone"; + case SETTING_VOLUME_HANDSET: return "volume_handset"; + default: return "UNKNOWN"; + } + } + + const char* model_to_string(Model model) + { + switch (model) + { + case COMMAND_TYPE_ISH_3030: return "ISH_3030"; + default: return "GENERIC"; + } + } } // namespace tc_bus } // namespace esphome \ No newline at end of file diff --git a/components/tc_bus/protocol.h b/components/tc_bus/protocol.h index 0ecf5d15..16e1d1e8 100644 --- a/components/tc_bus/protocol.h +++ b/components/tc_bus/protocol.h @@ -11,6 +11,14 @@ namespace esphome MODEL_ISH_3030 }; + enum SettingType { + SETTING_RINGTONE_FLOOR_CALL, + SETTING_RINGTONE_DOOR_CALL, + SETTING_RINGTONE_INTERNAL_CALL, + SETTING_VOLUME_RINGTONE, + SETTING_VOLUME_HANDSET + }; + enum CommandType { COMMAND_TYPE_UNKNOWN, COMMAND_TYPE_DOOR_CALL, @@ -50,13 +58,23 @@ namespace esphome uint8_t length; }; + struct SettingCellData { + uint8_t index = 0; + bool left_nibble = false; + }; + + uint32_t buildCommand(CommandType type, uint8_t address = 0, uint32_t payload = 0, uint32_t serial_number = 0); CommandData parseCommand(uint32_t command); const char* command_type_to_string(CommandType type); - CommandType string_to_command_type(std::string str); + CommandType string_to_command_type(char* str); + + const char* setting_type_to_string(SettingType type); + SettingType string_to_setting_type(char* str); const char* model_to_string(Model model); + Model string_to_model(char* str); } // namespace tc_bus } // namespace esphome \ No newline at end of file diff --git a/components/tc_bus/tc_bus.cpp b/components/tc_bus/tc_bus.cpp index a1cada55..3005480c 100644 --- a/components/tc_bus/tc_bus.cpp +++ b/components/tc_bus/tc_bus.cpp @@ -1,5 +1,4 @@ #include "protocol.h" -#include "memory.h" #include "tc_bus.h" #include "esphome.h" @@ -188,8 +187,11 @@ namespace esphome reading_memory_ = false; reading_memory_timer_ = 0; - // Save Settings values - set_settings(); + ESP_LOGD(TAG, "Handset volume %i", get_setting(SETTING_VOLUME_HANDSET)); + ESP_LOGD(TAG, "Ringtone volume %i", get_setting(SETTING_VOLUME_RINGTONE)); + ESP_LOGD(TAG, "Door Call Ringtone %i", get_setting(SETTING_RINGTONE_DOOR_CALL)); + ESP_LOGD(TAG, "Floor Call Ringtone %i", get_setting(SETTING_RINGTONE_FLOOR_CALL)); + ESP_LOGD(TAG, "Internal Call Ringtone %i", get_setting(SETTING_RINGTONE_INTERNAL_CALL)); this->read_memory_complete_callback_.call(memory_buffer_); } @@ -620,15 +622,32 @@ namespace esphome send_command(COMMAND_TYPE_READ_MEMORY_BLOCK, reading_memory_count_); } - void TCBusComponent::update_setting(SettingType type, uint8_t new_value, uint32_t serial_number) + uint8_t TCBusComponent::get_setting(SettingType type) { - // No general support - if(model_ == MODEL_GENERIC) + // Get Setting Cell Data by Model + SettingCellData cellData = getSettingCellData(type); + + if(cellData.index != 0) { - ESP_LOGW(TAG, "Please specify the intercom model in order to change the settings!"); - return; + if(cellData.left_nibble) + { + return (memory_buffer_[cellData.index] >> 4) & 0xF; + } + else + { + return memory_buffer_[cellData.index] & 0xF; + } } + else + { + ESP_LOGW(TAG, "The setting %s is not available for model %s", setting_type_to_string(type), model_to_string(model_)); + return 0; + } + } + + bool TCBusComponent::update_setting(SettingType type, uint8_t new_value, uint32_t serial_number) + { if(memory_buffer_.size() == 0) { ESP_LOGW(TAG, "Memory Buffer is empty! Please read memory first!"); @@ -652,98 +671,39 @@ namespace esphome return; } - // Prepare Transmission - ESP_LOGD(TAG, "Select Indoor Stations"); - send_command(COMMAND_TYPE_SELECT_DEVICE_GROUP, 0, 0); // payload 0 = indoor stations - delay(50); - - ESP_LOGD(TAG, "Select Memory Page %i of Serial Number %i", 0, serial_number); - send_command(COMMAND_TYPE_SELECT_MEMORY_PAGE, 0, 0, serial_number); - delay(50); + uint8_t saved_nibble = 0; - uint8_t index = 0; - uint8_t cell2 = 0; - uint8_t left_nibble = 0; + // Get Setting Cell Data by Model + SettingCellData cellData = getSettingCellData(type); - // TODO: Model specific - // Merge write logic - // Set Cell number and save value depending on cell number - // Generic not supported - switch(type) + if(cellData.index != 0) { - case SETTING_RINGTONE_DOOR_CALL: - if(model_ == MODEL_ISH_3030) - { - index = 3; - cell2 = memory_buffer_[index] & 0xF; - memory_buffer_[index] = (new_value << 4) | (cell2 & 0xF); - } - settings_.door_call_ringtone = new_value; - break; - - case SETTING_RINGTONE_INTERNAL_CALL: - index = 6; - cell2 = memory_buffer_[index] & 0xF; - memory_buffer_[index] = (new_value << 4) | (cell2 & 0xF); - settings_.internal_call_ringtone = new_value; - break; - - case SETTING_RINGTONE_FLOOR_CALL: - index = 9; - cell2 = memory_buffer_[index] & 0xF; - memory_buffer_[index] = (new_value << 4) | (cell2 & 0xF); - settings_.floor_call_ringtone = new_value; - break; + // Apply new nibble and keep other nibble + saved_nibble = (cellData.left_nibble ? memory_buffer_[cellData.index] : (memory_buffer_[cellData.index] >> 4)) & 0xF; + memory_buffer_[cellData.index] = cellData.left_nibble ? ((new_value << 4) | (saved_nibble & 0xF)) : ((saved_nibble << 4) | (new_value & 0xF)); - case SETTING_RINGTONE_VOLUME: - index = 20; - cell2 = (memory_buffer_[index] >> 4) & 0xF; - memory_buffer_[index] = (cell2 << 4) | (new_value & 0xF); - settings_.ringtone_volume = new_value; - break; + // Prepare Transmission + ESP_LOGD(TAG, "Select Indoor Stations"); + send_command(COMMAND_TYPE_SELECT_DEVICE_GROUP, 0, 0); // payload 0 = indoor stations + delay(50); - case SETTING_HANDSET_VOLUME: - index = 21; - cell2 = (memory_buffer_[index] >> 4) & 0xF; - memory_buffer_[index] = (cell2 << 4) | (new_value & 0xF); - settings_.handset_volume = new_value; - break; + ESP_LOGD(TAG, "Select Memory Page %i of Serial Number %i", 0, serial_number); + send_command(COMMAND_TYPE_SELECT_MEMORY_PAGE, 0, 0, serial_number); + delay(50); - default: - ESP_LOGW(TAG, "Unknown Setting!"); - break; - } + // Transfer new settings value to memory + uint16_t new_values = (memory_buffer_[cellData.index] << 8) | memory_buffer_[cellData.index + 1]; + send_command(COMMAND_TYPE_WRITE_MEMORY, cellData.index, new_values, serial_number); - if(index == 0) - { - return; + return true; } else { - uint16_t new_values = (memory_buffer_[index] << 8) | memory_buffer_[index + 1]; - send_command(COMMAND_TYPE_WRITE_MEMORY, index, new_values, serial_number); + ESP_LOGW(TAG, "The setting %s is not available for model %s", setting_type_to_string(type), model_to_string(model_)); + return false; } } - bool TCBusComponent::applySettingValue(SettingType setting, uint8_t new_value) - { - uint8_t byte_index = 0; - bool left_nibble = false; - uint8_t saved_nibble = 0; - - // Get Setting Cell Data by Model - SettingCellData cellData = getSettingCellData(setting); - - // Apply new nibble and keep other nibble - saved_nibble = (cellData.left_nibble ? memory_buffer_[cellData.index] : (memory_buffer_[cellData.index] >> 4)) & 0xF; - memory_buffer_[cellData.index] = cellData.left_nibble ? ((new_value << 4) | (saved_nibble & 0xF)) : ((saved_nibble << 4) | (new_value & 0xF)); - - // Transfer memory buffer to settings store - set_settings(); - - return true; - } - SettingCellData TCBusComponent::getSettingCellData(SettingType setting) { SettingCellData data; @@ -753,42 +713,41 @@ namespace esphome case MODEL_ISH_3030: switch (setting) { - case SETTING_HANDSET_VOLUME: + case SETTING_RINGTONE_DOOR_CALL: data.index = 3; data.left_nibble = true; break; - default: + case SETTING_RINGTONE_INTERNAL_CALL: + data.index = 6; + data.left_nibble = true; + break; + + case SETTING_RINGTONE_FLOOR_CALL: + data.index = 9; + data.left_nibble = true; + break; + + case SETTING_VOLUME_RINGTONE: + data.index = 20; + data.left_nibble = false; break; + + case SETTING_VOLUME_HANDSET: + data.index = 21; + data.left_nibble = false; + break; + + default: break; } break; - default: - break; + default: break; } return data; } - void TCBusComponent::set_settings() - { - ESP_LOGD(TAG, "Extracting Settings from Buffer"); - - // Update Setting values to values from buffer - // TODO: Model specific - settings_.handset_volume = memory_buffer_[21] & 0xF; - settings_.ringtone_volume = memory_buffer_[20] & 0xF; - settings_.door_call_ringtone = (memory_buffer_[3] >> 4) & 0xF; - settings_.internal_call_ringtone = (memory_buffer_[6] >> 4) & 0xF; - settings_.floor_call_ringtone = (memory_buffer_[9] >> 4) & 0xF; - - ESP_LOGD(TAG, "Handset volume %i", settings_.handset_volume); - ESP_LOGD(TAG, "Ringtone volume %i", settings_.ringtone_volume); - ESP_LOGD(TAG, "Door Call Ringtone %i", settings_.door_call_ringtone); - ESP_LOGD(TAG, "Floor Call Ringtone %i", settings_.floor_call_ringtone); - ESP_LOGD(TAG, "Internal Call Ringtone %i", settings_.internal_call_ringtone); - } - void TCBusComponent::write_memory(uint32_t serial_number) { if(memory_buffer_.size() == 0) diff --git a/components/tc_bus/tc_bus.h b/components/tc_bus/tc_bus.h index cd7b4630..a024dda7 100644 --- a/components/tc_bus/tc_bus.h +++ b/components/tc_bus/tc_bus.h @@ -1,7 +1,6 @@ #pragma once #include "protocol.h" -#include "memory.h" #include #include @@ -90,25 +89,21 @@ namespace esphome void send_command(uint32_t command); void send_command(CommandType type, uint8_t address = 0, uint32_t payload = 0, uint32_t serial_number = 0); void set_programming_mode(bool enabled); + void read_memory(uint32_t serial_number); void request_memory_blocks(uint8_t start_address); - void write_memory(uint32_t serial_number = 0); - void set_settings(); - - Settings get_settings() { return settings_; }; - - void update_setting(SettingType type, uint8_t new_value, uint32_t serial_number = 0); + uint8_t get_setting(SettingType type); + bool update_setting(SettingType type, uint8_t new_value, uint32_t serial_number = 0); + SettingCellData getSettingCellData(SettingType setting); void publish_command(uint32_t command, bool fire_events); void add_received_command_callback(std::function &&callback); CallbackManager received_command_callback_{}; - void add_read_memory_complete_callback(std::function)> &&callback); CallbackManager)> read_memory_complete_callback_{}; - void add_read_memory_timeout_callback(std::function &&callback); CallbackManager read_memory_timeout_callback_{}; @@ -138,8 +133,6 @@ namespace esphome uint8_t reading_memory_count_ = 0; uint32_t reading_memory_timer_ = 0; std::vector memory_buffer_; - - Settings settings_; }; } // namespace tc_bus diff --git a/firmware/addons/memory-utils.yaml b/firmware/addons/memory-utils.yaml index 68de0efa..be218b9f 100644 --- a/firmware/addons/memory-utils.yaml +++ b/firmware/addons/memory-utils.yaml @@ -24,7 +24,7 @@ number: min_value: 0 max_value: 7 step: 1 - lambda: !lambda "return id(tc_bus_intercom)->get_settings().ringtone_volume;" + lambda: !lambda "return id(tc_bus_intercom)->get_setting(SETTING_RINGTONE_VOLUME);" update_interval: 1s set_action: - tc_bus.update_setting: @@ -38,7 +38,7 @@ number: min_value: 0 max_value: 7 step: 1 - lambda: !lambda "return id(tc_bus_intercom)->get_settings().handset_volume;" + lambda: !lambda "return id(tc_bus_intercom)->get_setting(SETTING_HANDSET_VOLUME);" update_interval: 1s set_action: - tc_bus.update_setting: @@ -52,7 +52,7 @@ number: min_value: 0 max_value: 12 step: 1 - lambda: !lambda "return id(tc_bus_intercom)->get_settings().floor_call_ringtone;" + lambda: !lambda "return id(tc_bus_intercom)->get_setting(SETTING_RINGTONE_FLOOR_CALL);" update_interval: 1s set_action: - tc_bus.update_setting: @@ -66,7 +66,7 @@ number: min_value: 0 max_value: 12 step: 1 - lambda: !lambda "return id(tc_bus_intercom)->get_settings().door_call_ringtone;" + lambda: !lambda "return id(tc_bus_intercom)->get_setting(SETTING_RINGTONE_DOOR_CALL);" update_interval: 1s set_action: - tc_bus.update_setting: @@ -80,7 +80,7 @@ number: min_value: 0 max_value: 12 step: 1 - lambda: !lambda "return id(tc_bus_intercom)->get_settings().internal_call_ringtone;" + lambda: !lambda "return id(tc_bus_intercom)->get_setting(SETTING_RINGTONE_INTERNAL_CALL);" update_interval: 1s set_action: - tc_bus.update_setting: