From aed062ed8655dddb29bd85ec83ae20a74f22b852 Mon Sep 17 00:00:00 2001 From: PlxEV Date: Sun, 8 Jun 2025 15:28:49 +0100 Subject: [PATCH] Migrate serial drivers --- components/ade7758/CMakeLists.txt | 2 +- components/ade7758/src/energy_meter.c | 6 +- components/api/CMakeLists.txt | 2 +- .../meter_orno_modbus/include/orno_modbus.h | 5 + .../meter_orno_modbus/src/orno_modbus.c | 31 + .../CMakeLists.txt | 2 +- .../meter_zigbee/include/meter_zigbee.h | 26 + .../src/meter_zigbee.c} | 24 +- components/ocpp/src/ocpp.c | 4 +- components/serial_mdb/CMakeLists.txt | 9 - components/serial_mdb/include/modbus_params.h | 80 --- components/serial_mdb/include/serial_mdb.h | 39 -- components/serial_mdb/src/modbus_params.c | 20 - components/serial_mdb/src/serial_mdb copy.c | 441 --------------- components/serial_mdb/src/serial_mdb.c | 533 ------------------ components/serial_mt/include/serial_mt.h | 26 - main/main.c | 6 +- 17 files changed, 85 insertions(+), 1171 deletions(-) rename components/{serial_mt => meter_zigbee}/CMakeLists.txt (89%) create mode 100755 components/meter_zigbee/include/meter_zigbee.h rename components/{serial_mt/src/serial_mt.c => meter_zigbee/src/meter_zigbee.c} (90%) delete mode 100755 components/serial_mdb/CMakeLists.txt delete mode 100755 components/serial_mdb/include/modbus_params.h delete mode 100755 components/serial_mdb/include/serial_mdb.h delete mode 100755 components/serial_mdb/src/modbus_params.c delete mode 100755 components/serial_mdb/src/serial_mdb copy.c delete mode 100755 components/serial_mdb/src/serial_mdb.c delete mode 100755 components/serial_mt/include/serial_mt.h diff --git a/components/ade7758/CMakeLists.txt b/components/ade7758/CMakeLists.txt index e37c1c2..bd113c9 100644 --- a/components/ade7758/CMakeLists.txt +++ b/components/ade7758/CMakeLists.txt @@ -6,5 +6,5 @@ idf_component_register( INCLUDE_DIRS "include" REQUIRES - driver evse nvs_flash esp_timer serial_mdb + driver evse nvs_flash esp_timer meter_orno_modbus ) diff --git a/components/ade7758/src/energy_meter.c b/components/ade7758/src/energy_meter.c index a6449f6..070f39c 100644 --- a/components/ade7758/src/energy_meter.c +++ b/components/ade7758/src/energy_meter.c @@ -8,7 +8,7 @@ #include "nvs.h" #include "meter.h" -#include "serial_mdb.h" +#include "orno_modbus.h" #define NVS_NAMESPACE "evse_emeter" #define NVS_MODEL "model" @@ -48,7 +48,7 @@ void energy_meter_init(void) bool meter_get_state(void) { - return serial_mdb_get_meter_state(); + return orno_modbus_get_meter_state(); } esp_err_t meter_set_state(bool _state) @@ -76,7 +76,7 @@ esp_err_t meter_set_model(meter_model_t _model) model = _model; nvs_set_u8(nvs, NVS_MODEL, model); nvs_commit(nvs); - serial_mdb_set_model(model != ENERGY_METER_NONE); + orno_modbus_set_model(model != ENERGY_METER_NONE); return ESP_OK; } diff --git a/components/api/CMakeLists.txt b/components/api/CMakeLists.txt index 36d1d13..6152ad3 100755 --- a/components/api/CMakeLists.txt +++ b/components/api/CMakeLists.txt @@ -9,6 +9,6 @@ idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "include" "lib/cAT/src" PRIV_INCLUDE_DIRS "src" PRIV_REQUIRES nvs_flash app_update json driver esp_http_client esp_netif esp_wifi esp_timer esp_hw_support - REQUIRES network config evse peripherals protocols serial_mdb ocpp) + REQUIRES network config evse peripherals protocols meter_orno_modbus ocpp) set_source_files_properties(lib/cAT/src/cat.c PROPERTIES COMPILE_FLAGS -Wno-maybe-uninitialized) \ No newline at end of file diff --git a/components/meter_orno_modbus/include/orno_modbus.h b/components/meter_orno_modbus/include/orno_modbus.h index 84e7ce9..546fe3e 100755 --- a/components/meter_orno_modbus/include/orno_modbus.h +++ b/components/meter_orno_modbus/include/orno_modbus.h @@ -14,6 +14,11 @@ typedef enum { esp_err_t orno_modbus_init(void); esp_err_t orno_modbus_read_current(orno_meter_type_t type, float *current); +void orno_modbus_set_meter_test(bool state); +void orno_modbus_set_model(bool enabled); +bool orno_modbus_get_meter_state(void); +void orno_modbus_start(void); +void orno_modbus_stop(void); #ifdef __cplusplus } diff --git a/components/meter_orno_modbus/src/orno_modbus.c b/components/meter_orno_modbus/src/orno_modbus.c index 4d7d85d..29b34aa 100755 --- a/components/meter_orno_modbus/src/orno_modbus.c +++ b/components/meter_orno_modbus/src/orno_modbus.c @@ -1,7 +1,11 @@ #include "orno_modbus.h" +#include #include "esp_log.h" static const char *TAG = "orno_modbus"; +static bool meter_state = false; +static bool meter_test = false; +static bool model_enabled = false; esp_err_t orno_modbus_init(void) { @@ -19,3 +23,30 @@ esp_err_t orno_modbus_read_current(orno_meter_type_t type, float *current) ESP_LOGD(TAG, "Read current type %d -> %f", type, *current); return ESP_OK; } + +void orno_modbus_set_meter_test(bool state) +{ + meter_test = state; +} + +void orno_modbus_set_model(bool enabled) +{ + model_enabled = enabled; +} + +bool orno_modbus_get_meter_state(void) +{ + return meter_state; +} + +void orno_modbus_start(void) +{ + ESP_LOGI(TAG, "Starting ORNO Modbus driver"); + meter_state = true; +} + +void orno_modbus_stop(void) +{ + ESP_LOGI(TAG, "Stopping ORNO Modbus driver"); + meter_state = false; +} diff --git a/components/serial_mt/CMakeLists.txt b/components/meter_zigbee/CMakeLists.txt similarity index 89% rename from components/serial_mt/CMakeLists.txt rename to components/meter_zigbee/CMakeLists.txt index 2297059..a9de290 100755 --- a/components/serial_mt/CMakeLists.txt +++ b/components/meter_zigbee/CMakeLists.txt @@ -1,5 +1,5 @@ set(srcs - "src/serial_mt.c" + "src/meter_zigbee.c" ) idf_component_register(SRCS "${srcs}" diff --git a/components/meter_zigbee/include/meter_zigbee.h b/components/meter_zigbee/include/meter_zigbee.h new file mode 100755 index 0000000..5150212 --- /dev/null +++ b/components/meter_zigbee/include/meter_zigbee.h @@ -0,0 +1,26 @@ +#ifndef METER_ZIGBEE_H_ +#define METER_ZIGBEE_H_ + +#include "driver/uart.h" + +/** + * @brief Send Data + * + */ +int meter_zigbee_send_data(const char *data); + + +/** + * @brief Start serial MT + * + */ +void meter_zigbee_start(); + + +/** + * @brief Stop serial MT + * + */ +void meter_zigbee_stop(void); + +#endif /* METER_ZIGBEE_H_ */ diff --git a/components/serial_mt/src/serial_mt.c b/components/meter_zigbee/src/meter_zigbee.c similarity index 90% rename from components/serial_mt/src/serial_mt.c rename to components/meter_zigbee/src/meter_zigbee.c index 19e5750..3c07412 100755 --- a/components/serial_mt/src/serial_mt.c +++ b/components/meter_zigbee/src/meter_zigbee.c @@ -6,7 +6,7 @@ #include "driver/uart.h" #include "string.h" #include "driver/gpio.h" -#include "serial_mt.h" +#include "meter_zigbee.h" #include "evse_api.h" #include "loadbalancer.h" #include "meter.h" @@ -24,17 +24,17 @@ // static uint8_t msg[128]; -static const char *TAG = "serial_mt"; +static const char *TAG = "meter_zigbee"; static uart_port_t port = -1; -static TaskHandle_t serial_mt_task = NULL; +static TaskHandle_t meter_zigbee_task = NULL; static const int RX_BUF_SIZE = 14; -static void serial_mt_task_func(void *param) +static void meter_zigbee_task_func(void *param) { - ESP_LOGI(TAG, "serial_mt_task_func"); + ESP_LOGI(TAG, "meter_zigbee_task_func"); uint8_t *buff = (uint8_t *)malloc(RX_BUF_SIZE + 1); @@ -119,7 +119,7 @@ static void serial_mt_task_func(void *param) free(buff); } -int sendData(const char *data) +int meter_zigbee_send_data(const char *data) { const int len = strlen(data); const int txBytes = uart_write_bytes(UART_NUM_1, data, len); @@ -127,7 +127,7 @@ int sendData(const char *data) return txBytes; } -void serial_mt_start() +void meter_zigbee_start() { ESP_LOGI(TAG, "Starting MT Serial"); @@ -156,17 +156,17 @@ void serial_mt_start() ESP_ERROR_CHECK(uart_set_pin(UART_NUM_1, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); // xTaskCreate(rx_task, "uart_rx_task", 1024 * 4, NULL, configMAX_PRIORITIES, NULL); - xTaskCreate(serial_mt_task_func, "serial_mt_task", 4 * 1024, NULL, 5, &serial_mt_task); + xTaskCreate(meter_zigbee_task_func, "meter_zigbee_task", 4 * 1024, NULL, 5, &meter_zigbee_task); } -void serial_mt_stop(void) +void meter_zigbee_stop(void) { ESP_LOGI(TAG, "Stopping"); - if (serial_mt_task) + if (meter_zigbee_task) { - vTaskDelete(serial_mt_task); - serial_mt_task = NULL; + vTaskDelete(meter_zigbee_task); + meter_zigbee_task = NULL; } if (port != -1) diff --git a/components/ocpp/src/ocpp.c b/components/ocpp/src/ocpp.c index 3a058b3..062f100 100755 --- a/components/ocpp/src/ocpp.c +++ b/components/ocpp/src/ocpp.c @@ -7,7 +7,7 @@ #include "esp_wifi.h" #include "meter.h" -#include "serial_mdb.h" +#include "orno_modbus.h" #include "nvs.h" /* MicroOcpp includes */ @@ -218,7 +218,7 @@ float setTemperatureInput() float setPowerInput() { ESP_LOGI(TAG, "PowerInput"); - // return (float)serial_mdb_get_meter_data().activepower; + // return (float)orno_modbus_get_meter_state().activepower; return meter_getData().wattA + meter_getData().wattB + meter_getData().wattC; } diff --git a/components/serial_mdb/CMakeLists.txt b/components/serial_mdb/CMakeLists.txt deleted file mode 100755 index 0175e94..0000000 --- a/components/serial_mdb/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -set(srcs - "src/modbus_params.c" - "src/serial_mdb.c" - ) - -idf_component_register(SRCS "${srcs}" - INCLUDE_DIRS "include" - PRIV_REQUIRES nvs_flash driver - REQUIRES config evse peripherals esp-modbus loadbalancer) diff --git a/components/serial_mdb/include/modbus_params.h b/components/serial_mdb/include/modbus_params.h deleted file mode 100755 index ce9e6e6..0000000 --- a/components/serial_mdb/include/modbus_params.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/*===================================================================================== - * Description: - * The Modbus parameter structures used to define Modbus instances that - * can be addressed by Modbus protocol. Define these structures per your needs in - * your application. Below is just an example of possible parameters. - *====================================================================================*/ -#ifndef _DEVICE_PARAMS -#define _DEVICE_PARAMS - -#include - -// This file defines structure of modbus parameters which reflect correspond modbus address space -// for each modbus register type (coils, discreet inputs, holding registers, input registers) -#pragma pack(push, 1) -typedef struct -{ - uint8_t discrete_input0:1; - uint8_t discrete_input1:1; - uint8_t discrete_input2:1; - uint8_t discrete_input3:1; - uint8_t discrete_input4:1; - uint8_t discrete_input5:1; - uint8_t discrete_input6:1; - uint8_t discrete_input7:1; - uint8_t discrete_input_port1; - uint8_t discrete_input_port2; -} discrete_reg_params_t; -#pragma pack(pop) - -#pragma pack(push, 1) -typedef struct -{ - uint8_t coils_port0; - uint8_t coils_port1; - uint8_t coils_port2; -} coil_reg_params_t; -#pragma pack(pop) - -#pragma pack(push, 1) -typedef struct -{ - float input_data0; // 0 - float input_data1; // 2 - float input_data2; // 4 - float input_data3; // 6 - uint16_t data[150]; // 8 + 150 = 158 - float input_data4; // 158 - float input_data5; - float input_data6; - float input_data7; - uint16_t data_block1[150]; -} input_reg_params_t; -#pragma pack(pop) - -#pragma pack(push, 1) -typedef struct -{ - uint32_t holding_data0; - uint32_t holding_data1; - uint32_t holding_data2; - uint32_t holding_data3; - uint32_t holding_data4; - uint32_t holding_data5; - uint32_t holding_data6; - uint32_t holding_data7; -} holding_reg_params_t; -#pragma pack(pop) - -extern holding_reg_params_t holding_reg_params; -extern input_reg_params_t input_reg_params; -extern coil_reg_params_t coil_reg_params; -extern discrete_reg_params_t discrete_reg_params; - -#endif // !defined(_DEVICE_PARAMS) diff --git a/components/serial_mdb/include/serial_mdb.h b/components/serial_mdb/include/serial_mdb.h deleted file mode 100755 index 920fc76..0000000 --- a/components/serial_mdb/include/serial_mdb.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef SERIAL_MDB_H_ -#define SERIAL_MDB_H_ - -#include "driver/uart.h" - - -/** - * @brief Set meter test - * - */ -void serial_mdb_set_meter_test(bool _state); - - -/** - * @brief Set meter model - * - */ -void serial_mdb_set_model(bool _enabled); - - -/** - * @brief Get meter state - * - */ -bool serial_mdb_get_meter_state(); - -/** - * @brief Start serial MDB - * - */ -void serial_mdb_start(); - -/** - * @brief Stop serial MDB - * - */ -void serial_mdb_stop(void); - -#endif /* SERIAL_MDB_H_ */ diff --git a/components/serial_mdb/src/modbus_params.c b/components/serial_mdb/src/modbus_params.c deleted file mode 100755 index fb5a0e4..0000000 --- a/components/serial_mdb/src/modbus_params.c +++ /dev/null @@ -1,20 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ -/*===================================================================================== - * Description: - * C file to define parameter storage instances - *====================================================================================*/ -#include "modbus_params.h" - -// Here are the user defined instances for device parameters packed by 1 byte -// These are keep the values that can be accessed from Modbus master -holding_reg_params_t holding_reg_params = { 0 }; - -input_reg_params_t input_reg_params = { 0 }; - -coil_reg_params_t coil_reg_params = { 0 }; - -discrete_reg_params_t discrete_reg_params = { 0 }; diff --git a/components/serial_mdb/src/serial_mdb copy.c b/components/serial_mdb/src/serial_mdb copy.c deleted file mode 100755 index b92ad88..0000000 --- a/components/serial_mdb/src/serial_mdb copy.c +++ /dev/null @@ -1,441 +0,0 @@ -#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE -#include "esp_log.h" - -#include "serial_mdb.h" -#include "modbus_params.h" // for modbus parameters structures -#include "mbcontroller.h" -#include "sdkconfig.h" -#include "evse_api.h" -#include "loadbalancer.h" -#include "meter.h" - -#define TXD_PIN (GPIO_NUM_17) -#define RXD_PIN (GPIO_NUM_16) - -static const char *TAG = "serial_mdb"; - -static bool enabled = false; -static bool meterState = false; -static bool meterTest = false; - -static TaskHandle_t serial_mdb_task = NULL; - -#define MB_PORT_NUM 2 //(CONFIG_MB_UART_PORT_NUM) // Number of UART port used for Modbus connection -#define MB_DEV_SPEED 9600 //(CONFIG_MB_UART_BAUD_RATE) // The communication speed of the UART -// #define MB_PARITY_EVEN - -#define MB_UART_TXD 17 -#define MB_UART_RXD 16 -#define MB_UART_RTS 5 - -// Note: Some pins on target chip cannot be assigned for UART communication. -// See UART documentation for selected board and target to configure pins using Kconfig. - -// The number of parameters that intended to be used in the particular control process -#define MASTER_MAX_CIDS num_device_parameters - -// Number of reading of parameters from slave -#define MASTER_MAX_RETRY 30 - -// Timeout to update cid over Modbus -#define UPDATE_CIDS_TIMEOUT_MS (5000) -#define UPDATE_CIDS_TIMEOUT_TICS (UPDATE_CIDS_TIMEOUT_MS / portTICK_PERIOD_MS) - -// Timeout between polls -#define POLL_TIMEOUT_MS (1) -#define POLL_TIMEOUT_TICS (POLL_TIMEOUT_MS / portTICK_PERIOD_MS) - -// Timeout between erros -#define ERROR_TIMEOUT_MS (30000) -#define ERROR_TIMEOUT_TICS (ERROR_TIMEOUT_MS / portTICK_PERIOD_MS) - -// The macro to get offset for parameter in the appropriate structure -#define HOLD_OFFSET(field) ((uint16_t)(offsetof(holding_reg_params_t, field) + 1)) -#define INPUT_OFFSET(field) ((uint16_t)(offsetof(input_reg_params_t, field) + 1)) -#define COIL_OFFSET(field) ((uint16_t)(offsetof(coil_reg_params_t, field) + 1)) -// Discrete offset macro -#define DISCR_OFFSET(field) ((uint16_t)(offsetof(discrete_reg_params_t, field) + 1)) - -#define STR(fieldname) ((const char *)(fieldname)) -// Options can be used as bit masks or parameter limits -#define OPTS(min_val, max_val, step_val) \ - { \ - .opt1 = min_val, .opt2 = max_val, .opt3 = step_val} - -// Enumeration of modbus device addresses accessed by master device -enum -{ - MB_DEVICE_ADDR1 = 1 // Only one slave device used for the test (add other slave addresses here) -}; - -// Enumeration of all supported CIDs for device (used in parameter definition table) -enum -{ - CID_HOLD_DATA_0 = 0, - CID_HOLD_DATA_1 = 1, - CID_HOLD_DATA_2 = 2, - CID_HOLD_DATA_3 = 3, - CID_HOLD_DATA_4 = 4, - CID_HOLD_DATA_5 = 5, - CID_HOLD_DATA_6 = 6 -}; - -#define SN 0x01 -#define METERID 0x02 - -#define L1VOLTAGE 0x000E -#define L2VOLTAGE 0x0010 -#define L3VOLTAGE 0x0012 - -#define L1CURRENT 0x0016 -#define L2CURRENT 0x0018 -#define L3CURRENT 0x001A - -#define TOTALACTIVEPOWER 0x001C - -// Example Data (Object) Dictionary for Modbus parameters: -// The CID field in the table must be unique. -// Modbus Slave Addr field defines slave address of the device with correspond parameter. -// Modbus Reg Type - Type of Modbus register area (Holding register, Input Register and such). -// Reg Start field defines the start Modbus register number and Reg Size defines the number of registers for the characteristic accordingly. -// The Instance Offset defines offset in the appropriate parameter structure that will be used as instance to save parameter value. -// Data Type, Data Size specify type of the characteristic and its data size. -// Parameter Options field specifies the options that can be used to process parameter value (limits or masks). -// Access Mode - can be used to implement custom options for processing of characteristic (Read/Write restrictions, factory mode values and etc). -const mb_parameter_descriptor_t device_parameters[] = { - // { CID, Param Name, Units, Modbus Slave Addr, Modbus Reg Type, Reg Start, Reg Size, Instance Offset, Data Type, Data Size, Parameter Options, Access Mode} - - //{CID_HOLD_DATA_0, STR("ID 1"), STR("ID"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, METERID, 2, - // HOLD_OFFSET(holding_data0), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_0, STR("L1"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1CURRENT, 2, - HOLD_OFFSET(holding_data0), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_1, STR("L2"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L2CURRENT, 2, - HOLD_OFFSET(holding_data1), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_2, STR("L3"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L3CURRENT, 2, - HOLD_OFFSET(holding_data2), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ} - -}; - -// Calculate number of parameters in the table -const uint16_t num_device_parameters = (sizeof(device_parameters) / sizeof(device_parameters[0])); - -// The function to get pointer to parameter storage (instance) according to parameter description table -static void *master_get_param_data(const mb_parameter_descriptor_t *param_descriptor) -{ - assert(param_descriptor != NULL); - void *instance_ptr = NULL; - if (param_descriptor->param_offset != 0) - { - switch (param_descriptor->mb_param_type) - { - case MB_PARAM_HOLDING: - instance_ptr = ((void *)&holding_reg_params + param_descriptor->param_offset - 1); - break; - case MB_PARAM_INPUT: - instance_ptr = ((void *)&input_reg_params + param_descriptor->param_offset - 1); - break; - case MB_PARAM_COIL: - instance_ptr = ((void *)&coil_reg_params + param_descriptor->param_offset - 1); - break; - case MB_PARAM_DISCRETE: - instance_ptr = ((void *)&discrete_reg_params + param_descriptor->param_offset - 1); - break; - default: - instance_ptr = NULL; - break; - } - } - else - { - ESP_LOGE(TAG, "Wrong parameter offset for CID #%u", (unsigned)param_descriptor->cid); - assert(instance_ptr != NULL); - } - return instance_ptr; -} - -// Float - Mid-Little Endian (CDAB) -float ReverseFloat(const float inFloat) -{ - float retVal; - char *floatToConvert = (char *)&inFloat; - char *returnFloat = (char *)&retVal; - - // swap the bytes into a temporary buffer - returnFloat[0] = floatToConvert[2]; - returnFloat[1] = floatToConvert[3]; - returnFloat[2] = floatToConvert[0]; - returnFloat[3] = floatToConvert[1]; - - return retVal; -} - -static void serial_mdb_task_func(void *param) -{ - ESP_LOGI(TAG, "serial_mdb_task_func"); - esp_err_t err = ESP_OK; - - float maxcurrent = 0; - float l1current = 0; - float l2current = 0; - float l3current = 0; - int error_count = 0; - - bool alarm_state = false; - const mb_parameter_descriptor_t *param_descriptor = NULL; - - ESP_LOGI(TAG, "Start modbus..."); - - while (true) - { - - if ((evse_state_is_charging(evse_get_state()) && enabled) || (meterTest && enabled)) - { - // Read all found characteristics from slave(s) - for (uint16_t cid = 0; (err != ESP_ERR_NOT_FOUND) && cid < MASTER_MAX_CIDS; cid++) - { - // Get data from parameters description table - // and use this information to fill the characteristics description table - // and having all required fields in just one table - err = mbc_master_get_cid_info(cid, ¶m_descriptor); - if ((err != ESP_ERR_NOT_FOUND) && (param_descriptor != NULL)) - { - void *temp_data_ptr = master_get_param_data(param_descriptor); - uint8_t type = 0; - - err = mbc_master_get_parameter(cid, (char *)param_descriptor->param_key, - (uint8_t *)temp_data_ptr, &type); - - if (err == ESP_OK) - { - error_count = 0; - meterState = true; - - if ((param_descriptor->mb_param_type == MB_PARAM_HOLDING) || - (param_descriptor->mb_param_type == MB_PARAM_INPUT)) - { - float value = *(float *)temp_data_ptr; - value = ReverseFloat(value); - - switch (cid) - { - case 0: - setMaxGridCurrent(grid_get_max_current() * 10); - maxcurrent = 0; - l1current = 0; - l2current = 0; - l3current = 0; - - l1current = value; - break; - case 1: - l2current = value; - break; - case 2: - l3current = value; - - maxcurrent = (l1current > l2current) ? l1current : l2current; - maxcurrent = (maxcurrent > l3current) ? maxcurrent : l3current; - - //maxcurrent = (maxcurrent * 5) + 25; - - setLiveGridCurrent((int)maxcurrent * 10); - break; - default: - // code block - } - - ESP_LOGD(TAG, "Characteristic #%u %s (%s) value = %f (0x%" PRIx32 ") read successful.", - param_descriptor->cid, - param_descriptor->param_key, - param_descriptor->param_units, - value, - *(uint32_t *)temp_data_ptr); - - if (((value > param_descriptor->param_opts.max) || - (value < param_descriptor->param_opts.min))) - { - alarm_state = true; - break; - } - } - else - { - uint8_t state = *(uint8_t *)temp_data_ptr; - const char *rw_str = (state & param_descriptor->param_opts.opt1) ? "ON" : "OFF"; - if ((state & param_descriptor->param_opts.opt2) == param_descriptor->param_opts.opt2) - { - ESP_LOGI(TAG, "Characteristic 6 #%u %s (%s) value = %s (0x%" PRIx8 ") read successful.", - param_descriptor->cid, - param_descriptor->param_key, - param_descriptor->param_units, - (const char *)rw_str, - *(uint8_t *)temp_data_ptr); - } - else - { - ESP_LOGE(TAG, "Characteristic 7 #%u %s (%s) value = %s (0x%" PRIx8 "), unexpected value.", - param_descriptor->cid, - param_descriptor->param_key, - param_descriptor->param_units, - (const char *)rw_str, - *(uint8_t *)temp_data_ptr); - alarm_state = true; - break; - } - if (state & param_descriptor->param_opts.opt1) - { - alarm_state = true; - break; - } - } - } - else - { - - if (error_count > 3 && !meterTest) - { - meterState = false; - vTaskDelay(ERROR_TIMEOUT_MS * error_count); // timeout between polls - } - else - { - error_count++; - } - - ESP_LOGE(TAG, "Characteristic 8 #%u (%s) read fail, err = 0x%x (%s).", - param_descriptor->cid, - param_descriptor->param_key, - (int)err, - (char *)esp_err_to_name(err)); - } - - vTaskDelay(POLL_TIMEOUT_TICS); // timeout between polls - } - } - } - vTaskDelay(UPDATE_CIDS_TIMEOUT_TICS); - } - - if (alarm_state) - { - ESP_LOGI(TAG, "Alarm triggered by cid #%u.", param_descriptor->cid); - } - else - { - ESP_LOGE(TAG, "Alarm is not triggered after %u retries.", MASTER_MAX_RETRY); - } - ESP_LOGI(TAG, "Destroy master..."); - ESP_ERROR_CHECK(mbc_master_destroy()); - - /* - while (true) - { - - - vTaskDelay(pdMS_TO_TICKS(1000)); - } - */ -} - -// Modbus master initialization -static esp_err_t master_init(void) -{ - // Initialize and start Modbus controller - mb_communication_info_t comm = { - //.slave_addr = 1, - .port = MB_PORT_NUM, - .mode = MB_MODE_RTU, - .baudrate = MB_DEV_SPEED, - .parity = UART_PARITY_EVEN}; - void *master_handler = NULL; - - esp_err_t err = mbc_master_init(MB_PORT_SERIAL_MASTER, &master_handler); - MB_RETURN_ON_FALSE((master_handler != NULL), ESP_ERR_INVALID_STATE, TAG, - "mb controller initialization fail."); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller initialization fail, returns(0x%x).", (int)err); - err = mbc_master_setup((void *)&comm); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller setup fail, returns(0x%x).", (int)err); - - // Set UART pin numbers - err = uart_set_pin(MB_PORT_NUM, MB_UART_TXD, MB_UART_RXD, - MB_UART_RTS, UART_PIN_NO_CHANGE); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb serial set pin failure, uart_set_pin() returned (0x%x).", (int)err); - - err = mbc_master_start(); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller start fail, returned (0x%x).", (int)err); - - // Set driver mode to Half Duplex - err = uart_set_mode(MB_PORT_NUM, UART_MODE_RS485_HALF_DUPLEX); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb serial set mode failure, uart_set_mode() returned (0x%x).", (int)err); - - vTaskDelay(5); - err = mbc_master_set_descriptor(&device_parameters[0], num_device_parameters); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller set descriptor fail, returns(0x%x).", (int)err); - ESP_LOGI(TAG, "Modbus master stack initialized..."); - return err; -} - -/** - * @brief Set meter model - * - */ -void serial_mdb_set_model(bool _enabled) -{ - enabled = _enabled; -} - -/** - * @brief Set meter state - * - */ -bool serial_mdb_get_meter_state() -{ - return meterState; -} - -/** - * @brief Set meter state - * - */ -void serial_mdb_set_meter_test(bool _meterTest) -{ - meterTest = _meterTest; -} - -void serial_mdb_start() -{ - - ESP_LOGI(TAG, "Starting MDB Serial"); - - enabled = meter_get_model() != ENERGY_METER_NONE; - - ESP_ERROR_CHECK(master_init()); - - xTaskCreate(serial_mdb_task_func, "serial_mdb_task", 4 * 1024, NULL, 5, &serial_mdb_task); -} - -void serial_mdb_stop(void) -{ - ESP_LOGI(TAG, "Stopping"); - - if (serial_mdb_task) - { - vTaskDelete(serial_mdb_task); - serial_mdb_task = NULL; - } - - // if (port != -1) - //{ - uart_driver_delete(MB_PORT_NUM); - // port = -1; - //} -} \ No newline at end of file diff --git a/components/serial_mdb/src/serial_mdb.c b/components/serial_mdb/src/serial_mdb.c deleted file mode 100755 index ed11790..0000000 --- a/components/serial_mdb/src/serial_mdb.c +++ /dev/null @@ -1,533 +0,0 @@ -#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE -#include "esp_log.h" - -#include "serial_mdb.h" -#include "modbus_params.h" // for modbus parameters structures -#include "mbcontroller.h" -#include "sdkconfig.h" -#include "evse_api.h" -#include "loadbalancer.h" -#include "meter.h" - -#define TXD_PIN (GPIO_NUM_17) -#define RXD_PIN (GPIO_NUM_16) - -static const char *TAG = "serial_mdb"; - -static bool enabled = false; -static bool meterState = false; -static bool meterTest = false; - -static TaskHandle_t serial_mdb_task = NULL; - -#define MB_PORT_NUM 2 //(CONFIG_MB_UART_PORT_NUM) // Number of UART port used for Modbus connection -#define MB_DEV_SPEED 9600 //(CONFIG_MB_UART_BAUD_RATE) // The communication speed of the UART -// #define MB_PARITY_EVEN - -#define MB_UART_TXD 17 -#define MB_UART_RXD 16 -#define MB_UART_RTS 5 - -// Note: Some pins on target chip cannot be assigned for UART communication. -// See UART documentation for selected board and target to configure pins using Kconfig. - -// The number of parameters that intended to be used in the particular control process -#define MASTER_MAX_CIDS num_device_parameters - -// Number of reading of parameters from slave -#define MASTER_MAX_RETRY 30 - -// Timeout to update cid over Modbus -#define UPDATE_CIDS_TIMEOUT_MS (3000) -#define UPDATE_CIDS_TIMEOUT_TICS (UPDATE_CIDS_TIMEOUT_MS / portTICK_PERIOD_MS) - -// Timeout between polls -#define POLL_TIMEOUT_MS (500) -#define POLL_TIMEOUT_TICS (POLL_TIMEOUT_MS / portTICK_PERIOD_MS) - -// Timeout between erros -#define ERROR_TIMEOUT_MS (1000) -#define ERROR_TIMEOUT_TICS (ERROR_TIMEOUT_MS / portTICK_PERIOD_MS) - -// The macro to get offset for parameter in the appropriate structure -#define HOLD_OFFSET(field) ((uint16_t)(offsetof(holding_reg_params_t, field) + 1)) -#define INPUT_OFFSET(field) ((uint16_t)(offsetof(input_reg_params_t, field) + 1)) -#define COIL_OFFSET(field) ((uint16_t)(offsetof(coil_reg_params_t, field) + 1)) -// Discrete offset macro -#define DISCR_OFFSET(field) ((uint16_t)(offsetof(discrete_reg_params_t, field) + 1)) - -#define STR(fieldname) ((const char *)(fieldname)) -// Options can be used as bit masks or parameter limits -#define OPTS(min_val, max_val, step_val) \ - { \ - .opt1 = min_val, .opt2 = max_val, .opt3 = step_val} - -// Enumeration of modbus device addresses accessed by master device -enum -{ - MB_DEVICE_ADDR1 = 1 // Only one slave device used for the test (add other slave addresses here) -}; - -// Enumeration of all supported CIDs for device (used in parameter definition table) -enum -{ - CID_HOLD_DATA_0 = 0, - CID_HOLD_DATA_1 = 1, - CID_HOLD_DATA_2 = 2, - CID_HOLD_DATA_3 = 3, - CID_HOLD_DATA_4 = 4, - CID_HOLD_DATA_5 = 5, - CID_HOLD_DATA_6 = 6 -}; - -#define SN 0x1000 -#define METERID 0x1003 -#define FW 0x1004 - -#define L1VOLTAGE 0x0100 -// #define L2VOLTAGE 0x0010 -// #define L3VOLTAGE 0x0012 - -#define L1CURRENT 0x0102 -// #define L2CURRENT 0x0018 -// #define L3CURRENT 0x001A - -#define ACTIVEPOWER 0x0104 -#define APPARENTPOWER 0x0106 -#define REACTIVEPOWER 0x0108 - -#define TOTALFACTIVE 0x010E -#define TOTALRACTIVE 0x0118 - -// Example Data (Object) Dictionary for Modbus parameters: -// The CID field in the table must be unique. -// Modbus Slave Addr field defines slave address of the device with correspond parameter. -// Modbus Reg Type - Type of Modbus register area (Holding register, Input Register and such). -// Reg Start field defines the start Modbus register number and Reg Size defines the number of registers for the characteristic accordingly. -// The Instance Offset defines offset in the appropriate parameter structure that will be used as instance to save parameter value. -// Data Type, Data Size specify type of the characteristic and its data size. -// Parameter Options field specifies the options that can be used to process parameter value (limits or masks). -// Access Mode - can be used to implement custom options for processing of characteristic (Read/Write restrictions, factory mode values and etc). -const mb_parameter_descriptor_t device_parameters[] = { - // { CID, Param Name, Units, Modbus Slave Addr, Modbus Reg Type, Reg Start, Reg Size, Instance Offset, Data Type, Data Size, Parameter Options, Access Mode} - - {CID_HOLD_DATA_0, STR("TOTALFACTIVE"), STR("kWh"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALFACTIVE, 2, - HOLD_OFFSET(holding_data0), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_1, STR("TOTALRACTIVE"), STR("kWh"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALRACTIVE, 2, - HOLD_OFFSET(holding_data1), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_2, STR("ACTIVEPOWER"), STR("W"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, ACTIVEPOWER, 2, - HOLD_OFFSET(holding_data2), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_3, STR("APPARENTPOWER"), STR("W"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, APPARENTPOWER, 2, - HOLD_OFFSET(holding_data3), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_4, STR("REACTIVEPOWER"), STR("W"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, REACTIVEPOWER, 2, - HOLD_OFFSET(holding_data4), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_5, STR("L1CURRENT"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1CURRENT, 2, - HOLD_OFFSET(holding_data5), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_6, STR("L1VOLTAGE"), STR("V"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data6), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ} - /* - - {CID_HOLD_DATA_3, STR("L1VOLTAGE 4"), STR("V"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data3), PARAM_TYPE_I32_DCBA, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_4, STR("L1VOLTAGE 5"), STR("V"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data4), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_5, STR("L1CURRENT 2"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1CURRENT, 2, - HOLD_OFFSET(holding_data5), PARAM_TYPE_FLOAT, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ} - - - {CID_HOLD_DATA_2, STR("ID 2"), STR("ID 2"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, METERID, 2, - HOLD_OFFSET(holding_data4), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_3, STR("ID 3"), STR("FW 2"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, FW, 2, - HOLD_OFFSET(holding_data5), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ} - - - {CID_HOLD_DATA_2, STR("ID 2"), STR("ID 2"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, METERID, 1, - HOLD_OFFSET(holding_data2), PARAM_TYPE_U16, 2, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_3, STR("ID 3"), STR("FW 2"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, FW, 1, - HOLD_OFFSET(holding_data3), PARAM_TYPE_U16, 2, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_4, STR("ID 4"), STR("ID 4"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data4), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_5, STR("ID 5"), STR("ID 5"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data5), PARAM_TYPE_U16, 2, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_6, STR("ID 6"), STR("ID 6"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data6), PARAM_TYPE_U32, 4, OPTS(0, 100000, 1), PAR_PERMS_READ} - - - - - {CID_HOLD_DATA_4, STR("ID 4"), STR("ID 3"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, METERID, 2, - HOLD_OFFSET(holding_data4), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_5, STR("ID 5"), STR("FW 3"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, FW, 2, - HOLD_OFFSET(holding_data5), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_6, STR("ID 6"), STR("ID 4"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, METERID, 2, - HOLD_OFFSET(holding_data6), PARAM_TYPE_U8, 2, OPTS(0, 100000, 1), PAR_PERMS_READ} - - - {CID_HOLD_DATA_0, STR("L1"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1CURRENT, 2, - HOLD_OFFSET(holding_data0), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, - - - {CID_HOLD_DATA_1, STR("L2"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L2CURRENT, 2, - HOLD_OFFSET(holding_data1), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_2, STR("L3"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L3CURRENT, 2, - HOLD_OFFSET(holding_data2), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ} - */ - -}; - -// Calculate number of parameters in the table -const uint16_t num_device_parameters = (sizeof(device_parameters) / sizeof(device_parameters[0])); - -// The function to get pointer to parameter storage (instance) according to parameter description table -static void *master_get_param_data(const mb_parameter_descriptor_t *param_descriptor) -{ - assert(param_descriptor != NULL); - void *instance_ptr = NULL; - if (param_descriptor->param_offset != 0) - { - switch (param_descriptor->mb_param_type) - { - case MB_PARAM_HOLDING: - instance_ptr = ((void *)&holding_reg_params + param_descriptor->param_offset - 1); - break; - case MB_PARAM_INPUT: - instance_ptr = ((void *)&input_reg_params + param_descriptor->param_offset - 1); - break; - case MB_PARAM_COIL: - instance_ptr = ((void *)&coil_reg_params + param_descriptor->param_offset - 1); - break; - case MB_PARAM_DISCRETE: - instance_ptr = ((void *)&discrete_reg_params + param_descriptor->param_offset - 1); - break; - default: - instance_ptr = NULL; - break; - } - } - else - { - ESP_LOGE(TAG, "Wrong parameter offset for CID #%u", (unsigned)param_descriptor->cid); - assert(instance_ptr != NULL); - } - return instance_ptr; -} - -// Float - Mid-Little Endian (CDAB) -float ReverseFloat(const float inFloat) -{ - float retVal; - char *floatToConvert = (char *)&inFloat; - char *returnFloat = (char *)&retVal; - - // swap the bytes into a temporary buffer - returnFloat[0] = floatToConvert[2]; - returnFloat[1] = floatToConvert[3]; - returnFloat[2] = floatToConvert[0]; - returnFloat[3] = floatToConvert[1]; - - return retVal; -} - -// Int - Mid-Little Endian (CDAB) -int ReverseInt(const int inFloat) -{ - int retVal; - char *floatToConvert = (char *)&inFloat; - char *returnFloat = (char *)&retVal; - - // swap the bytes into a temporary buffer - returnFloat[0] = floatToConvert[2]; - returnFloat[1] = floatToConvert[3]; - returnFloat[2] = floatToConvert[0]; - returnFloat[3] = floatToConvert[1]; - - return retVal; -} - -static void serial_mdb_task_func(void *param) -{ - ESP_LOGI(TAG, "serial_mdb_task_func"); - esp_err_t err = ESP_OK; - - float maxcurrent = 0; - float l1current = 0; - float l2current = 0; - float l3current = 0; - int error_count = 0; - - bool alarm_state = false; - const mb_parameter_descriptor_t *param_descriptor = NULL; - - ESP_LOGI(TAG, "Start modbus..."); - - while (true) - { - - // if ((evse_state_is_charging(evse_get_state()) && enabled) || (meterTest && enabled)) - { - // Read all found characteristics from slave(s) - for (uint16_t cid = 0; (err != ESP_ERR_NOT_FOUND) && cid < MASTER_MAX_CIDS; cid++) - { - // Get data from parameters description table - // and use this information to fill the characteristics description table - // and having all required fields in just one table - err = mbc_master_get_cid_info(cid, ¶m_descriptor); - if ((err != ESP_ERR_NOT_FOUND) && (param_descriptor != NULL)) - { - void *temp_data_ptr = master_get_param_data(param_descriptor); - uint8_t type = 0; - - err = mbc_master_get_parameter(cid, (char *)param_descriptor->param_key, - (uint8_t *)temp_data_ptr, &type); - - if (err == ESP_OK) - { - - ESP_LOGI(TAG, "err == ESP_OK..."); - - error_count = 0; - meterState = true; - - if ((param_descriptor->mb_param_type == MB_PARAM_HOLDING) || - (param_descriptor->mb_param_type == MB_PARAM_INPUT)) - { - int value = *(int *)temp_data_ptr; - // value = ReverseInt(value); - - /* - switch (cid) - { - case 0: - // setMaxGridCurrent(grid_get_max_current() * 10); - maxcurrent = 0; - l1current = 0; - l2current = 0; - l3current = 0; - - l1current = value; - break; - case 1: - l2current = value; - break; - case 2: - l3current = value; - - maxcurrent = (l1current > l2current) ? l1current : l2current; - maxcurrent = (maxcurrent > l3current) ? maxcurrent : l3current; - - // maxcurrent = (maxcurrent * 5) + 25; - - // setLiveGridCurrent((int)maxcurrent * 10); - break; - default: - // code block - }*/ - - ESP_LOGI(TAG, "Characteristic #%u %s (%s) value = %d (0x%" PRIx32 ") read successful.", - param_descriptor->cid, - param_descriptor->param_key, - param_descriptor->param_units, - value, - *(uint32_t *)temp_data_ptr); - - if (((value > param_descriptor->param_opts.max) || - (value < param_descriptor->param_opts.min))) - { - alarm_state = true; - break; - } - } - else - { - uint8_t state = *(uint8_t *)temp_data_ptr; - const char *rw_str = (state & param_descriptor->param_opts.opt1) ? "ON" : "OFF"; - if ((state & param_descriptor->param_opts.opt2) == param_descriptor->param_opts.opt2) - { - ESP_LOGI(TAG, "Characteristic 6 #%u %s (%s) value = %s (0x%" PRIx8 ") read successful.", - param_descriptor->cid, - param_descriptor->param_key, - param_descriptor->param_units, - (const char *)rw_str, - *(uint8_t *)temp_data_ptr); - } - else - { - ESP_LOGE(TAG, "Characteristic 7 #%u %s (%s) value = %s (0x%" PRIx8 "), unexpected value.", - param_descriptor->cid, - param_descriptor->param_key, - param_descriptor->param_units, - (const char *)rw_str, - *(uint8_t *)temp_data_ptr); - alarm_state = true; - break; - } - if (state & param_descriptor->param_opts.opt1) - { - alarm_state = true; - break; - } - } - } - else - { - - if (error_count > 3 && !meterTest) - { - meterState = false; - vTaskDelay(ERROR_TIMEOUT_MS * error_count); // timeout between polls - } - else - { - error_count++; - } - - ESP_LOGE(TAG, "Characteristic 8 #%u (%s) read fail, err = 0x%x (%s).", - param_descriptor->cid, - param_descriptor->param_key, - (int)err, - (char *)esp_err_to_name(err)); - } - - vTaskDelay(POLL_TIMEOUT_TICS); // timeout between polls - } - } - } - vTaskDelay(UPDATE_CIDS_TIMEOUT_TICS); - } - - if (alarm_state) - { - ESP_LOGI(TAG, "Alarm triggered by cid #%u.", param_descriptor->cid); - } - else - { - ESP_LOGE(TAG, "Alarm is not triggered after %u retries.", MASTER_MAX_RETRY); - } - ESP_LOGI(TAG, "Destroy master..."); - ESP_ERROR_CHECK(mbc_master_destroy()); - - /* - while (true) - { - - - vTaskDelay(pdMS_TO_TICKS(1000)); - } - */ -} - -// Modbus master initialization -static esp_err_t master_init(void) -{ - // Initialize and start Modbus controller - mb_communication_info_t comm = { - //.slave_addr = 1, - .port = MB_PORT_NUM, - .mode = MB_MODE_RTU, - .baudrate = MB_DEV_SPEED, - .parity = UART_PARITY_DISABLE}; - void *master_handler = NULL; - - esp_err_t err = mbc_master_init(MB_PORT_SERIAL_MASTER, &master_handler); - MB_RETURN_ON_FALSE((master_handler != NULL), ESP_ERR_INVALID_STATE, TAG, - "mb controller initialization fail."); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller initialization fail, returns(0x%x).", (int)err); - err = mbc_master_setup((void *)&comm); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller setup fail, returns(0x%x).", (int)err); - - // Set UART pin numbers - err = uart_set_pin(MB_PORT_NUM, MB_UART_TXD, MB_UART_RXD, - MB_UART_RTS, UART_PIN_NO_CHANGE); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb serial set pin failure, uart_set_pin() returned (0x%x).", (int)err); - - err = mbc_master_start(); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller start fail, returned (0x%x).", (int)err); - - // Set driver mode to Half Duplex - err = uart_set_mode(MB_PORT_NUM, UART_MODE_RS485_HALF_DUPLEX); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb serial set mode failure, uart_set_mode() returned (0x%x).", (int)err); - - vTaskDelay(5); - err = mbc_master_set_descriptor(&device_parameters[0], num_device_parameters); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller set descriptor fail, returns(0x%x).", (int)err); - ESP_LOGI(TAG, "Modbus master stack initialized..."); - return err; -} - -/** - * @brief Set meter model - * - */ -void serial_mdb_set_model(bool _enabled) -{ - enabled = _enabled; -} - -/** - * @brief Set meter state - * - */ -bool serial_mdb_get_meter_state() -{ - return meterState; -} - -/** - * @brief Set meter state - * - */ -void serial_mdb_set_meter_test(bool _meterTest) -{ - meterTest = _meterTest; -} - -void serial_mdb_start() -{ - - ESP_LOGI(TAG, "Starting MDB Serial"); - - enabled = meter_get_model() != ENERGY_METER_NONE; - - ESP_ERROR_CHECK(master_init()); - - xTaskCreate(serial_mdb_task_func, "serial_mdb_task", 4 * 1024, NULL, 5, &serial_mdb_task); -} - -void serial_mdb_stop(void) -{ - ESP_LOGI(TAG, "Stopping"); - - if (serial_mdb_task) - { - vTaskDelete(serial_mdb_task); - serial_mdb_task = NULL; - } - - // if (port != -1) - //{ - uart_driver_delete(MB_PORT_NUM); - // port = -1; - //} -} \ No newline at end of file diff --git a/components/serial_mt/include/serial_mt.h b/components/serial_mt/include/serial_mt.h deleted file mode 100755 index 10a5075..0000000 --- a/components/serial_mt/include/serial_mt.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef SERIAL_MT_H_ -#define SERIAL_MT_H_ - -#include "driver/uart.h" - -/** - * @brief Send Data - * - */ -int sendData(const char *data); - - -/** - * @brief Start serial MT - * - */ -void serial_mt_start(); - - -/** - * @brief Stop serial MT - * - */ -void serial_mt_stop(void); - -#endif /* SERIAL_MT_H_ */ diff --git a/main/main.c b/main/main.c index 6a4099e..40fda16 100755 --- a/main/main.c +++ b/main/main.c @@ -19,7 +19,7 @@ #include "led.h" #include "api.h" #include "protocols.h" -#include "serial_mt.h" +#include "meter_zigbee.h" #include "board_config.h" #include "wifi.h" #include "logger.h" @@ -236,10 +236,10 @@ static void init_modules(void) // Outros módulos (descomente conforme necessário) // meter_init(); // ocpp_start(); - // serial_mdb_start(); + // orno_modbus_start(); // currentshaper_start(); // initWiegand(); - // serial_mt_start(); + // meter_zigbee_start(); // master_sync_start(); // slave_sync_start(); }