diff --git a/components/api/CMakeLists.txt b/components/api/CMakeLists.txt index 6152ad3..9a96fd1 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 meter_orno_modbus ocpp) + REQUIRES network config evse peripherals protocols meter_orno 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/api/src/json.c b/components/api/src/json.c index cec833b..d3cae3d 100755 --- a/components/api/src/json.c +++ b/components/api/src/json.c @@ -15,7 +15,6 @@ #include "evse_api.h" #include "ocpp.h" #include "board_config.h" -#include "meter.h" #include "socket_lock.h" #include "proximity.h" //#include "modbus.h" @@ -58,9 +57,9 @@ cJSON *json_get_evse_config(void) cJSON_AddBoolToObject(root, "socketLockDetectionHigh", socket_lock_is_detection_high()); cJSON_AddNumberToObject(root, "socketLockRetryCount", socket_lock_get_retry_count()); - cJSON_AddStringToObject(root, "modelMeter", meter_model_to_str(meter_get_model())); - cJSON_AddNumberToObject(root, "maxGridCurrent", grid_get_max_current()); - cJSON_AddStringToObject(root, "stateMeter", meter_state_to_str(meter_get_state())); + //cJSON_AddStringToObject(root, "modelMeter", meter_model_to_str(meter_get_model())); + //cJSON_AddNumberToObject(root, "maxGridCurrent", grid_get_max_current()); + //cJSON_AddStringToObject(root, "stateMeter", meter_state_to_str(meter_get_state())); char str[64]; cJSON_AddBoolToObject(root, "enabledocpp", ocpp_get_enabled()); @@ -144,12 +143,12 @@ esp_err_t json_set_evse_config(cJSON *root) socket_lock_set_retry_count(cJSON_GetObjectItem(root, "socketLockRetryCount")->valuedouble); } + /* if (cJSON_IsString(cJSON_GetObjectItem(root, "modelMeter"))) { RETURN_ON_ERROR(meter_set_model(meter_str_to_model(cJSON_GetObjectItem(root, "modelMeter")->valuestring))); } - /* if (cJSON_IsString(cJSON_GetObjectItem(root, "stateMeter"))) { RETURN_ON_ERROR(meter_set_state(meter_str_to_state(cJSON_GetObjectItem(root, "stateMeter")->valuestring))); @@ -379,6 +378,7 @@ cJSON *json_get_state(void) cJSON_AddItemToObject(root, "errors", errors); } +/* cJSON_AddNumberToObject(root, "sessionTime", energy_meter_get_session_time()); cJSON_AddNumberToObject(root, "chargingTime", energy_meter_get_charging_time()); cJSON_AddNumberToObject(root, "consumption", energy_meter_get_consumption()); @@ -388,6 +388,7 @@ cJSON *json_get_state(void) cJSON_AddItemToObject(root, "voltage", cJSON_CreateFloatArray(values, 3)); energy_meter_get_current(values); cJSON_AddItemToObject(root, "current", cJSON_CreateFloatArray(values, 3)); +*/ return root; } @@ -456,6 +457,8 @@ cJSON *json_get_board_config(void) cJSON_AddNumberToObject(root, "socketLockMinBreakTime", board_config.socket_lock_min_break_time); cJSON_AddBoolToObject(root, "rcm", board_config.rcm); cJSON_AddBoolToObject(root, "temperatureSensor", board_config.onewire && board_config.onewire_temp_sensor); + + /* switch (board_config.energy_meter) { case BOARD_CONFIG_ENERGY_METER_CUR: @@ -467,7 +470,8 @@ cJSON *json_get_board_config(void) default: cJSON_AddStringToObject(root, "energyMeter", "none"); } - cJSON_AddBoolToObject(root, "energyMeterThreePhases", board_config.energy_meter_three_phases); + //cJSON_AddBoolToObject(root, "energyMeterThreePhases", board_config.energy_meter_three_phases); + */ cJSON_AddStringToObject(root, "serial1", serial_to_str(board_config.serial_1)); cJSON_AddStringToObject(root, "serial1Name", board_config.serial_1_name); diff --git a/components/evse/evse_core.c b/components/evse/evse_core.c index 74547bd..82373d0 100755 --- a/components/evse/evse_core.c +++ b/components/evse/evse_core.c @@ -6,7 +6,6 @@ #include "evse_config.h" #include "evse_api.h" #include "pilot.h" -#include "meter.h" #include "freertos/FreeRTOS.h" #include "freertos/semphr.h" #include "esp_log.h" @@ -69,11 +68,6 @@ void evse_process(void) { } xSemaphoreGive(mutex); - - energy_meter_process( - evse_state_is_charging(evse_get_state()), - evse_get_charging_current() - ); } // ================================ diff --git a/components/evse/evse_fsm.c b/components/evse/evse_fsm.c index 4b77cb3..bf6af1e 100755 --- a/components/evse/evse_fsm.c +++ b/components/evse/evse_fsm.c @@ -7,7 +7,6 @@ #include "ac_relay.h" #include "board_config.h" #include "socket_lock.h" -#include "meter.h" #include "proximity.h" #include "rcm.h" #include "evse_state.h" @@ -37,7 +36,7 @@ static void update_outputs(evse_state_t state, uint16_t charging_current, uint8_ if (board_config.socket_lock && socket_outlet) { socket_lock_set_locked(false); } - energy_meter_stop_session(); + //energy_meter_stop_session(); break; case EVSE_STATE_B1: @@ -57,7 +56,7 @@ static void update_outputs(evse_state_t state, uint16_t charging_current, uint8_ cable_max_current = proximity_get_max_current(); } - energy_meter_start_session(); + //energy_meter_start_session(); break; case EVSE_STATE_B2: diff --git a/components/evse/evse_hardware.c b/components/evse/evse_hardware.c index 73da2d5..f03e647 100755 --- a/components/evse/evse_hardware.c +++ b/components/evse/evse_hardware.c @@ -3,7 +3,6 @@ #include "ac_relay.h" #include "socket_lock.h" #include "proximity.h" -#include "meter.h" static const char *TAG = "evse_hardware"; @@ -27,14 +26,7 @@ bool evse_hardware_is_vehicle_connected(void) { } bool evse_hardware_is_energy_detected(void) { - if (!meter_is_running()) { - return false; - } - - MeterData data = meter_getData(); - const float THRESHOLD = 0.1f; // Corrente mínima para considerar consumo - return (data.irmsA > THRESHOLD) || (data.irmsB > THRESHOLD) || - (data.irmsC > THRESHOLD); + return false; } void evse_hardware_relay_on(void) { diff --git a/components/evsemeter/CMakeLists.txt b/components/evsemeter/CMakeLists.txt index e4f7635..1c19daf 100755 --- a/components/evsemeter/CMakeLists.txt +++ b/components/evsemeter/CMakeLists.txt @@ -6,4 +6,4 @@ set(srcs idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "include" - REQUIRES esp_event meter_orno_modbus ade7758) + REQUIRES esp_event meter_orno meter_ade7758) diff --git a/components/gridmeter/CMakeLists.txt b/components/gridmeter/CMakeLists.txt index 4ffea5e..447fc79 100755 --- a/components/gridmeter/CMakeLists.txt +++ b/components/gridmeter/CMakeLists.txt @@ -5,4 +5,4 @@ set(srcs idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "include" - REQUIRES esp_event meter_orno_modbus) + REQUIRES esp_event meter_orno meter_zigbee) diff --git a/components/ade7758/CMakeLists.txt b/components/meter_ade7758/CMakeLists.txt similarity index 73% rename from components/ade7758/CMakeLists.txt rename to components/meter_ade7758/CMakeLists.txt index bd113c9..311eb95 100755 --- a/components/ade7758/CMakeLists.txt +++ b/components/meter_ade7758/CMakeLists.txt @@ -6,5 +6,5 @@ idf_component_register( INCLUDE_DIRS "include" REQUIRES - driver evse nvs_flash esp_timer meter_orno_modbus + driver evse nvs_flash esp_timer ) diff --git a/components/ade7758/include/ade7758.h b/components/meter_ade7758/include/ade7758.h similarity index 100% rename from components/ade7758/include/ade7758.h rename to components/meter_ade7758/include/ade7758.h diff --git a/components/ade7758/include/meter.h b/components/meter_ade7758/include/meter.h similarity index 100% rename from components/ade7758/include/meter.h rename to components/meter_ade7758/include/meter.h diff --git a/components/ade7758/src/ade7758.c b/components/meter_ade7758/src/ade7758.c similarity index 100% rename from components/ade7758/src/ade7758.c rename to components/meter_ade7758/src/ade7758.c diff --git a/components/ade7758/src/energy_meter.c b/components/meter_ade7758/src/energy_meter.c similarity index 100% rename from components/ade7758/src/energy_meter.c rename to components/meter_ade7758/src/energy_meter.c diff --git a/components/ade7758/src/meter.c b/components/meter_ade7758/src/meter.c similarity index 100% rename from components/ade7758/src/meter.c rename to components/meter_ade7758/src/meter.c diff --git a/components/meter_orno_modbus/CMakeLists.txt b/components/meter_orno/CMakeLists.txt similarity index 100% rename from components/meter_orno_modbus/CMakeLists.txt rename to components/meter_orno/CMakeLists.txt diff --git a/components/meter_orno_modbus/include/orno_modbus.h b/components/meter_orno/include/orno_modbus.h similarity index 100% rename from components/meter_orno_modbus/include/orno_modbus.h rename to components/meter_orno/include/orno_modbus.h diff --git a/components/meter_orno_modbus/src/orno_modbus.c b/components/meter_orno/src/orno_modbus.c similarity index 100% rename from components/meter_orno_modbus/src/orno_modbus.c rename to components/meter_orno/src/orno_modbus.c diff --git a/components/meter_zigbee/CMakeLists.txt b/components/meter_zigbee/CMakeLists.txt index a9de290..4096ce6 100755 --- a/components/meter_zigbee/CMakeLists.txt +++ b/components/meter_zigbee/CMakeLists.txt @@ -4,5 +4,4 @@ set(srcs idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "include" - PRIV_REQUIRES driver - REQUIRES config evse loadbalancer serial_sync) + PRIV_REQUIRES driver) diff --git a/components/meter_zigbee/src/meter_zigbee.c b/components/meter_zigbee/src/meter_zigbee.c index 3c07412..27bc846 100755 --- a/components/meter_zigbee/src/meter_zigbee.c +++ b/components/meter_zigbee/src/meter_zigbee.c @@ -1,4 +1,3 @@ - #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" @@ -7,171 +6,104 @@ #include "string.h" #include "driver/gpio.h" #include "meter_zigbee.h" -#include "evse_api.h" -#include "loadbalancer.h" -#include "meter.h" -//#include "app_main.h" -//#include "sync_master.h" +#include -#define BUF_SIZE 128 +#define TAG "meter_zigbee" #define TXD_PIN (GPIO_NUM_17) #define RXD_PIN (GPIO_NUM_16) +#define BUF_SIZE 128 +#define RX_BUF_SIZE 14 #define VOLTAGE_CURRENT1_ATTR 0x0006 #define VOLTAGE_CURRENT2_ATTR 0x0007 #define VOLTAGE_CURRENT3_ATTR 0x0008 -// static uint8_t msg[128]; - -static const char *TAG = "meter_zigbee"; - -static uart_port_t port = -1; - static TaskHandle_t meter_zigbee_task = NULL; +static float l1_current = 0, l2_current = 0, l3_current = 0; -static const int RX_BUF_SIZE = 14; +static float decode_current(const uint8_t *buf) { + return (buf[9] + (buf[8] << 8) + (buf[7] << 16)) / 100.0f; +} -static void meter_zigbee_task_func(void *param) -{ - ESP_LOGI(TAG, "meter_zigbee_task_func"); +static void decode_frame(const uint8_t *buf) { + uint16_t attr_code = buf[1] | (buf[2] << 8); + uint8_t size = buf[4]; - uint8_t *buff = (uint8_t *)malloc(RX_BUF_SIZE + 1); + if (size != 8) { + ESP_LOGW(TAG, "Unexpected data size: %d", size); + return; + } - unsigned long currentMillis = pdTICKS_TO_MS(xTaskGetTickCount()) - 120000; + float current = decode_current(buf); + ESP_LOGI(TAG, "Attr 0x%04X - Current: %.2f A", attr_code, current); - while (1) - { - const int rxBytes = uart_read_bytes(UART_NUM_1, buff, RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS); - if (rxBytes >= 10) - { - //ESP_LOGI(TAG, "Read %d bytes: '%s'", rxBytes, buff); - //ESP_LOG_BUFFER_HEXDUMP(TAG, buff, rxBytes, ESP_LOG_INFO); + switch (attr_code) { + case VOLTAGE_CURRENT1_ATTR: l1_current = current; break; + case VOLTAGE_CURRENT2_ATTR: l2_current = current; break; + case VOLTAGE_CURRENT3_ATTR: l3_current = current; break; + default: + ESP_LOGW(TAG, "Unknown attribute code: 0x%04X", attr_code); + return; + } - uint8_t idmsg = buff[0]; - uint16_t code = buff[1] + (buff[2] << 8); - uint8_t size = buff[4]; - uint32_t power = 0; - uint32_t current = 0; - uint32_t volt = 0; + float max_current = fmaxf(fmaxf(l1_current, l2_current), l3_current); + ESP_LOGI(TAG, "Max current: %.2f A", max_current); +} - float maxcurrent = 0; - float l1current = 0; - float l2current = 0; - float l3current = 0; +static void meter_zigbee_task_func(void *param) { + ESP_LOGI(TAG, "Zigbee meter task started"); + uint8_t *buf = malloc(RX_BUF_SIZE); + if (!buf) { + ESP_LOGE(TAG, "Memory allocation failed"); + vTaskDelete(NULL); + return; + } - //ESP_LOGI(TAG, "Msg id: %d code 0x%04hx size %d ", idmsg, code, size); - - if (size == 8) - { - power = buff[12] + (buff[11] << 8) + (buff[10] << 16); // + (buff[9] << 24); - ESP_LOGI(TAG, "VOLTAGE_CURRENT_ATTR Power value %" PRIu32 " ", power); - current = buff[9] + (buff[8] << 8) + (buff[7] << 16); // + (buff[9] << 24); - ESP_LOGI(TAG, "VOLTAGE_CURRENT_ATTR Current value %" PRIu32 " ", current); - volt = buff[6] + (buff[5] << 8); // + (buff[4] << 16);// + (buff[9] << 24); - ESP_LOGI(TAG, "VOLTAGE_CURRENT_ATTR Voltage value %" PRIu32 " ", volt); - - if (code == VOLTAGE_CURRENT1_ATTR) - { - l1current = current / 100.0f; - } - else if (code == VOLTAGE_CURRENT2_ATTR) - { - l2current = current / 100.0f; - } - else if (code == VOLTAGE_CURRENT3_ATTR) - { - l3current = current / 100.0f; - } - else - { - ESP_LOGW(TAG, "Error code %d ", code); - // continue; - } - maxcurrent = (l1current > l2current) ? l1current : l2current; - maxcurrent = (maxcurrent > l3current) ? maxcurrent : l3current; - - ESP_LOGI(TAG, "maxcurrent value %f ", maxcurrent); - - //send_grid_current(maxcurrent); - - if (evse_state_is_charging(evse_get_state())) - { - setMaxGridCurrent(grid_get_max_current() * 10); - setLiveGridCurrent((int)maxcurrent); - - /* - if (pdTICKS_TO_MS(xTaskGetTickCount()) - currentMillis > 120000) - { - push_grid_power(power / 1000.0f); - - push_grid_current(l1current / 10.0f); - - push_grid_volt(volt / 10.0f); - - currentMillis = pdTICKS_TO_MS(xTaskGetTickCount()); - }*/ - - } - } + while (1) { + int len = uart_read_bytes(UART_NUM_1, buf, RX_BUF_SIZE, pdMS_TO_TICKS(1000)); + if (len >= 10) { + decode_frame(buf); } } - free(buff); + + free(buf); + vTaskDelete(NULL); } -int meter_zigbee_send_data(const char *data) -{ - const int len = strlen(data); - const int txBytes = uart_write_bytes(UART_NUM_1, data, len); - ESP_LOGI(TAG, "Wrote %d bytes", txBytes); - return txBytes; +int meter_zigbee_send_data(const char *data) { + int len = strlen(data); + int sent = uart_write_bytes(UART_NUM_1, data, len); + ESP_LOGI(TAG, "Sent %d bytes", sent); + return sent; } -void meter_zigbee_start() -{ +void meter_zigbee_start(void) { + ESP_LOGI(TAG, "Starting Zigbee UART"); - ESP_LOGI(TAG, "Starting MT Serial"); - - const uart_config_t uart_config = { + uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, - .source_clk = UART_SCLK_DEFAULT, + .source_clk = UART_SCLK_DEFAULT }; - esp_err_t err = uart_param_config(UART_NUM_1, &uart_config); - if (err != ESP_OK) - { - ESP_LOGE(TAG, "uart_param_config() returned 0x%x", err); - return; - } - err = uart_driver_install(UART_NUM_1, BUF_SIZE * 2, 0, 0, NULL, 0); - if (err != ESP_OK) - { - ESP_LOGE(TAG, "uart_driver_install() returned 0x%x", err); - return; - } + ESP_ERROR_CHECK(uart_param_config(UART_NUM_1, &uart_config)); ESP_ERROR_CHECK(uart_set_pin(UART_NUM_1, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); + ESP_ERROR_CHECK(uart_driver_install(UART_NUM_1, BUF_SIZE * 2, 0, 0, NULL,0)); - // xTaskCreate(rx_task, "uart_rx_task", 1024 * 4, NULL, configMAX_PRIORITIES, NULL); - xTaskCreate(meter_zigbee_task_func, "meter_zigbee_task", 4 * 1024, NULL, 5, &meter_zigbee_task); + xTaskCreate(meter_zigbee_task_func, "meter_zigbee_task", 4096, NULL, 5, &meter_zigbee_task); } -void meter_zigbee_stop(void) -{ - ESP_LOGI(TAG, "Stopping"); +void meter_zigbee_stop(void) { + ESP_LOGI(TAG, "Stopping Zigbee UART"); - if (meter_zigbee_task) - { + if (meter_zigbee_task) { vTaskDelete(meter_zigbee_task); meter_zigbee_task = NULL; } - if (port != -1) - { - uart_driver_delete(port); - port = -1; - } -} \ No newline at end of file + uart_driver_delete(UART_NUM_1); +} diff --git a/components/modbus/CMakeLists.txt b/components/modbus/CMakeLists.txt deleted file mode 100755 index c1fda92..0000000 --- a/components/modbus/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -set(srcs - "src/modbus.c") - -idf_component_register(SRCS "${srcs}" - INCLUDE_DIRS "include" - PRIV_INCLUDE_DIRS "src" - PRIV_REQUIRES nvs_flash app_update driver esp_timer - REQUIRES config evse peripherals) diff --git a/components/modbus/idf_component.yml b/components/modbus/idf_component.yml deleted file mode 100755 index 3edafc0..0000000 --- a/components/modbus/idf_component.yml +++ /dev/null @@ -1,17 +0,0 @@ -## IDF Component Manager Manifest File -dependencies: - espressif/esp-modbus: "^1.0.16" - ## Required IDF version - idf: - version: ">=4.1.0" - # # Put list of dependencies here - # # For components maintained by Espressif: - # component: "~1.0.0" - # # For 3rd party components: - # username/component: ">=1.0.0,<2.0.0" - # username2/component2: - # version: "~1.0.0" - # # For transient dependencies `public` flag can be set. - # # `public` flag doesn't have an effect dependencies of the `main` component. - # # All dependencies of `main` are public by default. - # public: true diff --git a/components/modbus/include/modbus.h b/components/modbus/include/modbus.h deleted file mode 100755 index 11f7a41..0000000 --- a/components/modbus/include/modbus.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef MODBUS_H_ -#define MODBUS_H_ - -#define MODBUS_PACKET_SIZE 256 - -#define MODBUS_READ_UINT16(buf, offset) ((uint16_t)(buf[offset] << 8 | buf[offset + 1])) -#define MODBUS_WRITE_UINT16(buf, offset, value) \ - buf[offset] = value >> 8; \ - buf[offset + 1] = value & 0xFF; \ - -#include "esp_err.h" - -/** - * @brief Initialize modbus - * - */ -void modbus_init(void); - -/** - * @brief Process modbus request - * - * @param buf Request/response data - * @param len Length of request data - * @return uint16_t Length of response data, 0 if no response - */ -uint16_t modbus_request_exec(uint8_t *buf, uint16_t len); - -/** - * @brief Get modbus unit id - * - * @return uint8_t - */ -uint8_t modbus_get_unit_id(void); - -/** - * @brief Set modbus unit id - * - * @param unit_id - */ -esp_err_t modbus_set_unit_id(uint8_t unit_id); - -#endif /* MODBUS_H_ */ diff --git a/components/modbus/src/modbus.c b/components/modbus/src/modbus.c deleted file mode 100755 index 989b4d0..0000000 --- a/components/modbus/src/modbus.c +++ /dev/null @@ -1,508 +0,0 @@ -#include -#include -#include "sdkconfig.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "esp_log.h" -#include "esp_timer.h" -#include "esp_ota_ops.h" -#include "nvs.h" - -#include "modbus.h" -#include "evse_api.h" -#include "evse_error.h" -#include "meter.h" -#include "socket_lock.h" -#include "temp_sensor.h" - -#define MODBUS_REG_STATE 100 -#define MODBUS_REG_ERROR 101 // 2 word -#define MODBUS_REG_ENABLED 103 -#define MODBUS_REG_AVAILABLE 104 -#define MODBUS_REG_PENDING_AUTH 105 -#define MODBUS_REG_CHR_CURRENT 106 -#define MODBUS_REG_CONSUMPTION_LIM 107 // 2 word -#define MODBUS_REG_CHR_TIME_LIM 109 // 2 word -#define MODBUS_REG_UNDER_POWER_LIM 111 -#define MODBUS_REG_AUTHORISE 112 - -#define MODBUS_REG_EMETER_POWER 200 -#define MODBUS_REG_EMETER_SES_TIME 201 // 2 word -#define MODBUS_REG_EMETER_CHR_TIME 203 // 2 word -#define MODBUS_REG_EMETER_CONSUMPTION 205 // 2 word -#define MODBUS_REG_EMETER_L1_VTL 207 // 2 word -#define MODBUS_REG_EMETER_L2_VTL 209 // 2 word -#define MODBUS_REG_EMETER_L3_VTL 211 // 2 word -#define MODBUS_REG_EMETER_L1_CUR 213 // 2 word -#define MODBUS_REG_EMETER_L2_CUR 215 // 2 word -#define MODBUS_REG_EMETER_L3_CUR 217 // 2 word - -#define MODBUS_REG_SOCKET_OUTLET 300 -#define MODBUS_REG_RCM 301 -#define MODBUS_REG_TEMP_THRESHOLD 302 -#define MODBUS_REG_REQ_AUTH 303 -#define MODBUS_REG_MAX_CHR_CURRENT 304 -#define MODBUS_REG_DEF_CHR_CURRENT 305 -#define MODBUS_REG_DEF_CONSUMPTION_LIM 306 //2 word -#define MODBUS_REG_DEF_CHR_TIME_LIM 308 //2 word -#define MODBUS_REG_DEF_UNDER_POWER_LIM 310 -#define MODBUS_REG_LOCK_OPERATING_TIME 311 -#define MODBUS_REG_LOCK_BRAKE_TIME 312 -#define MODBUS_REG_LOCK_DET_HI 313 -#define MODBUS_REG_LOCK_RET_COUNT 314 -#define MODBUS_REG_EMETER_MODE 315 -#define MODBUS_REG_EMETER_AC_VLT 316 - -#define MODBUS_REG_UPTIME 400 //2 word -#define MODBUS_REG_TEMP_LOW 402 -#define MODBUS_REG_TEMP_HIGH 403 -#define MODBUS_REG_TEMP_SENSOR_COUNT 404 -#define MODBUS_REG_APP_VERSION 405 //16 word -#define MODBUS_REG_RESTART 421 - -#define MODBUS_EX_NONE 0x00 -#define MODBUS_EX_ILLEGAL_FUNCTION 0x01 -#define MODBUS_EX_ILLEGAL_DATA_ADDRESS 0x02 -#define MODBUS_EX_ILLEGAL_DATA_VALUE 0x03 -#define MODBUS_EX_SLAVE_DEVICE_FAILURE 0x04 -#define MODBUS_EX_ACKNOWLEDGE 0x05 -#define MODBUS_EX_SLAVE_BUSY 0x06 -#define MODBUS_EX_MEMORY_PARITY_ERROR 0x08 - -#define UINT32_GET_HI(value) ((uint16_t)(((uint32_t) (value)) >> 16)) -#define UINT32_GET_LO(value) ((uint16_t)(((uint32_t) (value)) & 0xFFFF)) - -#define NVS_NAMESPACE "modbus" -#define NVS_UNIT_ID "unit_id" - -static const char* TAG = "modbus"; - -static nvs_handle nvs; - -static uint8_t unit_id = 1; - -static void restart_func(void* arg) -{ - vTaskDelay(pdMS_TO_TICKS(5000)); - esp_restart(); - vTaskDelete(NULL); -} - -static void timeout_restart() -{ - xTaskCreate(restart_func, "restart_task", 2 * 1024, NULL, 10, NULL); -} - -void modbus_init(void) -{ - ESP_ERROR_CHECK(nvs_open(NVS_NAMESPACE, NVS_READWRITE, &nvs)); - - nvs_get_u8(nvs, NVS_UNIT_ID, &unit_id); -} - -static uint32_t get_uptime(void) -{ - return esp_timer_get_time() / 1000000; -} - -static bool read_holding_register(uint16_t addr, uint16_t* value) -{ - ESP_LOGD(TAG, "HR read %d", addr); - switch (addr) { - case MODBUS_REG_STATE: - const char* state_str = evse_state_to_str(evse_get_state()); - *value = state_str[0] << 8 | state_str[1]; - break; - case MODBUS_REG_ERROR: - *value = UINT32_GET_HI(evse_get_error()); - break; - case MODBUS_REG_ERROR + 1: - *value = UINT32_GET_LO(evse_get_error()); - break; - case MODBUS_REG_ENABLED: - *value = evse_is_enabled(); - break; - case MODBUS_REG_AVAILABLE: - *value = evse_is_enabled(); - break; - case MODBUS_REG_PENDING_AUTH: - *value = evse_is_pending_auth(); - break; - case MODBUS_REG_CHR_CURRENT: - *value = evse_get_charging_current(); - break; - case MODBUS_REG_CONSUMPTION_LIM: - *value = UINT32_GET_HI(evse_get_consumption_limit()); - break; - case MODBUS_REG_CONSUMPTION_LIM + 1: - *value = UINT32_GET_LO(evse_get_consumption_limit()); - break; - case MODBUS_REG_CHR_TIME_LIM: - *value = UINT32_GET_HI(evse_get_charging_time_limit()); - break; - case MODBUS_REG_CHR_TIME_LIM + 1: - *value = UINT32_GET_LO(evse_get_charging_time_limit()); - break; - case MODBUS_REG_UNDER_POWER_LIM: - *value = evse_get_under_power_limit(); - break; - case MODBUS_REG_EMETER_POWER: - *value = energy_meter_get_power(); - break; - case MODBUS_REG_EMETER_SES_TIME: - *value = UINT32_GET_HI(energy_meter_get_session_time()); - break; - case MODBUS_REG_EMETER_SES_TIME + 1: - *value = UINT32_GET_LO(energy_meter_get_session_time()); - break; - case MODBUS_REG_EMETER_CHR_TIME: - *value = UINT32_GET_HI(energy_meter_get_charging_time()); - break; - case MODBUS_REG_EMETER_CHR_TIME + 1: - *value = UINT32_GET_LO(energy_meter_get_charging_time()); - break; - case MODBUS_REG_EMETER_CONSUMPTION: - *value = UINT32_GET_HI(energy_meter_get_consumption()); - break; - case MODBUS_REG_EMETER_CONSUMPTION + 1: - *value = UINT32_GET_LO(energy_meter_get_consumption()); - break; - case MODBUS_REG_EMETER_L1_VTL: - *value = UINT32_GET_HI(energy_meter_get_l1_voltage() * 1000); - break; - case MODBUS_REG_EMETER_L1_VTL + 1: - *value = UINT32_GET_LO(energy_meter_get_l1_voltage() * 1000); - break; - case MODBUS_REG_EMETER_L2_VTL: - *value = UINT32_GET_HI(energy_meter_get_l2_voltage() * 1000); - break; - case MODBUS_REG_EMETER_L2_VTL + 1: - *value = UINT32_GET_LO(energy_meter_get_l2_voltage() * 1000); - break; - case MODBUS_REG_EMETER_L3_VTL: - *value = UINT32_GET_HI(energy_meter_get_l3_voltage() * 1000); - break; - case MODBUS_REG_EMETER_L3_VTL + 1: - *value = UINT32_GET_LO(energy_meter_get_l3_voltage() * 1000); - break; - case MODBUS_REG_EMETER_L1_CUR: - *value = UINT32_GET_HI(energy_meter_get_l1_current() * 1000); - break; - case MODBUS_REG_EMETER_L1_CUR + 1: - *value = UINT32_GET_LO(energy_meter_get_l1_current() * 1000); - break; - case MODBUS_REG_EMETER_L2_CUR: - *value = UINT32_GET_HI(energy_meter_get_l2_current() * 1000); - break; - case MODBUS_REG_EMETER_L2_CUR + 1: - *value = UINT32_GET_LO(energy_meter_get_l2_current() * 1000); - break; - case MODBUS_REG_EMETER_L3_CUR: - *value = UINT32_GET_HI(energy_meter_get_l3_current() * 1000); - break; - case MODBUS_REG_EMETER_L3_CUR + 1: - *value = UINT32_GET_LO(energy_meter_get_l3_current() * 1000); - break; - case MODBUS_REG_SOCKET_OUTLET: - *value = evse_get_socket_outlet(); - break; - case MODBUS_REG_RCM: - *value = evse_is_rcm(); - break; - case MODBUS_REG_TEMP_THRESHOLD: - *value = evse_get_temp_threshold(); - break; - case MODBUS_REG_REQ_AUTH: - *value = evse_is_require_auth(); - break; - case MODBUS_REG_MAX_CHR_CURRENT: - *value = evse_get_max_charging_current(); - break; - case MODBUS_REG_DEF_CHR_CURRENT: - *value = evse_get_default_charging_current(); - break; - case MODBUS_REG_DEF_CONSUMPTION_LIM: - *value = UINT32_GET_HI(evse_get_default_consumption_limit()); - break; - case MODBUS_REG_DEF_CONSUMPTION_LIM + 1: - *value = UINT32_GET_LO(evse_get_default_consumption_limit()); - break; - case MODBUS_REG_DEF_CHR_TIME_LIM: - *value = UINT32_GET_HI(evse_get_default_charging_time_limit()); - break; - case MODBUS_REG_DEF_CHR_TIME_LIM + 1: - *value = UINT32_GET_LO(evse_get_default_charging_time_limit()); - break; - case MODBUS_REG_DEF_UNDER_POWER_LIM: - *value = evse_get_default_under_power_limit(); - break; - case MODBUS_REG_LOCK_OPERATING_TIME: - *value = socket_lock_get_operating_time(); - break; - case MODBUS_REG_LOCK_BRAKE_TIME: - *value = socket_lock_get_break_time(); - break; - case MODBUS_REG_LOCK_DET_HI: - *value = socket_lock_is_detection_high(); - break; - case MODBUS_REG_LOCK_RET_COUNT: - *value = socket_lock_get_retry_count(); - break; - //case MODBUS_REG_EMETER_MODE: - // *value = energy_meter_get_mode(); - // break; - //case MODBUS_REG_EMETER_AC_VLT: - // *value = energy_meter_get_ac_voltage(); - // break; - case MODBUS_REG_UPTIME: - *value = UINT32_GET_HI(get_uptime()); - break; - case MODBUS_REG_UPTIME + 1: - *value = UINT32_GET_LO(get_uptime()); - break; - case MODBUS_REG_TEMP_LOW: - *value = temp_sensor_get_low(); - break; - case MODBUS_REG_TEMP_HIGH: - *value = temp_sensor_get_high(); - break; - case MODBUS_REG_TEMP_SENSOR_COUNT: - *value = temp_sensor_get_count(); - break; - default: - //string registers - if (addr >= MODBUS_REG_APP_VERSION && addr <= MODBUS_REG_APP_VERSION + 16) { - const esp_app_desc_t* app_desc = esp_app_get_description(); - *value = app_desc->version[(addr - MODBUS_REG_APP_VERSION) * 2] << 8 | app_desc->version[(addr - MODBUS_REG_APP_VERSION) * 2 + 1]; - } else { - return MODBUS_EX_ILLEGAL_DATA_ADDRESS; - } - } - return MODBUS_EX_NONE; -} - -static bool write_holding_register(uint16_t addr, uint8_t* buffer, uint16_t left) -{ - uint16_t value = MODBUS_READ_UINT16(buffer, 0); - ESP_LOGD(TAG, "HR write %d = %d", addr, value); - switch (addr) { - case MODBUS_REG_ENABLED: - if (value > 1) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - evse_set_enabled(value); - break; - case MODBUS_REG_AVAILABLE: - if (value > 1) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - evse_set_available(value); - break; - case MODBUS_REG_CHR_CURRENT: - if (evse_set_charging_current(value) != ESP_OK) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - break; - case MODBUS_REG_CONSUMPTION_LIM: - if (left > 0) { - evse_set_consumption_limit(value << 16 | MODBUS_READ_UINT16(buffer, 2)); - } else { - return MODBUS_EX_ILLEGAL_DATA_ADDRESS; - } - break; - case MODBUS_REG_CONSUMPTION_LIM + 1: - break; - case MODBUS_REG_CHR_TIME_LIM: - if (left > 0) { - evse_set_charging_time_limit(value << 16 | MODBUS_READ_UINT16(buffer, 2)); - } else { - return MODBUS_EX_ILLEGAL_DATA_ADDRESS; - } - break; - case MODBUS_REG_CHR_TIME_LIM + 1: - break; - case MODBUS_REG_UNDER_POWER_LIM: - evse_set_under_power_limit(value); - break; - case MODBUS_REG_AUTHORISE: - if (value != 1) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - evse_authorize(); - break; - case MODBUS_REG_SOCKET_OUTLET: - if (value != 0 || value != 1) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - if (evse_set_socket_outlet(value) != ESP_OK) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - break; - case MODBUS_REG_RCM: - if (value != 0 || value != 1) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - if (evse_set_rcm(value) != ESP_OK) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - break; - case MODBUS_REG_TEMP_THRESHOLD: - if (evse_set_temp_threshold(value) != ESP_OK) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - break; - case MODBUS_REG_REQ_AUTH: - if (value != 0 || value != 1) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - evse_set_require_auth(value); - break; - case MODBUS_REG_MAX_CHR_CURRENT: - if (evse_set_max_charging_current(value) != ESP_OK) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - break; - case MODBUS_REG_DEF_CHR_CURRENT: - if (evse_set_default_charging_current(value) != ESP_OK) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - break; - case MODBUS_REG_DEF_CONSUMPTION_LIM: - if (left > 0) { - evse_set_default_consumption_limit(value << 16 | MODBUS_READ_UINT16(buffer, 2)); - } else { - return MODBUS_EX_ILLEGAL_DATA_ADDRESS; - } - break; - case MODBUS_REG_DEF_CONSUMPTION_LIM + 1: - break; - case MODBUS_REG_DEF_CHR_TIME_LIM: - if (left > 0) { - evse_set_default_charging_time_limit(value << 16 | MODBUS_READ_UINT16(buffer, 2)); - } else { - return MODBUS_EX_ILLEGAL_DATA_ADDRESS; - } - break; - case MODBUS_REG_DEF_CHR_TIME_LIM + 1: - break; - case MODBUS_REG_DEF_UNDER_POWER_LIM: - evse_set_default_under_power_limit(value); - break; - case MODBUS_REG_LOCK_OPERATING_TIME: - if (socket_lock_set_operating_time(value) != ESP_OK) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - break; - case MODBUS_REG_LOCK_BRAKE_TIME: - if (socket_lock_set_break_time(value) != ESP_OK) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - break; - case MODBUS_REG_LOCK_DET_HI: - if (value != 0 || value != 1) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - socket_lock_set_detection_high(value); - break; - case MODBUS_REG_LOCK_RET_COUNT: - if (value > UINT8_MAX) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - socket_lock_set_retry_count(value); - break; - /* - case MODBUS_REG_EMETER_MODE: - if (energy_meter_set_mode(value) != ESP_OK) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - break; - case MODBUS_REG_EMETER_AC_VLT: - if (energy_meter_set_ac_voltage(value) != ESP_OK) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - break; - */ - case MODBUS_REG_RESTART: - if (value != 1) { - return MODBUS_EX_ILLEGAL_DATA_VALUE; - } - timeout_restart(); - break; - default: - return MODBUS_EX_ILLEGAL_DATA_ADDRESS; - } - return MODBUS_EX_NONE; -} - -uint16_t modbus_request_exec(uint8_t* data, uint16_t len) -{ - uint16_t resp_len = 0; - - if (unit_id == data[0]) { - uint8_t fc = data[1]; - uint16_t addr; - uint16_t count; - uint16_t value; - uint8_t ex = MODBUS_EX_NONE; - - if (fc == 3) { - addr = MODBUS_READ_UINT16(data, 2); - count = MODBUS_READ_UINT16(data, 4); - - data[2] = count * 2; - resp_len = 3 + count * 2; - - for (uint16_t i = 0; i < count; i++) { - if ((ex = read_holding_register(addr + i, &value)) != MODBUS_EX_NONE) { - break; - } - MODBUS_WRITE_UINT16(data, 3 + 2 * i, value); - } - } else if (fc == 6) { - addr = MODBUS_READ_UINT16(data, 2); - - resp_len = 6; - - ex = write_holding_register(addr, &data[4], 0); - } else if (fc == 16) { - addr = MODBUS_READ_UINT16(data, 2); - count = MODBUS_READ_UINT16(data, 4); - - resp_len = 6; - - for (uint16_t i = 0; i < count; i++) { - if ((ex = write_holding_register(addr + i, &data[7 + 2 * i], count - i)) != MODBUS_EX_NONE) { - break; - } - } - } else { - ex = MODBUS_EX_ILLEGAL_FUNCTION; - } - - if (ex != MODBUS_EX_NONE) { - data[1] = 0x8 | fc; - data[2] = ex; - resp_len = 3; - } - } - - return resp_len; -} - -uint8_t modbus_get_unit_id(void) -{ - return unit_id; -} - -esp_err_t modbus_set_unit_id(uint8_t _unit_id) -{ - if (_unit_id == 0) { - ESP_LOGE(TAG, "Unit id cant be 0"); - return ESP_ERR_INVALID_ARG; - } - - unit_id = _unit_id; - nvs_set_u8(nvs, NVS_UNIT_ID, unit_id); - - return ESP_OK; -} diff --git a/components/ocpp/CMakeLists.txt b/components/ocpp/CMakeLists.txt index 261f343..be0cd8f 100755 --- a/components/ocpp/CMakeLists.txt +++ b/components/ocpp/CMakeLists.txt @@ -5,4 +5,4 @@ set(srcs idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "include" PRIV_REQUIRES nvs_flash - REQUIRES config esp_wifi evse ade7758 mongoose MicroOcpp MicroOcppMongoose) + REQUIRES config esp_wifi evse mongoose MicroOcpp MicroOcppMongoose) diff --git a/components/ocpp/src/ocpp.c b/components/ocpp/src/ocpp.c index 062f100..c35b584 100755 --- a/components/ocpp/src/ocpp.c +++ b/components/ocpp/src/ocpp.c @@ -6,7 +6,6 @@ #include "evse_state.h" #include "esp_wifi.h" -#include "meter.h" #include "orno_modbus.h" #include "nvs.h" @@ -149,22 +148,12 @@ bool setEvseReadyInput() // return false; } -#include "meter.h" -#include "esp_log.h" - -#define TAG "ocpp_input" // ou o nome adequado do seu módulo - float setPowerMeterInput() { ESP_LOGI(TAG, "PowerMeterInput"); - - if (!meter_is_running()) { - ESP_LOGW(TAG, "Meter not running, returning fallback value."); - return 0.0f; - } - - MeterData data = meter_getData(); - return data.wattA + data.wattB + data.wattC; + //MeterData data = meter_getData(); + //return data.wattA + data.wattB + data.wattC; + return 0.0f; } float setEnergyMeterInput() @@ -187,6 +176,7 @@ float setCurrentInput() { ESP_LOGI(TAG, "CurrentInput"); + /* if (!meter_is_running()) { ESP_LOGW(TAG, "Meter not running, returning fallback."); return 0.0f; @@ -194,12 +184,15 @@ float setCurrentInput() MeterData data = meter_getData(); return data.irmsA; + */ + return 0; } float setVoltageInput() { ESP_LOGI(TAG, "VoltageInput"); + /* if (!meter_is_running()) { ESP_LOGW(TAG, "Meter not running, returning fallback."); return 0.0f; @@ -207,6 +200,8 @@ float setVoltageInput() MeterData data = meter_getData(); return data.vrmsA; + */ + return 0.0f; } float setTemperatureInput() @@ -219,7 +214,8 @@ float setPowerInput() { ESP_LOGI(TAG, "PowerInput"); // return (float)orno_modbus_get_meter_state().activepower; - return meter_getData().wattA + meter_getData().wattB + meter_getData().wattC; + //return meter_getData().wattA + meter_getData().wattB + meter_getData().wattC; + return 0; } void setSmartChargingCurrentOutput(float limit) diff --git a/components/peripherals/CMakeLists.txt b/components/peripherals/CMakeLists.txt index 803e19b..f5ea2b1 100755 --- a/components/peripherals/CMakeLists.txt +++ b/components/peripherals/CMakeLists.txt @@ -19,4 +19,4 @@ set(srcs idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "include" PRIV_REQUIRES nvs_flash driver esp_adc esp_timer - REQUIRES config evse api ade7758 ntc_driver) + REQUIRES config evse api ntc_driver) diff --git a/components/peripherals/src/peripherals.c b/components/peripherals/src/peripherals.c index 61fc36f..76b6ce2 100755 --- a/components/peripherals/src/peripherals.c +++ b/components/peripherals/src/peripherals.c @@ -7,7 +7,6 @@ #include "ac_relay.h" #include "socket_lock.h" #include "rcm.h" -#include "meter.h" #include "aux_io.h" #include "ntc_sensor.h" @@ -21,7 +20,7 @@ void peripherals_init(void) proximity_init(); // socket_lock_init(); // rcm_init(); - energy_meter_init(); + //energy_meter_init(); // aux_init(); ntc_sensor_init(); } \ No newline at end of file diff --git a/dependencies.lock b/dependencies.lock index 6dcc77b..ffb477c 100755 --- a/dependencies.lock +++ b/dependencies.lock @@ -5,12 +5,6 @@ dependencies: service_url: https://api.components.espressif.com/ type: service version: 0.5.3 - espressif/esp-modbus: - component_hash: 2168e6b4cbda4d0281a2a2d1a40a3848e231473b2690d73217e3600fd2c98c12 - source: - service_url: https://api.components.espressif.com/ - type: service - version: 1.0.16 espressif/mdns: component_hash: 3ec0af5f6bce310512e90f482388d21cc7c0e99668172d2f895356165fc6f7c5 source: @@ -28,6 +22,6 @@ dependencies: source: type: idf version: 5.3.0 -manifest_hash: c3d3273b8d8a591808187df8795265e85b441d0c189d0c969b6afb32d9166bac +manifest_hash: 182b2719a9746e2efb089e041f2387b8dedb900344831b6f5b6ce215a485c67f target: esp32 version: 1.0.0 diff --git a/managed_components/espressif__cmake_utilities/.component_hash b/managed_components/espressif__cmake_utilities/.component_hash old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/CHANGELOG.md b/managed_components/espressif__cmake_utilities/CHANGELOG.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/CMakeLists.txt b/managed_components/espressif__cmake_utilities/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/Kconfig b/managed_components/espressif__cmake_utilities/Kconfig old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/README.md b/managed_components/espressif__cmake_utilities/README.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/cmake_utilities.cmake b/managed_components/espressif__cmake_utilities/cmake_utilities.cmake old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/docs/gcc.md b/managed_components/espressif__cmake_utilities/docs/gcc.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/docs/gen_compressed_ota.md b/managed_components/espressif__cmake_utilities/docs/gen_compressed_ota.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/docs/relinker.md b/managed_components/espressif__cmake_utilities/docs/relinker.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/gcc.cmake b/managed_components/espressif__cmake_utilities/gcc.cmake old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/gen_compressed_ota.cmake b/managed_components/espressif__cmake_utilities/gen_compressed_ota.cmake old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/gen_single_bin.cmake b/managed_components/espressif__cmake_utilities/gen_single_bin.cmake old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/idf_component.yml b/managed_components/espressif__cmake_utilities/idf_component.yml old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/license.txt b/managed_components/espressif__cmake_utilities/license.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/package_manager.cmake b/managed_components/espressif__cmake_utilities/package_manager.cmake old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/project_include.cmake b/managed_components/espressif__cmake_utilities/project_include.cmake old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/relinker.cmake b/managed_components/espressif__cmake_utilities/relinker.cmake old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/scripts/gen_custom_ota.py b/managed_components/espressif__cmake_utilities/scripts/gen_custom_ota.py old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/scripts/relinker/configuration.py b/managed_components/espressif__cmake_utilities/scripts/relinker/configuration.py old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/function.csv b/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/function.csv old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/library.csv b/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/library.csv old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/object.csv b/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/object.csv old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/scripts/relinker/relinker.py b/managed_components/espressif__cmake_utilities/scripts/relinker/relinker.py old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/CMakeLists.txt b/managed_components/espressif__cmake_utilities/test_apps/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/CMakeLists.txt b/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/idf_component.yml b/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/idf_component.yml old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.c b/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.h b/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/CMakeLists.txt b/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/idf_component.yml b/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/idf_component.yml old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.c b/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.h b/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/main/CMakeLists.txt b/managed_components/espressif__cmake_utilities/test_apps/main/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/main/test_cmake_utilities.c b/managed_components/espressif__cmake_utilities/test_apps/main/test_cmake_utilities.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__cmake_utilities/test_apps/pytest_cmake_utilities.py b/managed_components/espressif__cmake_utilities/test_apps/pytest_cmake_utilities.py old mode 100755 new mode 100644 diff --git a/managed_components/espressif__esp-modbus/.component_hash b/managed_components/espressif__esp-modbus/.component_hash deleted file mode 100755 index fd7202e..0000000 --- a/managed_components/espressif__esp-modbus/.component_hash +++ /dev/null @@ -1 +0,0 @@ -2168e6b4cbda4d0281a2a2d1a40a3848e231473b2690d73217e3600fd2c98c12 \ No newline at end of file diff --git a/managed_components/espressif__esp-modbus/.gitignore b/managed_components/espressif__esp-modbus/.gitignore deleted file mode 100755 index 46ceede..0000000 --- a/managed_components/espressif__esp-modbus/.gitignore +++ /dev/null @@ -1,49 +0,0 @@ -.config -*.o -*.pyc - -# gtags -GTAGS -GRTAGS -GPATH - -# emacs -.dir-locals.el - -# emacs temp file suffixes -*~ -.#* -\#*# - -# eclipse setting -.settings - -# MacOS directory files -.DS_Store - -# Test files -test/build -test/sdkconfig -test/sdkconfig.old - -# Doc build artifacts -docs/_build/ -docs/doxygen-warning-log.txt -docs/sphinx-warning-log.txt -docs/sphinx-warning-log-sanitized.txt -docs/xml/ -docs/xml_in/ -docs/man/ -docs/doxygen_sqlite3.db - -TEST_LOGS - - -# gcov coverage reports -*.gcda -*.gcno -coverage.info -coverage_report/ - -# VS Code Settings -.vscode/ diff --git a/managed_components/espressif__esp-modbus/CMakeLists.txt b/managed_components/espressif__esp-modbus/CMakeLists.txt deleted file mode 100755 index 391abac..0000000 --- a/managed_components/espressif__esp-modbus/CMakeLists.txt +++ /dev/null @@ -1,78 +0,0 @@ -# The following five lines of boilerplate have to be in your project's -# CMakeLists in this exact order for cmake to work correctly -set(srcs - "common/esp_modbus_master.c" - "common/esp_modbus_slave.c" - "modbus/mb.c" - "modbus/mb_m.c" - "modbus/ascii/mbascii.c" - "modbus/ascii/mbascii_m.c" - "modbus/rtu/mbrtu_m.c" - "modbus/rtu/mbrtu.c" - "modbus/rtu/mbcrc.c" - "modbus/tcp/mbtcp.c" - "modbus/tcp/mbtcp_m.c" - "port/port.c" - "port/portevent.c" - "port/portevent_m.c" - "port/portother.c" - "port/portother_m.c" - "port/portserial.c" - "port/portserial_m.c" - "port/porttimer.c" - "port/porttimer_m.c" - "modbus/functions/mbfunccoils.c" - "modbus/functions/mbfunccoils_m.c" - "modbus/functions/mbfuncdiag.c" - "modbus/functions/mbfuncdisc.c" - "modbus/functions/mbfuncdisc_m.c" - "modbus/functions/mbfuncholding.c" - "modbus/functions/mbfuncholding_m.c" - "modbus/functions/mbfuncinput.c" - "modbus/functions/mbfuncinput_m.c" - "modbus/functions/mbfuncother.c" - "modbus/functions/mbutils.c" - "serial_slave/modbus_controller/mbc_serial_slave.c" - "serial_master/modbus_controller/mbc_serial_master.c" - "tcp_slave/port/port_tcp_slave.c" - "tcp_slave/modbus_controller/mbc_tcp_slave.c" - "tcp_master/modbus_controller/mbc_tcp_master.c" - "tcp_master/port/port_tcp_master.c" - "common/esp_modbus_master_tcp.c" - "common/esp_modbus_slave_tcp.c" - "common/esp_modbus_master_serial.c" - "common/esp_modbus_slave_serial.c") - -set(include_dirs common/include) - -set(priv_include_dirs common port modbus modbus/ascii modbus/functions - modbus/rtu modbus/tcp modbus/include) - -list(APPEND priv_include_dirs serial_slave/port serial_slave/modbus_controller - serial_master/port serial_master/modbus_controller - tcp_slave/port tcp_slave/modbus_controller - tcp_master/port tcp_master/modbus_controller) - -if(CONFIG_FMB_EXT_TYPE_SUPPORT) - list(APPEND srcs "common/mb_endianness_utils.c") -endif() - -add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/freemodbus/" ${srcs}) -add_prefix(include_dirs "${CMAKE_CURRENT_LIST_DIR}/freemodbus/" ${include_dirs}) -add_prefix(priv_include_dirs "${CMAKE_CURRENT_LIST_DIR}/freemodbus/" ${priv_include_dirs}) - -message(STATUS "DEBUG: Use esp-modbus component folder: ${CMAKE_CURRENT_LIST_DIR}.") - -set(requires driver lwip) - -# esp_timer component was introduced in v4.2 -if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_GREATER "4.1") - list(APPEND requires esp_timer) -endif() - -idf_component_register(SRCS "${srcs}" - INCLUDE_DIRS "${include_dirs}" - PRIV_INCLUDE_DIRS "${priv_include_dirs}" - REQUIRES ${requires} - PRIV_REQUIRES esp_netif) - diff --git a/managed_components/espressif__esp-modbus/Kconfig b/managed_components/espressif__esp-modbus/Kconfig deleted file mode 100755 index 3b2a2e2..0000000 --- a/managed_components/espressif__esp-modbus/Kconfig +++ /dev/null @@ -1,233 +0,0 @@ -menu "Modbus configuration" - - config FMB_COMM_MODE_TCP_EN - bool "Enable Modbus stack support for TCP communication mode" - default y - help - Enable Modbus TCP option for stack. - - config FMB_TCP_PORT_DEFAULT - int "Modbus TCP port number" - range 0 65535 - default 502 - depends on FMB_COMM_MODE_TCP_EN - help - Modbus default port number used by Modbus TCP stack - - config FMB_TCP_PORT_MAX_CONN - int "Maximum allowed connections for TCP stack" - range 1 8 - default 5 - depends on FMB_COMM_MODE_TCP_EN - help - Maximum allowed connections number for Modbus TCP stack. - This is used by Modbus master and slave port layer to establish connections. - This parameter may decrease performance of Modbus stack and can cause - increasing of processing time (increase only if absolutely necessary). - - config FMB_TCP_CONNECTION_TOUT_SEC - int "Modbus TCP connection timeout" - range 1 3600 - default 20 - depends on FMB_COMM_MODE_TCP_EN - help - Modbus TCP connection timeout in seconds. - Once expired the current connection with the client will be closed - and Modbus slave will be waiting for new connection to accept. - - config FMB_TCP_UID_ENABLED - bool "Modbus TCP enable UID (Unit Identifier) support" - default n - depends on FMB_COMM_MODE_TCP_EN - help - If this option is set the Modbus stack uses UID (Unit Identifier) field in MBAP frame. - Else the UID is ignored by master and slave. - - config FMB_COMM_MODE_RTU_EN - bool "Enable Modbus stack support for RTU mode" - default y - help - Enable RTU Modbus communication mode option for Modbus serial stack. - - config FMB_COMM_MODE_ASCII_EN - bool "Enable Modbus stack support for ASCII mode" - default y - help - Enable ASCII Modbus communication mode option for Modbus serial stack. - - config FMB_MASTER_TIMEOUT_MS_RESPOND - int "Slave respond timeout (Milliseconds)" - default 3000 - range 150 15000 - help - If master sends a frame which is not broadcast, it has to wait sometime for slave response. - if slave is not respond in this time, the master will process timeout error. - - config FMB_MASTER_DELAY_MS_CONVERT - int "Slave conversion delay (Milliseconds)" - default 200 - range 150 2000 - help - If master sends a broadcast frame, it has to wait conversion time to delay, - then master can send next frame. - - config FMB_QUEUE_LENGTH - int "Modbus serial task queue length" - range 0 200 - default 20 - help - Modbus serial driver queue length. It is used by event queue task. - See the serial driver API for more information. - - config FMB_PORT_TASK_STACK_SIZE - int "Modbus port task stack size" - range 2048 8192 - default 4096 - help - Modbus port task stack size for rx/tx event processing. - It may be adjusted when debugging is enabled (for example). - - config FMB_SERIAL_BUF_SIZE - int "Modbus serial task RX/TX buffer size" - range 0 2048 - default 256 - help - Modbus serial task RX and TX buffer size for UART driver initialization. - This buffer is used for modbus frame transfer. The Modbus protocol maximum - frame size is 256 bytes. Bigger size can be used for non standard implementations. - - config FMB_SERIAL_ASCII_BITS_PER_SYMB - int "Number of data bits per ASCII character" - default 8 - range 7 8 - depends on FMB_COMM_MODE_ASCII_EN - help - This option defines the number of data bits per ASCII character. - - config FMB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS - int "Wait before send for ASCII communication mode (ms)" - default 0 - range 0 1000 - depends on FMB_COMM_MODE_ASCII_EN - help - This option defines timeout before slave sends the response in ASCII communication mode. - This allows to work with slow masters. Zero means delay before send is disabled. - - config FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS - int "Response timeout for ASCII communication mode (ms)" - default 1000 - range 200 5000 - depends on FMB_COMM_MODE_ASCII_EN - help - This option defines response timeout of slave in milliseconds for ASCII communication mode. - Thus the timeout will expire and allow the master program to handle the error. - - config FMB_PORT_TASK_PRIO - int "Modbus port task priority" - range 3 23 - default 10 - help - Modbus port data processing task priority. - The priority of Modbus controller task is equal to (CONFIG_FMB_PORT_TASK_PRIO - 1). - - choice FMB_PORT_TASK_AFFINITY - prompt "Modbus task affinity" - default FMB_PORT_TASK_AFFINITY_CPU0 - depends on !FREERTOS_UNICORE - help - Allows setting the core affinity of the Modbus controller task, i.e. whether the task is pinned to - particular CPU, or allowed to run on any CPU. - - config FMB_PORT_TASK_AFFINITY_NO_AFFINITY - bool "No affinity" - config FMB_PORT_TASK_AFFINITY_CPU0 - bool "CPU0" - config FMB_PORT_TASK_AFFINITY_CPU1 - bool "CPU1" - - endchoice - - config FMB_PORT_TASK_AFFINITY - hex - default FREERTOS_NO_AFFINITY if FMB_PORT_TASK_AFFINITY_NO_AFFINITY || FREERTOS_UNICORE - default 0x0 if FMB_PORT_TASK_AFFINITY_CPU0 - default 0x1 if FMB_PORT_TASK_AFFINITY_CPU1 - - config FMB_CONTROLLER_SLAVE_ID_SUPPORT - bool "Modbus controller slave ID support" - default y - help - Modbus slave ID support enable. - When enabled the Modbus command is supported by stack. - - config FMB_CONTROLLER_SLAVE_ID - hex "Modbus controller slave ID" - range 0 4294967295 - default 0x00112233 - depends on FMB_CONTROLLER_SLAVE_ID_SUPPORT - help - Modbus slave ID value to identify modbus device - in the network using command. - Most significant byte of ID is used as short device ID and - other three bytes used as long ID. - - config FMB_CONTROLLER_NOTIFY_TIMEOUT - int "Modbus controller notification timeout (ms)" - range 0 200 - default 20 - help - Modbus controller notification timeout in milliseconds. - This timeout is used to send notification about accessed parameters. - - config FMB_CONTROLLER_NOTIFY_QUEUE_SIZE - int "Modbus controller notification queue size" - range 0 200 - default 20 - help - Modbus controller notification queue size. - The notification queue is used to get information about accessed parameters. - - config FMB_CONTROLLER_STACK_SIZE - int "Modbus controller stack size" - range 0 8192 - default 4096 - help - Modbus controller task stack size. The Stack size may be adjusted when - debug mode is used which requires more stack size (for example). - - config FMB_EVENT_QUEUE_TIMEOUT - int "Modbus stack event queue timeout (ms)" - range 0 500 - default 20 - help - Modbus stack event queue timeout in milliseconds. This may help to optimize - Modbus stack event processing time. - - config FMB_TIMER_PORT_ENABLED - bool "Modbus stack use timer for 3.5T symbol time measurement" - default n - help - If this option is set the Modbus stack uses timer for T3.5 time measurement. - Else the internal UART TOUT timeout is used for 3.5T symbol time measurement. - - config FMB_TIMER_USE_ISR_DISPATCH_METHOD - bool "Modbus timer uses ISR dispatch method" - default n - select ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD - select UART_ISR_IN_IRAM - help - If this option is set the Modbus stack uses ISR dispatch method - to send timeout events from the callback function called from ISR. - This option has dependency with the UART_ISR_IN_IRAM option which places UART interrupt - handler into IRAM to prevent delays related to processing of UART events. - - config FMB_EXT_TYPE_SUPPORT - bool "Modbus uses extended types to support third party devices" - default n - help - If this option is set the Modbus stack supports extended list of types - in data dictionary and conversion API to work with the extended types - otherwise the only legacy types are supported. The extended types include - integer, float, double types with different endianness and size. - -endmenu diff --git a/managed_components/espressif__esp-modbus/LICENSE b/managed_components/espressif__esp-modbus/LICENSE deleted file mode 100755 index 7a4a3ea..0000000 --- a/managed_components/espressif__esp-modbus/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/managed_components/espressif__esp-modbus/README.md b/managed_components/espressif__esp-modbus/README.md deleted file mode 100755 index 57ee2f3..0000000 --- a/managed_components/espressif__esp-modbus/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# ESP-Modbus Library - -## Overview - -An Espressif ESP-Modbus Library (esp-modbus) is a library to support Modbus communication in the networks based on RS485, WiFi, Ethernet interfaces. The Modbus is a data communications protocol originally published by Modicon (now Schneider Electric) in 1979 for use with its programmable logic controllers (PLCs). - -* [ESP-Modbus component on GitHub](https://www.github.com/espressif/esp-modbus) - -This library is to be used with Espressif’s IoT Development Framework, [ESP_IDF](https://github.com/espressif/esp-idf). The packages from this repository are uploaded to Espressif’s component repository. - -* [esp-modbus component in component repository](https://components.espressif.com/component/espressif/esp-modbus) - -You can add the component to your project via `idf.py add-dependency`. More information about idf-component-manager can be found in [Espressif API guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html) or [PyPi registry](https://pypi.org/project/idf-component-manager). - -The ESP-Modbus library can be used with ESP-IDF v4.1 and later. ESP-IDF v4.x releases include an earlier version of ESP-Modbus library inside freemodbus component. To use ESP-Modbus with these releases, users need to exclude the built-in freemodbus component from the build process, and update application components to depend on esp-modbus component instead. To exclude freemodbus component from compilation, add the following line to the project CMakeLists.txt file: - -``` -set(EXCLUDE_COMPONENTS freemodbus) -``` - -ESP-IDF v5.x and later releases do not include freemodbus component, so no extra steps are necessary when adding esp-modbus component. - -## Documentation - -The documentation can be found on the link below: - -* [ESP-Modbus documentation (English)](https://docs.espressif.com/projects/esp-modbus) - -## Application Examples - -The examples below demonstrate the ESP-Modbus library of serial, TCP ports for slave and master implementations accordingly. - -- [Modbus serial slave example](https://github.com/espressif/esp-idf/tree/master/examples/protocols/modbus/serial/mb_slave) - -- [Modbus serial master example](https://github.com/espressif/esp-idf/tree/master/examples/protocols/modbus/serial/mb_master) - -- [Modbus TCP master example](https://github.com/espressif/esp-idf/tree/master/examples/protocols/modbus/tcp/mb_tcp_master) - -- [Modbus TCP slave example](https://github.com/espressif/esp-idf/tree/master/examples/protocols/modbus/tcp/mb_tcp_slave) - -Please refer to the specific example README.md for details. - -## Protocol References - -- [Modbus Organization with protocol specifications](https://modbus.org/specs.php) - -## Contributing - -We welcome contributions to this project in the form of bug reports, feature requests and pull requests. - -Issue reports and feature requests can be submitted using Github Issues: https://github.com/espressif/esp-modbus/issues. Please check if the issue has already been reported before opening a new one. - -Contributions in the form of pull requests should follow ESP-IDF project's [contribution guidelines](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/contribute/index.html). We kindly ask developers to start a discussion on an issue before proposing large changes to the project. - -See the beta version of stack v2.0.0_beta introduced [here](https://github.com/espressif/esp-modbus/discussions/45) - -## Licence - -ESP-Modbus project is based on [FreeMODBUS library](https://github.com/cwalter-at/freemodbus), Copyright (c) 2006 Christian Walter and licensed under the BSD 3-clause license. - -Modbus Master related code is Copyright (c) 2013 Armink and licensed under BSD 3-clause license. - -All original code in this repository is Copyright (c) 2016-2022 Espressif Systems (Shanghai) Co. Ltd. - -The project is distributed under Apache 2.0 license. See the accompanying [LICENSE file](https://github.com/espressif/esp-modbus/blob/master/LICENSE) for a copy. \ No newline at end of file diff --git a/managed_components/espressif__esp-modbus/build_all.sh b/managed_components/espressif__esp-modbus/build_all.sh deleted file mode 100755 index 0be0e57..0000000 --- a/managed_components/espressif__esp-modbus/build_all.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash -# -# Build the test app and all examples from the examples directory. -# Expects TEST_TARGETS environment variables to be set. -# Each variable is the list of IDF_TARGET values to build the examples and -# the test app for, respectively. -# -# ----------------------------------------------------------------------------- -# Safety settings (see https://gist.github.com/ilg-ul/383869cbb01f61a51c4d). - -if [[ -n "${DEBUG_SHELL}" ]] -then - set -x # Activate the expand mode if DEBUG is anything but empty. -fi - -if [[ -z "${EXAMPLE_TARGETS}" || -z "${TEST_TARGETS}" ]] -then - echo "EXAMPLE_TARGETS and TEST_TARGETS environment variables must be set before calling this script" - exit 1 -fi - -if [[ -z "${SKIP_GNU_MAKE_BUILD}" ]] -then - echo "SKIP_GNU_MAKE_BUILD not set, will build with GNU Make based build system as well." - export SKIP_GNU_MAKE_BUILD=0 -fi - -set -o errexit # Exit if command failed. -set -o pipefail # Exit if pipe failed. -set -o nounset # Exit if variable not set. - - -STARS='***************************************************' - -# ----------------------------------------------------------------------------- - -die() { - echo "${1:-"Unknown Error"}" 1>&2 - exit 1 -} - -# build_for_targets -# call this in the project directory -function build_for_targets -{ - target_list="$1" - for IDF_TARGET in ${target_list} - do - export IDF_TARGET - if [[ "${IDF_TARGET}" = "esp32" ]] && [[ "${SKIP_GNU_MAKE_BUILD}" = "0" ]] - then - echo "${STARS}" - echo "Building in $PWD with Make" - # -j option will be set via MAKEFLAGS in .gitlab-ci.yml - # shellcheck disable=SC2015 - make defconfig && make || die "Make build in ${PWD} has failed" - rm -rf build - fi - - echo "${STARS}" - echo "Building in $PWD with CMake for ${IDF_TARGET}" - preview_target= - if [[ ${IDF_TARGET} == "esp32c6" ]] - then - preview_target="--preview" - fi - if [[ ${IDF_TARGET} != "esp32" ]] - then - # IDF 4.0 doesn't support idf.py set-target, and only supports esp32. - idf.py ${preview_target} set-target "${IDF_TARGET}" - fi - idf.py build || die "CMake build in ${PWD} has failed for ${IDF_TARGET}" - idf.py fullclean - done -} - -function build_folders -{ - pushd "$1" - EXAMPLES=$(find . -maxdepth 1 -mindepth 1 -type d | cut -d '/' -f 2) - for NAME in ${EXAMPLES} - do - cd "${NAME}" - build_for_targets "$2" - cd .. - done - popd -} - -echo "${STARS}" -# Build the tests -build_folders test/serial "${TEST_TARGETS}" -echo "${STARS}" -# Build the tests -build_folders test/tcp "${TEST_TARGETS}" -echo "${STARS}" - diff --git a/managed_components/espressif__esp-modbus/component.mk b/managed_components/espressif__esp-modbus/component.mk deleted file mode 100755 index a596857..0000000 --- a/managed_components/espressif__esp-modbus/component.mk +++ /dev/null @@ -1,29 +0,0 @@ -INCLUDEDIRS := common/include -PRIV_INCLUDEDIRS := common port modbus modbus/ascii modbus/functions -PRIV_INCLUDEDIRS += modbus/rtu modbus/tcp modbus/include -PRIV_INCLUDEDIRS += serial_slave/port serial_slave/modbus_controller -PRIV_INCLUDEDIRS += serial_master/port serial_master/modbus_controller -PRIV_INCLUDEDIRS += tcp_slave/port tcp_slave/modbus_controller -PRIV_INCLUDEDIRS += tcp_master/port tcp_master/modbus_controller -SRCDIRS := common -SRCDIRS += modbus modbus/ascii modbus/functions modbus/rtu modbus/tcp -SRCDIRS += serial_slave/port serial_slave/modbus_controller -SRCDIRS += serial_master/port serial_master/modbus_controller -SRCDIRS += tcp_slave/port tcp_slave/modbus_controller -SRCDIRS += tcp_master/port tcp_master/modbus_controller -SRCDIRS += port - -COMPONENT_PRIV_INCLUDEDIRS = $(addprefix freemodbus/, \ - $(PRIV_INCLUDEDIRS) \ - ) - -COMPONENT_SRCDIRS = $(addprefix freemodbus/, \ - $(SRCDIRS) \ - ) - -COMPONENT_ADD_INCLUDEDIRS = $(addprefix freemodbus/, \ - $(INCLUDEDIRS) \ - ) - - - diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_callbacks.h b/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_callbacks.h deleted file mode 100755 index 6bcd15f..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_callbacks.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -// Stack callback functions prototypes - -#ifndef _ESP_MODBUS_CALLBACKS_H_ -#define _ESP_MODBUS_CALLBACKS_H_ - -#include "mb.h" -#include "mb_m.h" - -typedef eMBErrorCode (*reg_input_cb)(UCHAR*, USHORT, USHORT); -typedef eMBErrorCode (*reg_holding_cb)(UCHAR*, USHORT, USHORT, eMBRegisterMode); -typedef eMBErrorCode (*reg_coils_cb)(UCHAR*, USHORT, USHORT, eMBRegisterMode); -typedef eMBErrorCode (*reg_discrete_cb)(UCHAR*, USHORT, USHORT); - -#endif /* _ESP_MODBUS_CALLBACKS_H_ */ diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_master.c b/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_master.c deleted file mode 100755 index a0af76c..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_master.c +++ /dev/null @@ -1,532 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include "esp_err.h" // for esp_err_t -#include "mbc_master.h" // for master interface define -#include "esp_modbus_master.h" // for public interface defines -#include "esp_modbus_callbacks.h" // for callback functions -#include "sdkconfig.h" - -static const char TAG[] __attribute__((unused)) = "MB_CONTROLLER_MASTER"; - -// This file implements public API for Modbus master controller. -// These functions are wrappers for interface functions of the controller -static mb_master_interface_t* master_interface_ptr = NULL; - -void mbc_master_init_iface(void* handler) -{ - master_interface_ptr = (mb_master_interface_t*) handler; -} - -/** - * Modbus controller destroy function - */ -esp_err_t mbc_master_destroy(void) -{ - esp_err_t error = ESP_OK; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->destroy != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->destroy(); - MB_MASTER_CHECK((error == ESP_OK), - error, - "Master destroy failure, error=(0x%x).", - (int)error); - return error; -} - -esp_err_t mbc_master_get_cid_info(uint16_t cid, const mb_parameter_descriptor_t** param_info) -{ - esp_err_t error = ESP_OK; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->get_cid_info != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->get_cid_info(cid, param_info); - MB_MASTER_CHECK((error == ESP_OK), - error, - "Master get cid info failure, error=(0x%x).", - (int)error); - return error; -} - -/** - * Get parameter data for corresponding characteristic - */ -esp_err_t mbc_master_get_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t* type) -{ - esp_err_t error = ESP_OK; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->get_parameter != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->get_parameter(cid, name, value, type); - MB_MASTER_CHECK((error == ESP_OK), - error, - "Master get parameter failure, error=(0x%x) (%s).", - (int)error, esp_err_to_name(error)); - return error; -} - -/** - * Send custom Modbus request defined as mb_param_request_t structure - */ -esp_err_t mbc_master_send_request(mb_param_request_t* request, void* data_ptr) -{ - esp_err_t error = ESP_OK; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->send_request != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->send_request(request, data_ptr); - MB_MASTER_CHECK((error == ESP_OK), - error, - "Master send request failure error=(0x%x) (%s).", - (int)error, esp_err_to_name(error)); - return ESP_OK; -} - -/** - * Set Modbus parameter description table - */ -esp_err_t mbc_master_set_descriptor(const mb_parameter_descriptor_t* descriptor, - const uint16_t num_elements) -{ - esp_err_t error = ESP_OK; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->set_descriptor != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->set_descriptor(descriptor, num_elements); - MB_MASTER_CHECK((error == ESP_OK), - error, - "Master set descriptor failure, error=(0x%x) (%s).", - (int)error, esp_err_to_name(error)); - return ESP_OK; -} - -/** - * Set parameter value for characteristic selected by name and cid - */ -esp_err_t mbc_master_set_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t* type) -{ - esp_err_t error = ESP_OK; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->set_parameter != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->set_parameter(cid, name, value, type); - MB_MASTER_CHECK((error == ESP_OK), - error, - "Master set parameter failure, error=(0x%x) (%s).", - (int)error, esp_err_to_name(error)); - return ESP_OK; -} - -/** - * Setup Modbus controller parameters - */ -esp_err_t mbc_master_setup(void* comm_info) -{ - esp_err_t error = ESP_OK; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->setup != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->setup(comm_info); - MB_MASTER_CHECK((error == ESP_OK), - error, - "Master setup failure, error=(0x%x) (%s).", - (int)error, esp_err_to_name(error)); - return ESP_OK; -} - -/** - * Modbus controller stack start function - */ -esp_err_t mbc_master_start(void) -{ - esp_err_t error = ESP_OK; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->start != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->start(); - MB_MASTER_CHECK((error == ESP_OK), - error, - "Master start failure, error=(0x%x) (%s).", - (int)error, esp_err_to_name(error)); - return ESP_OK; -} - -eMBErrorCode eMBMasterRegDiscreteCB(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNDiscrete) -{ - eMBErrorCode error = MB_ENOERR; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_discrete != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->master_reg_cb_discrete(pucRegBuffer, usAddress, usNDiscrete); - return error; -} - -eMBErrorCode eMBMasterRegCoilsCB(UCHAR* pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode) -{ - eMBErrorCode error = MB_ENOERR; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_coils != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->master_reg_cb_coils(pucRegBuffer, usAddress, - usNCoils, eMode); - return error; -} - -eMBErrorCode eMBMasterRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode) -{ - eMBErrorCode error = MB_ENOERR; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_holding != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->master_reg_cb_holding(pucRegBuffer, usAddress, - usNRegs, eMode); - return error; -} - -eMBErrorCode eMBMasterRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs) -{ - eMBErrorCode error = MB_ENOERR; - MB_MASTER_CHECK((master_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_input != NULL), - ESP_ERR_INVALID_STATE, - "Master interface is not correctly initialized."); - error = master_interface_ptr->master_reg_cb_input(pucRegBuffer, usAddress, usNRegs); - return error; -} - -/** - * Helper function to get current transaction info - */ -esp_err_t mbc_master_get_transaction_info(mb_trans_info_t *ptinfo) -{ - MB_MASTER_CHECK((ptinfo), - ESP_ERR_INVALID_ARG, - "Wrong argument."); - MB_MASTER_CHECK(xMBMasterGetLastTransactionInfo(&ptinfo->trans_id, &ptinfo->dest_addr, - &ptinfo->func_code, &ptinfo->exception, - &ptinfo->err_type), - ESP_ERR_INVALID_STATE, - "Master can not get transaction info."); - return ESP_OK; -} - -// Helper function to set parameter buffer according to its type -esp_err_t mbc_master_set_param_data(void* dest, void* src, mb_descr_type_t param_type, size_t param_size) -{ - esp_err_t err = ESP_OK; - MB_RETURN_ON_FALSE((src), ESP_ERR_INVALID_STATE, TAG,"incorrect data pointer."); - MB_RETURN_ON_FALSE((dest), ESP_ERR_INVALID_STATE, TAG,"incorrect data pointer."); - void *pdest = dest; - void *psrc = src; - - // Transfer parameter data into value of characteristic - switch(param_type) - { - case PARAM_TYPE_U8: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U8) { - *((uint8_t*)pdest) = *((uint8_t*)psrc); - } - break; - - case PARAM_TYPE_U16: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U16) { - *((uint16_t*)pdest) = *((uint16_t*)psrc); - } - break; - - case PARAM_TYPE_U32: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U32) { - *((uint32_t*)pdest) = *((uint32_t*)psrc); - } - break; - - case PARAM_TYPE_FLOAT: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_FLOAT) { - *((float*)pdest) = *(float*)psrc; - } - break; - - case PARAM_TYPE_ASCII: - case PARAM_TYPE_BIN: - memcpy((void*)dest, (void*)src, (size_t)param_size); - break; - -#if CONFIG_FMB_EXT_TYPE_SUPPORT - - case PARAM_TYPE_I8_A: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U8_REG) { - mb_set_int8_a((val_16_arr *)pdest, (*(int8_t*)psrc)); - ESP_LOGV(TAG, "Convert uint8 B[%d] 0x%04" PRIx16 " = 0x%04" PRIx16, i, *(uint16_t *)psrc, *(uint16_t *)pdest); - } - break; - - case PARAM_TYPE_I8_B: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U8_REG) { - mb_set_int8_b((val_16_arr *)pdest, (int8_t)((*(uint16_t*)psrc) >> 8)); - ESP_LOGV(TAG, "Convert int8 A[%d] 0x%02" PRIx16 " = 0x%02" PRIx16, i, *(uint16_t *)psrc, *(uint16_t *)pdest); - } - break; - - case PARAM_TYPE_U8_A: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U8_REG) { - mb_set_uint8_a((val_16_arr *)pdest, (*(uint8_t*)psrc)); - ESP_LOGV(TAG, "Convert uint8 A[%d] 0x%02" PRIx16 " = %02" PRIx16, i, *(uint16_t *)psrc, *(uint16_t *)pdest); - } - break; - - case PARAM_TYPE_U8_B: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U8_REG) { - uint8_t data = (uint8_t)((*(uint16_t*)psrc) >> 8); - mb_set_uint8_b((val_16_arr *)pdest, data); - ESP_LOGV(TAG, "Convert uint8 B[%d] 0x%02" PRIx16 " = 0x%02" PRIx16, i, *(uint16_t *)psrc, *(uint16_t *)pdest); - } - break; - - case PARAM_TYPE_I16_AB: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_I16) { - mb_set_int16_ab((val_16_arr *)pdest, *(int16_t*)psrc); - ESP_LOGV(TAG, "Convert int16 AB[%d] 0x%04" PRIx16 " = 0x%04" PRIx16, i, *(uint16_t *)psrc, *(uint16_t *)pdest); - } - break; - - case PARAM_TYPE_I16_BA: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_I16) { - mb_set_int16_ba((val_16_arr *)pdest, *(int16_t*)psrc); - ESP_LOGV(TAG, "Convert int16 BA[%d] 0x%04" PRIx16 " = 0x%04" PRIx16, i, *(uint16_t *)psrc, *(uint16_t *)pdest); - } - break; - - case PARAM_TYPE_U16_AB: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U16) { - mb_set_uint16_ab((val_16_arr *)pdest, *(uint16_t*)psrc); - ESP_LOGV(TAG, "Convert uint16 AB[%d] 0x%02" PRIx16 " = 0x%02" PRIx16, i, *(uint16_t *)psrc, *(uint16_t *)pdest); - } - break; - - case PARAM_TYPE_U16_BA: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U16) { - mb_set_uint16_ba((val_16_arr *)pdest, *(uint16_t*)psrc); - ESP_LOGV(TAG, "Convert uint16 BA[%d] 0x%02" PRIx16 " = 0x%02" PRIx16, i, *(uint16_t *)psrc, *(uint16_t *)pdest); - } - break; - - case PARAM_TYPE_I32_ABCD: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_I32) { - mb_set_int32_abcd((val_32_arr *)pdest, *(int32_t *)psrc); - ESP_LOGV(TAG, "Convert int32 ABCD[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_U32_ABCD: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U32) { - mb_set_uint32_abcd((val_32_arr *)pdest, *(uint32_t *)psrc); - ESP_LOGV(TAG, "Convert uint32 ABCD[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_FLOAT_ABCD: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_FLOAT) { - mb_set_float_abcd((val_32_arr *)pdest, *(float *)psrc); - ESP_LOGV(TAG, "Convert float ABCD[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_I32_CDAB: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_I32) { - mb_set_int32_cdab((val_32_arr *)pdest, *(int32_t *)psrc); - ESP_LOGV(TAG, "Convert int32 CDAB[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_U32_CDAB: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U32) { - mb_set_uint32_cdab((val_32_arr *)pdest, *(uint32_t *)psrc); - ESP_LOGV(TAG, "Convert uint32 CDAB[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_FLOAT_CDAB: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_FLOAT) { - mb_set_float_cdab((val_32_arr *)pdest, *(float *)psrc); - ESP_LOGV(TAG, "Convert float CDAB[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_I32_BADC: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_I32) { - mb_set_int32_badc((val_32_arr *)pdest, *(int32_t *)psrc); - ESP_LOGV(TAG, "Convert int32 BADC[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_U32_BADC: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U32) { - mb_set_uint32_badc((val_32_arr *)pdest, *(uint32_t *)psrc); - ESP_LOGV(TAG, "Convert uint32 BADC[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_FLOAT_BADC: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_FLOAT) { - mb_set_float_badc((val_32_arr *)pdest, *(float *)psrc); - ESP_LOGV(TAG, "Convert float BADC[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_I32_DCBA: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_I32) { - mb_set_int32_dcba((val_32_arr *)pdest, *(int32_t *)psrc); - ESP_LOGV(TAG, "Convert int32 DCBA[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_U32_DCBA: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U32) { - mb_set_uint32_dcba((val_32_arr *)pdest, *(uint32_t *)psrc); - ESP_LOGV(TAG, "Convert uint32 DCBA[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_FLOAT_DCBA: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_FLOAT) { - mb_set_float_dcba((val_32_arr *)pdest, *(float *)psrc); - ESP_LOGV(TAG, "Convert float DCBA[%d] 0x%04" PRIx32 " = 0x%04" PRIx32, i, *(uint32_t *)psrc, *(uint32_t *)pdest); - } - break; - - case PARAM_TYPE_I64_ABCDEFGH: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_I64) { - mb_set_int64_abcdefgh((val_64_arr *)pdest, *(int64_t *)psrc); - ESP_LOGV(TAG, "Convert int64 ABCDEFGH[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_U64_ABCDEFGH: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U64) { - mb_set_uint64_abcdefgh((val_64_arr *)pdest, *(uint64_t *)psrc); - ESP_LOGV(TAG, "Convert double ABCDEFGH[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_DOUBLE_ABCDEFGH: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_DOUBLE) { - mb_set_double_abcdefgh((val_64_arr *)pdest, *(double *)psrc); - ESP_LOGV(TAG, "Convert double ABCDEFGH[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_I64_HGFEDCBA: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_I64) { - mb_set_int64_hgfedcba((val_64_arr *)pdest, *(int64_t *)psrc); - ESP_LOGV(TAG, "Convert int64 HGFEDCBA[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_U64_HGFEDCBA: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U64) { - mb_set_uint64_hgfedcba((val_64_arr *)pdest, *(uint64_t *)psrc); - ESP_LOGV(TAG, "Convert double HGFEDCBA[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_DOUBLE_HGFEDCBA: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_DOUBLE) { - mb_set_double_hgfedcba((val_64_arr *)pdest, *(double *)psrc); - ESP_LOGV(TAG, "Convert double HGFEDCBA[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_I64_GHEFCDAB: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_I64) { - mb_set_int64_ghefcdab((val_64_arr *)pdest, *(int64_t *)psrc); - ESP_LOGV(TAG, "Convert int64 GHEFCDAB[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_U64_GHEFCDAB: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U64) { - mb_set_uint64_ghefcdab((val_64_arr *)pdest, *(uint64_t *)psrc); - ESP_LOGV(TAG, "Convert uint64 GHEFCDAB[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_DOUBLE_GHEFCDAB: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_DOUBLE) { - mb_set_double_ghefcdab((val_64_arr *)pdest, *(double *)psrc); - ESP_LOGV(TAG, "Convert double GHEFCDAB[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_I64_BADCFEHG: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_I64) { - mb_set_int64_badcfehg((val_64_arr *)pdest, *(int64_t *)psrc); - ESP_LOGV(TAG, "Convert int64 BADCFEHG[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_U64_BADCFEHG: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_U64) { - mb_set_uint64_badcfehg((val_64_arr *)pdest, *(uint64_t *)psrc); - ESP_LOGV(TAG, "Convert uint64 BADCFEHG[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - - case PARAM_TYPE_DOUBLE_BADCFEHG: - for MB_EACH_ELEM(psrc, pdest, param_size, PARAM_SIZE_DOUBLE) { - mb_set_double_badcfehg((val_64_arr *)pdest, *(double *)psrc); - ESP_LOGV(TAG, "Convert double BADCFEHG[%d] 0x%" PRIx64 " = 0x%" PRIx64, i, *(uint64_t *)psrc, *(uint64_t *)pdest); - } - break; - -#endif - default: - ESP_LOGE(TAG, "%s: Incorrect param type (%u).", - __FUNCTION__, (unsigned)param_type); - err = ESP_ERR_NOT_SUPPORTED; - break; - } - return err; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_master_serial.c b/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_master_serial.c deleted file mode 100755 index 9ea355b..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_master_serial.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include "esp_err.h" // for esp_err_t -#include "mbc_master.h" // for master interface define -#include "esp_modbus_master.h" // for public slave defines -#include "mbc_serial_master.h" // for public interface defines - -/** - * Initialization of Modbus master serial - */ -esp_err_t mbc_master_init(mb_port_type_t port_type, void** handler) -{ - void* port_handler = NULL; - esp_err_t error = ESP_ERR_NOT_SUPPORTED; - switch(port_type) - { - case MB_PORT_SERIAL_MASTER: - error = mbc_serial_master_create(&port_handler); - break; - default: - return ESP_ERR_NOT_SUPPORTED; - } - if ((port_handler != NULL) && (error == ESP_OK)) { - mbc_master_init_iface(port_handler); - *handler = port_handler; - } - return error; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_master_tcp.c b/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_master_tcp.c deleted file mode 100755 index 8350f73..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_master_tcp.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include "esp_err.h" // for esp_err_t -#include "esp_modbus_master.h" // for public interface defines -#include "mbc_tcp_master.h" // for public interface defines - -/** - * Initialization of Modbus TCP Master controller interface - */ -esp_err_t mbc_master_init_tcp(void** handler) -{ - void* port_handler = NULL; - esp_err_t error = mbc_tcp_master_create(&port_handler); - - if ((port_handler != NULL) && (error == ESP_OK)) { - mbc_master_init_iface(port_handler); - *handler = port_handler; - } - return error; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_slave.c b/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_slave.c deleted file mode 100755 index 8243833..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_slave.c +++ /dev/null @@ -1,530 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include "esp_err.h" // for esp_err_t -#include "esp_timer.h" // for esp_timer_get_time() -#include "sdkconfig.h" // for KConfig defines - -#include "mbc_slave.h" // for slave private type definitions -#include "mbutils.h" // for stack bit setting utilities -#include "esp_modbus_common.h" // for common defines -#include "esp_modbus_slave.h" // for public slave defines -#include "esp_modbus_callbacks.h" // for modbus callbacks function pointers declaration - -#ifdef CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT - -#define MB_ID_BYTE0(id) ((uint8_t)(id)) -#define MB_ID_BYTE1(id) ((uint8_t)(((uint16_t)(id) >> 8) & 0xFF)) -#define MB_ID_BYTE2(id) ((uint8_t)(((uint32_t)(id) >> 16) & 0xFF)) -#define MB_ID_BYTE3(id) ((uint8_t)(((uint32_t)(id) >> 24) & 0xFF)) - -#define MB_CONTROLLER_SLAVE_ID (CONFIG_FMB_CONTROLLER_SLAVE_ID) -#define MB_SLAVE_ID_SHORT (MB_ID_BYTE3(MB_CONTROLLER_SLAVE_ID)) - -// Slave ID constant -static uint8_t mb_slave_id[] = { MB_ID_BYTE0(MB_CONTROLLER_SLAVE_ID), - MB_ID_BYTE1(MB_CONTROLLER_SLAVE_ID), - MB_ID_BYTE2(MB_CONTROLLER_SLAVE_ID) }; - -#endif - -#define REG_SIZE(type, nregs) ((type == MB_PARAM_INPUT) || (type == MB_PARAM_HOLDING)) ? (nregs >> 1) : (nregs << 3) - -// Common interface pointer for slave port -static mb_slave_interface_t* slave_interface_ptr = NULL; -static const char TAG[] __attribute__((unused)) = "MB_CONTROLLER_SLAVE"; - -// Searches the register in the area specified by type, returns descriptor if found, else NULL -static mb_descr_entry_t* mbc_slave_find_reg_descriptor(mb_param_type_t type, uint16_t addr, size_t regs) -{ - mb_descr_entry_t* it; - uint16_t reg_size = 0; - - mb_slave_options_t* mbs_opts = &slave_interface_ptr->opts; - - if (LIST_EMPTY(&mbs_opts->mbs_area_descriptors[type])) { - return NULL; - } - - // search for the register in each area - for (it = LIST_FIRST(&mbs_opts->mbs_area_descriptors[type]); it != NULL; it = LIST_NEXT(it, entries)) { - reg_size = REG_SIZE(type, it->size); - if ((addr >= it->start_offset) - && (it->p_data) - && (regs >= 1) - && ((addr + regs) <= (it->start_offset + reg_size)) - && (reg_size >= 1)) { - return it; - } - } - return NULL; -} - -static void mbc_slave_free_descriptors(void) { - - mb_descr_entry_t* it; - mb_slave_options_t* mbs_opts = &slave_interface_ptr->opts; - - for (int descr_type = 0; descr_type < MB_PARAM_COUNT; descr_type++) { - while ((it = LIST_FIRST(&mbs_opts->mbs_area_descriptors[descr_type]))) { - LIST_REMOVE(it, entries); - free(it); - } - } -} - -void mbc_slave_init_iface(void* handler) -{ - slave_interface_ptr = (mb_slave_interface_t*) handler; - mb_slave_options_t* mbs_opts = &slave_interface_ptr->opts; - // Initialize list head for register areas - LIST_INIT(&mbs_opts->mbs_area_descriptors[MB_PARAM_INPUT]); - LIST_INIT(&mbs_opts->mbs_area_descriptors[MB_PARAM_HOLDING]); - LIST_INIT(&mbs_opts->mbs_area_descriptors[MB_PARAM_COIL]); - LIST_INIT(&mbs_opts->mbs_area_descriptors[MB_PARAM_DISCRETE]); -} - -/** - * Modbus controller destroy function - */ -esp_err_t mbc_slave_destroy(void) -{ - esp_err_t error = ESP_OK; - // Is initialization done? - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - // Check if interface has been initialized - MB_SLAVE_CHECK((slave_interface_ptr->destroy != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - // Call the slave port destroy function - error = slave_interface_ptr->destroy(); - MB_SLAVE_CHECK((error == ESP_OK), - ESP_ERR_INVALID_STATE, - "Slave destroy failure error=(0x%x).", - (int)error); - // Destroy all opened descriptors - mbc_slave_free_descriptors(); - free(slave_interface_ptr); - slave_interface_ptr = NULL; - return error; -} - -/** - * Setup Modbus controller parameters - */ -esp_err_t mbc_slave_setup(void* comm_info) -{ - esp_err_t error = ESP_OK; - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - MB_SLAVE_CHECK((slave_interface_ptr->setup != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - error = slave_interface_ptr->setup(comm_info); - MB_SLAVE_CHECK((error == ESP_OK), - ESP_ERR_INVALID_STATE, - "Slave setup failure error=(0x%x).", - (int)error); - return error; -} - -/** - * Start Modbus controller start function - */ -esp_err_t mbc_slave_start(void) -{ - esp_err_t error = ESP_OK; - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - MB_SLAVE_CHECK((slave_interface_ptr->start != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); -#ifdef CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT - // Set the slave ID if the KConfig option is selected - eMBErrorCode status = eMBSetSlaveID(MB_SLAVE_ID_SHORT, TRUE, (UCHAR*)mb_slave_id, sizeof(mb_slave_id)); - MB_SLAVE_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, "mb stack set slave ID failure."); -#endif - error = slave_interface_ptr->start(); - MB_SLAVE_CHECK((error == ESP_OK), - ESP_ERR_INVALID_STATE, - "Slave start failure error=(0x%x).", - (int)error); - return error; -} - -/** - * Blocking function to get event on parameter group change for application task - */ -mb_event_group_t mbc_slave_check_event(mb_event_group_t group) -{ - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - MB_EVENT_NO_EVENTS, - "Slave interface is not correctly initialized."); - MB_SLAVE_CHECK((slave_interface_ptr->check_event != NULL), - MB_EVENT_NO_EVENTS, - "Slave interface is not correctly initialized."); - mb_event_group_t event = slave_interface_ptr->check_event(group); - return event; -} - -/** - * Function to get notification about parameter change from application task - */ -esp_err_t mbc_slave_get_param_info(mb_param_info_t* reg_info, uint32_t timeout) -{ - esp_err_t error = ESP_OK; - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - MB_SLAVE_CHECK((slave_interface_ptr->get_param_info != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - error = slave_interface_ptr->get_param_info(reg_info, timeout); - MB_SLAVE_CHECK((error == ESP_OK), - ESP_ERR_INVALID_STATE, - "Slave get parameter info failure error=(0x%x).", - (int)error); - return error; -} - -/** - * Function to set area descriptors for modbus parameters - */ -esp_err_t mbc_slave_set_descriptor(mb_register_area_descriptor_t descr_data) -{ - esp_err_t error = ESP_OK; - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - - if (slave_interface_ptr->set_descriptor != NULL) { - error = slave_interface_ptr->set_descriptor(descr_data); - MB_SLAVE_CHECK((error == ESP_OK), - ESP_ERR_INVALID_STATE, - "Slave set descriptor failure error=(0x%x).", - (int)error); - } else { - mb_slave_options_t* mbs_opts = &slave_interface_ptr->opts; - // Check if the address is already in the descriptor list - mb_descr_entry_t* it = mbc_slave_find_reg_descriptor(descr_data.type, descr_data.start_offset, 1); - MB_SLAVE_CHECK((it == NULL), ESP_ERR_INVALID_ARG, "mb incorrect descriptor or already defined."); - - mb_descr_entry_t* new_descr = (mb_descr_entry_t*) heap_caps_malloc(sizeof(mb_descr_entry_t), - MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT); - MB_SLAVE_CHECK((new_descr != NULL), ESP_ERR_NO_MEM, "mb can not allocate memory for descriptor."); - new_descr->start_offset = descr_data.start_offset; - new_descr->type = descr_data.type; - new_descr->p_data = descr_data.address; - new_descr->size = descr_data.size; - LIST_INSERT_HEAD(&mbs_opts->mbs_area_descriptors[descr_data.type], new_descr, entries); - error = ESP_OK; - } - return error; -} - -// The helper function to get time stamp in microseconds -static uint64_t mbc_slave_get_time_stamp(void) -{ - uint64_t time_stamp = esp_timer_get_time(); - return time_stamp; -} - -// Helper function to send parameter information to application task -static esp_err_t mbc_slave_send_param_info(mb_event_group_t par_type, uint16_t mb_offset, - uint8_t* par_address, uint16_t par_size) -{ - MB_SLAVE_ASSERT(slave_interface_ptr != NULL); - mb_slave_options_t* mbs_opts = &slave_interface_ptr->opts; - esp_err_t error = ESP_FAIL; - mb_param_info_t par_info; - // Check if queue is not full the send parameter information - par_info.type = par_type; - par_info.size = par_size; - par_info.address = par_address; - par_info.time_stamp = mbc_slave_get_time_stamp(); - par_info.mb_offset = mb_offset; - BaseType_t status = xQueueSend(mbs_opts->mbs_notification_queue_handle, &par_info, MB_PAR_INFO_TOUT); - if (pdTRUE == status) { - ESP_LOGD(TAG, "Queue send parameter info (type, address, size): %d, 0x%" PRIx32 ", %u", - (int)par_type, (uint32_t)par_address, (unsigned)par_size); - error = ESP_OK; - } else if (errQUEUE_FULL == status) { - ESP_LOGD(TAG, "Parameter queue is overflowed."); - } - return error; -} - -// Helper function to send notification -static esp_err_t mbc_slave_send_param_access_notification(mb_event_group_t event) -{ - MB_SLAVE_ASSERT(slave_interface_ptr != NULL); - mb_slave_options_t* mbs_opts = &slave_interface_ptr->opts; - esp_err_t err = ESP_FAIL; - mb_event_group_t bits = (mb_event_group_t)xEventGroupSetBits(mbs_opts->mbs_event_group, (EventBits_t)event); - if (bits & event) { - ESP_LOGD(TAG, "The MB_REG_CHANGE_EVENT = 0x%.2x is set.", (int)event); - err = ESP_OK; - } - return err; -} - -/* - * Below are the common slave read/write register callback functions - * The concrete slave port can override them using interface function pointers - */ - -// Callback function for reading of MB Input Registers -eMBErrorCode mbc_reg_input_slave_cb(UCHAR * reg_buffer, USHORT address, USHORT n_regs) -{ - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - MB_EILLSTATE, "Slave stack uninitialized."); - MB_SLAVE_CHECK((reg_buffer != NULL), - MB_EINVAL, "Slave stack call failed."); - eMBErrorCode status = MB_ENOERR; - address--; // address of register is already +1 - mb_descr_entry_t* it = mbc_slave_find_reg_descriptor(MB_PARAM_INPUT, address, n_regs); - if (it != NULL) { - uint16_t input_reg_start = (uint16_t)it->start_offset; // Get Modbus start address - uint8_t* input_buffer = (uint8_t*)it->p_data; // Get instance address - uint16_t regs = n_regs; - uint16_t reg_index; - // If input or configuration parameters are incorrect then return an error to stack layer - reg_index = (uint16_t)(address - input_reg_start); - reg_index <<= 1; // register Address to byte address - input_buffer += reg_index; - uint8_t* buffer_start = input_buffer; - while (regs > 0) { - _XFER_2_RD(reg_buffer, input_buffer); - reg_index += 2; - regs -= 1; - } - // Send access notification - (void)mbc_slave_send_param_access_notification(MB_EVENT_INPUT_REG_RD); - // Send parameter info to application task - (void)mbc_slave_send_param_info(MB_EVENT_INPUT_REG_RD, (uint16_t)address, - (uint8_t*)buffer_start, (uint16_t)n_regs); - } else { - status = MB_ENOREG; - } - return status; -} - -// Callback function for reading of MB Holding Registers -// Executed by stack when request to read/write holding registers is received -eMBErrorCode mbc_reg_holding_slave_cb(UCHAR * reg_buffer, USHORT address, USHORT n_regs, eMBRegisterMode mode) -{ - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - MB_EILLSTATE, "Slave stack uninitialized."); - MB_SLAVE_CHECK((reg_buffer != NULL), - MB_EINVAL, "Slave stack call failed."); - eMBErrorCode status = MB_ENOERR; - uint16_t reg_index; - address--; // address of register is already +1 - mb_descr_entry_t* it = mbc_slave_find_reg_descriptor(MB_PARAM_HOLDING, address, n_regs); - if (it != NULL) { - uint16_t reg_holding_start = (uint16_t)it->start_offset; // Get Modbus start address - uint8_t* holding_buffer = (uint8_t*)it->p_data; // Get instance address - uint16_t regs = n_regs; - reg_index = (uint16_t) (address - reg_holding_start); - reg_index <<= 1; // register Address to byte address - holding_buffer += reg_index; - uint8_t* buffer_start = holding_buffer; - switch (mode) { - case MB_REG_READ: - while (regs > 0) { - _XFER_2_RD(reg_buffer, holding_buffer); - reg_index += 2; - regs -= 1; - }; - // Send access notification - (void)mbc_slave_send_param_access_notification(MB_EVENT_HOLDING_REG_RD); - // Send parameter info - (void)mbc_slave_send_param_info(MB_EVENT_HOLDING_REG_RD, (uint16_t)address, - (uint8_t*)buffer_start, (uint16_t)n_regs); - break; - case MB_REG_WRITE: - while (regs > 0) { - _XFER_2_WR(holding_buffer, reg_buffer); - holding_buffer += 2; - reg_index += 2; - regs -= 1; - }; - // Send access notification - (void)mbc_slave_send_param_access_notification(MB_EVENT_HOLDING_REG_WR); - // Send parameter info - (void)mbc_slave_send_param_info(MB_EVENT_HOLDING_REG_WR, (uint16_t)address, - (uint8_t*)buffer_start, (uint16_t)n_regs); - break; - } - } else { - status = MB_ENOREG; - } - return status; -} - -// Callback function for reading of MB Coils Registers -eMBErrorCode mbc_reg_coils_slave_cb(UCHAR* reg_buffer, USHORT address, USHORT n_coils, eMBRegisterMode mode) -{ - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - MB_EILLSTATE, "Slave stack uninitialized."); - MB_SLAVE_CHECK((reg_buffer != NULL), - MB_EINVAL, "Slave stack call failed."); - eMBErrorCode status = MB_ENOERR; - uint16_t reg_index; - uint16_t coils = n_coils; - address--; // The address is already +1 - mb_descr_entry_t* it = mbc_slave_find_reg_descriptor(MB_PARAM_COIL, address, n_coils); - if (it != NULL) { - uint16_t reg_coils_start = (uint16_t)it->start_offset; // MB offset of coils - uint8_t* reg_coils_buf = (uint8_t*)it->p_data; - reg_index = (uint16_t) (address - it->start_offset); - CHAR* coils_data_buf = (CHAR*)(reg_coils_buf + (reg_index >> 3)); - switch (mode) { - case MB_REG_READ: - while (coils > 0) { - uint8_t result = xMBUtilGetBits((uint8_t*)reg_coils_buf, reg_index, 1); - xMBUtilSetBits(reg_buffer, reg_index - (address - reg_coils_start), 1, result); - reg_index++; - coils--; - } - // Send an event to notify application task about event - (void)mbc_slave_send_param_access_notification(MB_EVENT_COILS_RD); - (void)mbc_slave_send_param_info(MB_EVENT_COILS_RD, (uint16_t)address, - (uint8_t*)(coils_data_buf), (uint16_t)n_coils); - break; - case MB_REG_WRITE: - while (coils > 0) { - uint8_t result = xMBUtilGetBits(reg_buffer, - reg_index - (address - reg_coils_start), 1); - xMBUtilSetBits((uint8_t*)reg_coils_buf, reg_index, 1, result); - reg_index++; - coils--; - } - // Send an event to notify application task about event - (void)mbc_slave_send_param_access_notification(MB_EVENT_COILS_WR); - (void)mbc_slave_send_param_info(MB_EVENT_COILS_WR, (uint16_t)address, - (uint8_t*)coils_data_buf, (uint16_t)n_coils); - break; - } // switch ( eMode ) - } else { - // If the configuration or input parameters are incorrect then return error to stack - status = MB_ENOREG; - } - return status; -} - -// Callback function for reading of MB Discrete Input Registers -eMBErrorCode mbc_reg_discrete_slave_cb(UCHAR* reg_buffer, USHORT address, USHORT n_discrete) -{ - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - MB_EILLSTATE, "Slave stack uninitialized."); - MB_SLAVE_CHECK((reg_buffer != NULL), - MB_EINVAL, "Slave stack call failed."); - - eMBErrorCode status = MB_ENOERR; - uint16_t reg_index; - uint16_t reg_bit_index; - uint16_t n_reg; - uint8_t* discrete_input_buf; - // It already plus one in modbus function method. - address--; - mb_descr_entry_t* it = mbc_slave_find_reg_descriptor(MB_PARAM_DISCRETE, address, n_discrete); - if (it != NULL) { - uint16_t reg_discrete_start = (uint16_t)it->start_offset; // MB offset of registers - n_reg = (n_discrete >> 3) + 1; - discrete_input_buf = (uint8_t*)it->p_data; // the storage address - reg_index = (uint16_t) (address - reg_discrete_start) / 8; // Get register index in the buffer for bit number - reg_bit_index = (uint16_t)(address - reg_discrete_start) % 8; // Get bit index - uint8_t* temp_buf = &discrete_input_buf[reg_index]; - while (n_reg > 0) { - *reg_buffer++ = xMBUtilGetBits(&discrete_input_buf[reg_index++], reg_bit_index, 8); - n_reg--; - } - reg_buffer--; - // Last discrete - n_discrete = n_discrete % 8; - // Filling zero to high bit - *reg_buffer = *reg_buffer << (8 - n_discrete); - *reg_buffer = *reg_buffer >> (8 - n_discrete); - // Send an event to notify application task about event - (void)mbc_slave_send_param_access_notification(MB_EVENT_DISCRETE_RD); - (void)mbc_slave_send_param_info(MB_EVENT_DISCRETE_RD, (uint16_t)address, - (uint8_t*)temp_buf, (uint16_t)n_discrete); - } else { - status = MB_ENOREG; - } - return status; -} - -/** - * Below are the stack callback functions to read/write registers - */ -eMBErrorCode eMBRegDiscreteCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete) -{ - eMBErrorCode error = MB_ENOERR; - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - // Check if the callback is overridden in concrete port - if (slave_interface_ptr->slave_reg_cb_discrete) { - error = slave_interface_ptr->slave_reg_cb_discrete(pucRegBuffer, usAddress, usNDiscrete); - } else { - error = mbc_reg_discrete_slave_cb(pucRegBuffer, usAddress, usNDiscrete); - } - - return error; -} - -eMBErrorCode eMBRegCoilsCB(UCHAR* pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode) -{ - eMBErrorCode error = MB_ENOERR; - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - - if (slave_interface_ptr->slave_reg_cb_coils) { - error = slave_interface_ptr->slave_reg_cb_coils(pucRegBuffer, usAddress, usNCoils, eMode); - } else { - error = mbc_reg_coils_slave_cb(pucRegBuffer, usAddress, usNCoils, eMode); - } - return error; -} - -eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode) -{ - eMBErrorCode error = MB_ENOERR; - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - - if (slave_interface_ptr->slave_reg_cb_holding) { - error = slave_interface_ptr->slave_reg_cb_holding(pucRegBuffer, usAddress, usNRegs, eMode); - } else { - error = mbc_reg_holding_slave_cb(pucRegBuffer, usAddress, usNRegs, eMode); - } - return error; -} - -eMBErrorCode eMBRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs) -{ - eMBErrorCode error = ESP_ERR_INVALID_STATE; - MB_SLAVE_CHECK((slave_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - - if (slave_interface_ptr->slave_reg_cb_input) { - error = slave_interface_ptr->slave_reg_cb_input(pucRegBuffer, usAddress, usNRegs); - } else { - error = mbc_reg_input_slave_cb(pucRegBuffer, usAddress, usNRegs); - } - return error; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_slave_serial.c b/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_slave_serial.c deleted file mode 100755 index eb08dfd..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_slave_serial.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include "esp_err.h" // for esp_err_t -#include "sdkconfig.h" // for KConfig defines -#include "mbc_slave.h" // for slave interface define -#include "esp_modbus_slave.h" // for public slave defines -#include "mbc_serial_slave.h" // for public interface defines - -/** - * Initialization of Modbus Serial slave controller - */ -esp_err_t mbc_slave_init(mb_port_type_t port_type, void** handler) -{ - void* port_handler = NULL; - esp_err_t error = ESP_ERR_NOT_SUPPORTED; - switch(port_type) - { - case MB_PORT_SERIAL_SLAVE: - // Call constructor function of actual port implementation - error = mbc_serial_slave_create(&port_handler); - break; - default: - return ESP_ERR_NOT_SUPPORTED; - } - if ((port_handler != NULL) && (error == ESP_OK)) { - mbc_slave_init_iface(port_handler); - *handler = port_handler; - } - return error; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_slave_tcp.c b/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_slave_tcp.c deleted file mode 100755 index c3b3ee6..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/esp_modbus_slave_tcp.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include "esp_err.h" // for esp_err_t -#include "esp_modbus_slave.h" // for public slave defines -#include "mbc_tcp_slave.h" // for public interface defines - -/** - * Initialization of Modbus TCP Slave controller - */ -esp_err_t mbc_slave_init_tcp(void** handler) -{ - void* port_handler = NULL; - esp_err_t error = mbc_tcp_slave_create(&port_handler); - - if ((port_handler != NULL) && (error == ESP_OK)) { - mbc_slave_init_iface(port_handler); - *handler = port_handler; - } - return error; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/include/esp_modbus_common.h b/managed_components/espressif__esp-modbus/freemodbus/common/include/esp_modbus_common.h deleted file mode 100755 index 7c6eefc..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/include/esp_modbus_common.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef _MB_IFACE_COMMON_H -#define _MB_IFACE_COMMON_H - -#include // needs to be included for default system types (such as PRIxx) -#include "driver/uart.h" // for UART types -#include "sdkconfig.h" - -#if CONFIG_FMB_EXT_TYPE_SUPPORT -#include "mb_endianness_utils.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#if __has_include("esp_check.h") -#include "esp_check.h" -#include "esp_log.h" - -#define MB_RETURN_ON_FALSE(a, err_code, tag, format, ...) ESP_RETURN_ON_FALSE(a, err_code, tag, format __VA_OPT__(,) __VA_ARGS__) - -#else - -// if cannot include esp_check then use custom check macro - -#define MB_RETURN_ON_FALSE(a, err_code, tag, format, ...) do { \ - if (!(a)) { \ - ESP_LOGE(tag, "%s(%" PRIu32 "): " format, __FUNCTION__, __LINE__ __VA_OPT__(,) __VA_ARGS__); \ - return err_code; \ - } \ -} while(0) - -#endif - -#define MB_CONTROLLER_STACK_SIZE (CONFIG_FMB_CONTROLLER_STACK_SIZE) // Stack size for Modbus controller -#define MB_CONTROLLER_PRIORITY (CONFIG_FMB_PORT_TASK_PRIO - 1) // priority of MB controller task - -// Default port defines -#define MB_DEVICE_ADDRESS (1) // Default slave device address in Modbus -#define MB_DEVICE_SPEED (115200) // Default Modbus speed for now hard defined -#define MB_UART_PORT (UART_NUM_MAX - 1) // Default UART port number -#define MB_PAR_INFO_TOUT (10) // Timeout for get parameter info -#define MB_PARITY_NONE (UART_PARITY_DISABLE) - -// The Macros below handle the endianness while transfer N byte data into buffer (convert from network byte order) -#define _XFER_2_RD(dst, src) { \ - *(uint8_t *)(dst)++ = *(uint8_t *)(src + 1); \ - *(uint8_t *)(dst)++ = *(uint8_t *)(src + 0); \ - (src) += 2; \ -} - -#define _XFER_2_WR(dst, src) { \ - *(uint8_t *)(dst + 1) = *(uint8_t *)(src)++; \ - *(uint8_t *)(dst + 0) = *(uint8_t *)(src)++; \ -} - -/** - * @brief Types of actual Modbus implementation - */ -typedef enum -{ - MB_PORT_SERIAL_MASTER = 0x00, /*!< Modbus port type serial master. */ - MB_PORT_SERIAL_SLAVE, /*!< Modbus port type serial slave. */ - MB_PORT_TCP_MASTER, /*!< Modbus port type TCP master. */ - MB_PORT_TCP_SLAVE, /*!< Modbus port type TCP slave. */ - MB_PORT_COUNT, /*!< Modbus port count. */ - MB_PORT_INACTIVE = 0xFF -} mb_port_type_t; - -/** - * @brief Event group for parameters notification - */ -typedef enum -{ - MB_EVENT_NO_EVENTS = 0x00, - MB_EVENT_HOLDING_REG_WR = BIT0, /*!< Modbus Event Write Holding registers. */ - MB_EVENT_HOLDING_REG_RD = BIT1, /*!< Modbus Event Read Holding registers. */ - MB_EVENT_INPUT_REG_RD = BIT3, /*!< Modbus Event Read Input registers. */ - MB_EVENT_COILS_WR = BIT4, /*!< Modbus Event Write Coils. */ - MB_EVENT_COILS_RD = BIT5, /*!< Modbus Event Read Coils. */ - MB_EVENT_DISCRETE_RD = BIT6, /*!< Modbus Event Read Discrete bits. */ - MB_EVENT_STACK_STARTED = BIT7 /*!< Modbus Event Stack started */ -} mb_event_group_t; - -/** - * @brief Type of Modbus parameter - */ -typedef enum { - MB_PARAM_HOLDING = 0x00, /*!< Modbus Holding register. */ - MB_PARAM_INPUT, /*!< Modbus Input register. */ - MB_PARAM_COIL, /*!< Modbus Coils. */ - MB_PARAM_DISCRETE, /*!< Modbus Discrete bits. */ - MB_PARAM_COUNT, - MB_PARAM_UNKNOWN = 0xFF -} mb_param_type_t; - -/*! - * \brief Modbus serial transmission modes (RTU/ASCII). - */ -typedef enum { - MB_MODE_RTU, /*!< RTU transmission mode. */ - MB_MODE_ASCII, /*!< ASCII transmission mode. */ - MB_MODE_TCP, /*!< TCP communication mode. */ - MB_MODE_UDP /*!< UDP communication mode. */ -} mb_mode_type_t; - -/*! - * \brief Modbus TCP type of address. - */ -typedef enum { - MB_IPV4 = 0, /*!< TCP IPV4 addressing */ - MB_IPV6 = 1 /*!< TCP IPV6 addressing */ -} mb_tcp_addr_type_t; - -/** - * @brief Device communication structure to setup Modbus controller - */ -typedef union { - // Serial communication structure - struct { - mb_mode_type_t mode; /*!< Modbus communication mode */ - uint8_t slave_addr; /*!< Modbus slave address field (dummy for master) */ - uart_port_t port; /*!< Modbus communication port (UART) number */ - uint32_t baudrate; /*!< Modbus baudrate */ - uart_parity_t parity; /*!< Modbus UART parity settings */ - uint16_t dummy_port; /*!< Dummy field, unused */ - }; - // TCP/UDP communication structure - struct { - mb_mode_type_t ip_mode; /*!< Modbus communication mode */ - uint8_t slave_uid; /*!< Modbus slave address field for UID */ - uint16_t ip_port; /*!< Modbus port */ - mb_tcp_addr_type_t ip_addr_type; /*!< Modbus address type */ - void* ip_addr; /*!< Modbus address table for connection */ - void* ip_netif_ptr; /*!< Modbus network interface */ - }; -} mb_communication_info_t; - -/** - * common interface method types - */ -typedef esp_err_t (*iface_init)(void**); /*!< Interface method init */ -typedef esp_err_t (*iface_destroy)(void); /*!< Interface method destroy */ -typedef esp_err_t (*iface_setup)(void*); /*!< Interface method setup */ -typedef esp_err_t (*iface_start)(void); /*!< Interface method start */ - -#ifdef __cplusplus -} -#endif - -#endif // _MB_IFACE_COMMON_H diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/include/esp_modbus_master.h b/managed_components/espressif__esp-modbus/freemodbus/common/include/esp_modbus_master.h deleted file mode 100755 index 7fc9079..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/include/esp_modbus_master.h +++ /dev/null @@ -1,351 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef _ESP_MB_MASTER_INTERFACE_H -#define _ESP_MB_MASTER_INTERFACE_H - -#include // for standard int types definition -#include // for NULL and std defines -#include "soc/soc.h" // for BITN definitions -#include "esp_modbus_common.h" // for common types - -#ifdef __cplusplus -extern "C" { -#endif - -#define MB_MASTER_CHECK(a, err_code, format, ...) MB_RETURN_ON_FALSE(a, err_code, TAG, format __VA_OPT__(,) __VA_ARGS__) - -#define MB_MASTER_ASSERT(con) do { \ - if (!(con)) { ESP_LOGE(TAG, "assert errno:%u, errno_str: !(%s)", (unsigned)errno, strerror(errno)); assert(0 && #con); } \ - } while (0) - -/*! - * \brief The macro to access arrays of elements for type conversion. - */ -#define MB_EACH_ELEM(psrc, pdest, arr_size, elem_size) \ -(int i = 0; (i < (arr_size / elem_size)); i++, pdest += elem_size, psrc += elem_size) - -/*! - * \brief Modbus descriptor table parameter type defines. - */ -typedef enum { - PARAM_TYPE_U8 = 0x00, /*!< Unsigned 8 */ - PARAM_TYPE_U16 = 0x01, /*!< Unsigned 16 */ - PARAM_TYPE_U32 = 0x02, /*!< Unsigned 32 */ - PARAM_TYPE_FLOAT = 0x03, /*!< Float type */ - PARAM_TYPE_ASCII = 0x04, /*!< ASCII type */ - PARAM_TYPE_BIN = 0x07, /*!< BIN type */ - PARAM_TYPE_I8_A = 0x0A, /*!< I8 signed integer in high byte of register */ - PARAM_TYPE_I8_B = 0x0B, /*!< I8 signed integer in low byte of register */ - PARAM_TYPE_U8_A = 0x0C, /*!< U8 unsigned integer written to hi byte of register */ - PARAM_TYPE_U8_B = 0x0D, /*!< U8 unsigned integer written to low byte of register */ - PARAM_TYPE_I16_AB = 0x0E, /*!< I16 signed integer, big endian */ - PARAM_TYPE_I16_BA = 0x0F, /*!< I16 signed integer, little endian */ - PARAM_TYPE_U16_AB = 0x10, /*!< U16 unsigned integer, big endian*/ - PARAM_TYPE_U16_BA = 0x11, /*!< U16 unsigned integer, little endian */ - PARAM_TYPE_I32_ABCD = 0x12, /*!< I32 ABCD signed integer, big endian */ - PARAM_TYPE_I32_CDAB = 0x13, /*!< I32 CDAB signed integer, big endian, reversed register order */ - PARAM_TYPE_I32_BADC = 0x14, /*!< I32 BADC signed integer, little endian, reversed register order */ - PARAM_TYPE_I32_DCBA = 0x15, /*!< I32 DCBA signed integer, little endian */ - PARAM_TYPE_U32_ABCD = 0x16, /*!< U32 ABCD unsigned integer, big endian */ - PARAM_TYPE_U32_CDAB = 0x17, /*!< U32 CDAB unsigned integer, big endian, reversed register order */ - PARAM_TYPE_U32_BADC = 0x18, /*!< U32 BADC unsigned integer, little endian, reversed register order */ - PARAM_TYPE_U32_DCBA = 0x19, /*!< U32 DCBA unsigned integer, little endian */ - PARAM_TYPE_FLOAT_ABCD = 0x1A, /*!< Float ABCD floating point, big endian */ - PARAM_TYPE_FLOAT_CDAB = 0x1B, /*!< Float CDAB floating point big endian, reversed register order */ - PARAM_TYPE_FLOAT_BADC = 0x1C, /*!< Float BADC floating point, little endian, reversed register order */ - PARAM_TYPE_FLOAT_DCBA = 0x1D, /*!< Float DCBA floating point, little endian */ - PARAM_TYPE_I64_ABCDEFGH = 0x1E, /*!< I64, ABCDEFGH signed integer, big endian */ - PARAM_TYPE_I64_HGFEDCBA = 0x1F, /*!< I64, HGFEDCBA signed integer, little endian */ - PARAM_TYPE_I64_GHEFCDAB = 0x20, /*!< I64, GHEFCDAB signed integer, big endian, reversed register order */ - PARAM_TYPE_I64_BADCFEHG = 0x21, /*!< I64, BADCFEHG signed integer, little endian, reversed register order */ - PARAM_TYPE_U64_ABCDEFGH = 0x22, /*!< U64, ABCDEFGH unsigned integer, big endian */ - PARAM_TYPE_U64_HGFEDCBA = 0x23, /*!< U64, HGFEDCBA unsigned integer, little endian */ - PARAM_TYPE_U64_GHEFCDAB = 0x24, /*!< U64, GHEFCDAB unsigned integer, big endian, reversed register order */ - PARAM_TYPE_U64_BADCFEHG = 0x25, /*!< U64, BADCFEHG unsigned integer, little endian, reversed register order */ - PARAM_TYPE_DOUBLE_ABCDEFGH = 0x26, /*!< Double ABCDEFGH floating point, big endian*/ - PARAM_TYPE_DOUBLE_HGFEDCBA = 0x27, /*!< Double HGFEDCBA floating point, little endian*/ - PARAM_TYPE_DOUBLE_GHEFCDAB = 0x28, /*!< Double GHEFCDAB floating point, big endian, reversed register order */ - PARAM_TYPE_DOUBLE_BADCFEHG = 0x29 /*!< Double BADCFEHG floating point, little endian, reversed register order */ -} mb_descr_type_t; - -/*! - * \brief Modbus descriptor table parameter size in bytes. - */ -typedef enum { - PARAM_SIZE_U8 = 0x01, /*!< Unsigned 8 */ - PARAM_SIZE_U8_REG = 0x02, /*!< Unsigned 8, register value */ - PARAM_SIZE_I8_REG = 0x02, /*!< Signed 8, register value */ - PARAM_SIZE_I16 = 0x02, /*!< Unsigned 16 */ - PARAM_SIZE_U16 = 0x02, /*!< Unsigned 16 */ - PARAM_SIZE_I32 = 0x04, /*!< Signed 32 */ - PARAM_SIZE_U32 = 0x04, /*!< Unsigned 32 */ - PARAM_SIZE_FLOAT = 0x04, /*!< Float 32 size */ - PARAM_SIZE_ASCII = 0x08, /*!< ASCII size default*/ - PARAM_SIZE_ASCII24 = 0x18, /*!< ASCII24 size */ - PARAM_SIZE_I64 = 0x08, /*!< Signed integer 64 size */ - PARAM_SIZE_U64 = 0x08, /*!< Unsigned integer 64 size */ - PARAM_SIZE_DOUBLE = 0x08, /*!< Double 64 size */ - PARAM_MAX_SIZE -} mb_descr_size_t; - -/*! - * \brief Modbus parameter options for description table - */ -typedef union { - struct { - int opt1; /*!< Parameter option1 */ - int opt2; /*!< Parameter option2 */ - int opt3; /*!< Parameter option3 */ - }; - struct { - int min; /*!< Parameter minimum value */ - int max; /*!< Parameter maximum value */ - int step; /*!< Step of parameter change tracking */ - }; -} mb_parameter_opt_t; - -/** - * @brief Permissions for the characteristics - */ -typedef enum { - PAR_PERMS_READ = 1 << BIT0, /**< the characteristic of the device are readable */ - PAR_PERMS_WRITE = 1 << BIT1, /**< the characteristic of the device are writable*/ - PAR_PERMS_TRIGGER = 1 << BIT2, /**< the characteristic of the device are triggerable */ - PAR_PERMS_READ_WRITE = PAR_PERMS_READ | PAR_PERMS_WRITE, /**< the characteristic of the device are readable & writable */ - PAR_PERMS_READ_TRIGGER = PAR_PERMS_READ | PAR_PERMS_TRIGGER, /**< the characteristic of the device are readable & triggerable */ - PAR_PERMS_WRITE_TRIGGER = PAR_PERMS_WRITE | PAR_PERMS_TRIGGER, /**< the characteristic of the device are writable & triggerable */ - PAR_PERMS_READ_WRITE_TRIGGER = PAR_PERMS_READ_WRITE | PAR_PERMS_TRIGGER, /**< the characteristic of the device are readable & writable & triggerable */ -} mb_param_perms_t; - -/** - * @brief Characteristics descriptor type is used to describe characteristic and - * link it with Modbus parameters that reflect its data. - */ -typedef struct { - uint16_t cid; /*!< Characteristic cid */ - const char* param_key; /*!< The key (name) of the parameter */ - const char* param_units; /*!< The physical units of the parameter */ - uint8_t mb_slave_addr; /*!< Slave address of device in the Modbus segment */ - mb_param_type_t mb_param_type; /*!< Type of modbus parameter */ - uint16_t mb_reg_start; /*!< This is the Modbus register address. This is the 0 based value. */ - uint16_t mb_size; /*!< Size of mb parameter in registers */ - uint16_t param_offset; /*!< Parameter name (OFFSET in the parameter structure) */ - mb_descr_type_t param_type; /*!< Float, U8, U16, U32, ASCII, etc. */ - mb_descr_size_t param_size; /*!< Number of bytes in the parameter. */ - mb_parameter_opt_t param_opts; /*!< Parameter options used to check limits and etc. */ - mb_param_perms_t access; /*!< Access permissions based on mode */ -} mb_parameter_descriptor_t; - -/** - * @brief Modbus register request type structure - */ -typedef struct { - uint8_t slave_addr; /*!< Modbus slave address */ - uint8_t command; /*!< Modbus command to send */ - uint16_t reg_start; /*!< Modbus start register */ - uint16_t reg_size; /*!< Modbus number of registers */ -} mb_param_request_t; - -/** - * @brief Modbus transacion info structure - */ -typedef struct { - uint64_t trans_id; /*!< Modbus unique transaction identificator */ - uint16_t err_type; /*!< Modbus last transaction error type */ - uint8_t dest_addr; /*!< Modbus destination short address (or UID) */ - uint8_t func_code; /*!< Modbus last transaction function code */ - uint8_t exception; /*!< Modbus last transaction exception code returned by slave */ -} mb_trans_info_t; - -/** - * @brief Initialize Modbus controller and stack for TCP port - * - * @param[out] handler handler(pointer) to master data structure - * @return - * - ESP_OK Success - * - ESP_ERR_NO_MEM Parameter error - * - ESP_ERR_NOT_SUPPORTED Port type not supported - * - ESP_ERR_INVALID_STATE Initialization failure - */ -esp_err_t mbc_master_init_tcp(void** handler); - -/** - * @brief Initialize Modbus Master controller and stack for Serial port - * - * @param[out] handler handler(pointer) to master data structure - * @param[in] port_type type of stack - * @return - * - ESP_OK Success - * - ESP_ERR_NO_MEM Parameter error - * - ESP_ERR_NOT_SUPPORTED Port type not supported - * - ESP_ERR_INVALID_STATE Initialization failure - */ -esp_err_t mbc_master_init(mb_port_type_t port_type, void** handler); - -/** - * @brief Initialize Modbus Master controller interface handle - * - * @param[in] handler - pointer to master data structure - */ -void mbc_master_init_iface(void* handler); - -/** - * @brief Destroy Modbus controller and stack - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_STATE Parameter error - */ -esp_err_t mbc_master_destroy(void); - -/** - * @brief Start Modbus communication stack - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_ARG Modbus stack start error - */ -esp_err_t mbc_master_start(void); - -/** - * @brief Set Modbus communication parameters for the controller - * - * @param comm_info Communication parameters structure. - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_ARG Incorrect parameter data - */ -esp_err_t mbc_master_setup(void* comm_info); - -/***************************** Specific interface functions ******************************************** - * Interface functions below provide basic methods to read/write access to slave devices in Modbus - * segment as well as API to read specific supported characteristics linked to Modbus parameters - * of devices in Modbus network. -*******************************************************************************************************/ - -/** - * @brief Assign parameter description table for Modbus controller interface. - * - * @param[in] descriptor pointer to parameter description table - * @param num_elements number of elements in the table - * - * @return - * - esp_err_t ESP_OK - set descriptor successfully - * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument in function call - */ -esp_err_t mbc_master_set_descriptor(const mb_parameter_descriptor_t* descriptor, const uint16_t num_elements); - -/** - * @brief Send data request as defined in parameter request, waits response - * from slave and returns status of command execution. This function provides standard way - * for read/write access to Modbus devices in the network. - * - * @param[in] request pointer to request structure of type mb_param_request_t - * @param[in] data_ptr pointer to data buffer to send or received data (dependent of command field in request) - * - * @return - * - esp_err_t ESP_OK - request was successful - * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function - * - esp_err_t ESP_ERR_INVALID_RESPONSE - an invalid response from slave - * - esp_err_t ESP_ERR_TIMEOUT - operation timeout or no response from slave - * - esp_err_t ESP_ERR_NOT_SUPPORTED - the request command is not supported by slave - * - esp_err_t ESP_FAIL - slave returned an exception or other failure - */ -esp_err_t mbc_master_send_request(mb_param_request_t* request, void* data_ptr); - -/** - * @brief Get information about supported characteristic defined as cid. Uses parameter description table to get - * this information. The function will check if characteristic defined as a cid parameter is supported - * and returns its description in param_info. Returns ESP_ERR_NOT_FOUND if characteristic is not supported. - * - * @param[in] cid characteristic id - * @param param_info pointer to pointer of characteristic data. - * - * @return - * - esp_err_t ESP_OK - request was successful and buffer contains the supported characteristic name - * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function - * - esp_err_t ESP_ERR_NOT_FOUND - the characteristic (cid) not found - * - esp_err_t ESP_FAIL - unknown error during lookup table processing -*/ -esp_err_t mbc_master_get_cid_info(uint16_t cid, const mb_parameter_descriptor_t** param_info); - -/** - * @brief Read parameter from modbus slave device whose name is defined by name and has cid. - * The additional data for request is taken from parameter description (lookup) table. - * - * @param[in] cid id of the characteristic for parameter - * @param[in] name pointer into string name (key) of parameter (null terminated) - * @param[out] value pointer to data buffer of parameter - * @param[out] type parameter type associated with the name returned from parameter description table. - * - * @return - * - esp_err_t ESP_OK - request was successful and value buffer contains - * representation of actual parameter data from slave - * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function or parameter descriptor - * - esp_err_t ESP_ERR_INVALID_RESPONSE - an invalid response from slave - * - esp_err_t ESP_ERR_INVALID_STATE - invalid state during data processing or allocation failure - * - esp_err_t ESP_ERR_TIMEOUT - operation timed out and no response from slave - * - esp_err_t ESP_ERR_NOT_SUPPORTED - the request command is not supported by slave - * - esp_err_t ESP_ERR_NOT_FOUND - the parameter is not found in the parameter description table - * - esp_err_t ESP_FAIL - slave returned an exception or other failure -*/ -esp_err_t mbc_master_get_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t *type); - -/** - * @brief Set characteristic's value defined as a name and cid parameter. - * The additional data for cid parameter request is taken from master parameter lookup table. - * - * @param[in] cid id of the characteristic for parameter - * @param[in] name pointer into string name (key) of parameter (null terminated) - * @param[out] value pointer to data buffer of parameter (actual representation of json value field in binary form) - * @param[out] type pointer to parameter type associated with the name returned from parameter lookup table. - * - * @return - * - esp_err_t ESP_OK - request was successful and value was saved in the slave device registers - * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function or parameter descriptor - * - esp_err_t ESP_ERR_INVALID_RESPONSE - an invalid response from slave during processing of parameter - * - esp_err_t ESP_ERR_INVALID_STATE - invalid state during data processing or allocation failure - * - esp_err_t ESP_ERR_TIMEOUT - operation timed out and no response from slave - * - esp_err_t ESP_ERR_NOT_SUPPORTED - the request command is not supported by slave - * - esp_err_t ESP_FAIL - slave returned an exception or other failure -*/ -esp_err_t mbc_master_set_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t *type); - -/** - * @brief The helper function to set data of parameters according to its type - * - * @param[in] dest the destination address of the parameter - * @param[in] src the source address of the parameter - * @param[out] param_type type of parameter from data dictionary - * @param[out] param_size the storage size of the characteristic (in bytes). - * Describes the size of data to keep into data instance during mapping. - * - * @return - * - esp_err_t ESP_OK - request was successful and value was saved in the slave device registers - * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function or parameter descriptor - * - esp_err_t ESP_ERR_NOT_SUPPORTED - the request command is not supported by slave -*/ -esp_err_t mbc_master_set_param_data(void* dest, void* src, mb_descr_type_t param_type, size_t param_size); - -/** - * @brief The helper function to expose transaction info from modbus layer - * - * @param[in] ptinfo the pointer to transaction info structure - * - * @return - * - esp_err_t ESP_OK - the transaction info is saved in the appropriate parameter structure - * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function or parameter descriptor - * - esp_err_t ESP_ERR_INVALID_STATE - invalid state during data processing or allocation failure -*/ -esp_err_t mbc_master_get_transaction_info(mb_trans_info_t *ptinfo); - -#ifdef __cplusplus -} -#endif - -#endif // _ESP_MB_MASTER_INTERFACE_H diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/include/esp_modbus_slave.h b/managed_components/espressif__esp-modbus/freemodbus/common/include/esp_modbus_slave.h deleted file mode 100755 index 0dfbbac..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/include/esp_modbus_slave.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef _ESP_MB_SLAVE_INTERFACE_H -#define _ESP_MB_SLAVE_INTERFACE_H - -// Public interface header for slave -#include // for standard int types definition -#include // for NULL and std defines -#include "soc/soc.h" // for BITN definitions -#include "freertos/FreeRTOS.h" // for task creation and queues access -#include "freertos/event_groups.h" // for event groups -#include "esp_modbus_common.h" // for common types - -#ifdef __cplusplus -extern "C" { -#endif - -#define MB_SLAVE_CHECK(a, err_code, format, ...) MB_RETURN_ON_FALSE(a, err_code, TAG, format __VA_OPT__(,) __VA_ARGS__) - -#define MB_SLAVE_ASSERT(con) do { \ - if (!(con)) { ESP_LOGE(TAG, "assert errno:%u, errno_str: !(%s)", (unsigned)errno, strerror(errno)); assert(0 && #con); } \ - } while (0) - -/** - * @brief Parameter access event information type - */ -typedef struct { - uint32_t time_stamp; /*!< Timestamp of Modbus Event (uS)*/ - uint16_t mb_offset; /*!< Modbus register offset */ - mb_event_group_t type; /*!< Modbus event type */ - uint8_t* address; /*!< Modbus data storage address */ - size_t size; /*!< Modbus event register size (number of registers)*/ -} mb_param_info_t; - -/** - * @brief Parameter storage area descriptor - */ -typedef struct { - uint16_t start_offset; /*!< Modbus start address for area descriptor */ - mb_param_type_t type; /*!< Type of storage area descriptor */ - void* address; /*!< Instance address for storage area descriptor */ - size_t size; /*!< Instance size for area descriptor (bytes) */ -} mb_register_area_descriptor_t; - -/** - * @brief Initialize Modbus Slave controller and stack for TCP port - * - * @param[out] handler handler(pointer) to master data structure - * @return - * - ESP_OK Success - * - ESP_ERR_NO_MEM Parameter error - * - ESP_ERR_NOT_SUPPORTED Port type not supported - * - ESP_ERR_INVALID_STATE Initialization failure - */ -esp_err_t mbc_slave_init_tcp(void** handler); - -/** - * @brief Initialize Modbus Slave controller and stack for Serial port - * - * @param[out] handler handler(pointer) to master data structure - * @param[in] port_type the type of port - * @return - * - ESP_OK Success - * - ESP_ERR_NO_MEM Parameter error - * - ESP_ERR_NOT_SUPPORTED Port type not supported - * - ESP_ERR_INVALID_STATE Initialization failure - */ -esp_err_t mbc_slave_init(mb_port_type_t port_type, void** handler); - -/** - * @brief Initialize Modbus Slave controller interface handle - * - * @param[in] handler - pointer to slave interface data structure - */ -void mbc_slave_init_iface(void* handler); - -/** - * @brief Destroy Modbus controller and stack - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_STATE Parameter error - */ -esp_err_t mbc_slave_destroy(void); - -/** - * @brief Start Modbus communication stack - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_ARG Modbus stack start error - */ -esp_err_t mbc_slave_start(void); - -/** - * @brief Set Modbus communication parameters for the controller - * - * @param comm_info Communication parameters structure. - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_ARG Incorrect parameter data - */ -esp_err_t mbc_slave_setup(void* comm_info); - -/** - * @brief Wait for specific event on parameter change. - * - * @param group Group event bit mask to wait for change - * - * @return - * - mb_event_group_t event bits triggered - */ -mb_event_group_t mbc_slave_check_event(mb_event_group_t group); - -/** - * @brief Get parameter information - * - * @param[out] reg_info parameter info structure - * @param timeout Timeout in milliseconds to read information from - * parameter queue - * @return - * - ESP_OK Success - * - ESP_ERR_TIMEOUT Can not get data from parameter queue - * or queue overflow - */ -esp_err_t mbc_slave_get_param_info(mb_param_info_t* reg_info, uint32_t timeout); - -/** - * @brief Set Modbus area descriptor - * - * @param descr_data Modbus registers area descriptor structure - * - * @return - * - ESP_OK: The appropriate descriptor is set - * - ESP_ERR_INVALID_ARG: The argument is incorrect - */ -esp_err_t mbc_slave_set_descriptor(mb_register_area_descriptor_t descr_data); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/include/mb_endianness_utils.h b/managed_components/espressif__esp-modbus/freemodbus/common/include/mb_endianness_utils.h deleted file mode 100755 index 1a1c731..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/include/mb_endianness_utils.h +++ /dev/null @@ -1,556 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2024 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#pragma once - -#include - -/** - * @brief Defines the constant values based on native compiler byte ordering. - */ -#define MB_BO16_0 0 -#define MB_BO16_1 1 - -#define MB_BO32_0 0 -#define MB_BO32_1 1 -#define MB_BO32_2 2 -#define MB_BO32_3 3 - -#define MB_BO64_0 0 -#define MB_BO64_1 1 -#define MB_BO64_2 2 -#define MB_BO64_3 3 -#define MB_BO64_4 4 -#define MB_BO64_5 5 -#define MB_BO64_6 6 -#define MB_BO64_7 7 - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief The sized array types used for mapping of extended values - */ -typedef uint8_t val_16_arr[2]; -typedef uint8_t val_32_arr[4]; -typedef uint8_t val_64_arr[8]; - -/** - * @brief Get int8_t (low byte) value represenatation from register - * - * @return - * - int8_t value of converted from register value - */ -int8_t mb_get_int8_a(val_16_arr *pi16); - -/** - * @brief Set i8 value to the register value pointed by pi16 - * - * @return - * - uint16_t value which represents the actual hex value of the register - */ -uint16_t mb_set_int8_a(val_16_arr *pi16, int8_t i8); - -/** - * @brief Get int8_t (high byte) value from the register value pointed by pi16 - * - * @return - * - uint16_t value which represents the actual hex value of the register - */ -int8_t mb_get_int8_b(val_16_arr *pi16); - -/** - * @brief Set i8 (high byte) value from the register value pointed by pi16 - * - * @return - * - uint16_t value which represents the actual hex value of the register - */ -uint16_t mb_set_int8_b(val_16_arr *pi16, int8_t i8); - -/** - * @brief Get uint8_t (low byte) value represenatation from register poined by pu16 - * - * @return - * - uint8_t the value of converted from register value - */ -uint8_t mb_get_uint8_a(val_16_arr *pu16); - -/** - * @brief Set u8 (low byte) value into the register value pointed by pu16 - * - * @return - * - uint16_t the value which represents the actual hex value of the register - */ -uint16_t mb_set_uint8_a(val_16_arr *pu16, uint8_t u8); - -/** - * @brief Get uint8_t (high byte) value from the register value pointed by pu16 - * - * @return - * - uint16_t the value which represents the actual hex value of the register - */ -uint8_t mb_get_uint8_b(val_16_arr *pu16); - -/** - * @brief Set u8 (high byte) value into the register value pointed by pu16 - * - * @return - * - uint16_t the value which represents the actual hex value of the register - */ -uint16_t mb_set_uint8_b(val_16_arr *pu16, uint8_t u8); - -/** - * @brief Get int16_t value from the register value pointed by pu16 with ab endianness - * - * @return - * - int16_t the value which represents the converted value from register - */ -int16_t mb_get_int16_ab(val_16_arr *pi16); - -/** - * @brief Set i16 value to the register pointed by pi16 with ab endianness - * - * @return - * - int16_t the value which represents the converted value from register - */ -uint16_t mb_set_int16_ab(val_16_arr *pi16, int16_t i16); - -/** - * @brief Get uint16_t value from the register value pointed by pu16 with ab endianness - * - * @return - * - uint16_t value which represents the converted register value - */ -uint16_t mb_get_uint16_ab(val_16_arr *pu16); - -/** - * @brief Set u16 value to the register pointed by pu16 with ab endianness - * - * @return - * - uint16_t value which represents the converted value from register - */ -uint16_t mb_set_uint16_ab(val_16_arr *pu16, uint16_t u16); - -/** - * @brief Get int16_t value from the register value pointed by pu16 with ba endianness - * - * @return - * - int16_t value which represents the converted register value - */ -int16_t mb_get_int16_ba(val_16_arr *pi16); - -/** - * @brief Set i16 value to the register pointed by pi16 with ba endianness - * - * @return - * - uint16_t value which represents the converted value from register - */ -uint16_t mb_set_int16_ba(val_16_arr *pi16, int16_t i16); - -/** - * @brief Get uint16_t value from the register value pointed by pu16 with ba endianness - * - * @return - * - uint16_t value which represents the converted register value - */ -uint16_t mb_get_uint16_ba(val_16_arr *pu16); - -/** - * @brief Set u16 value to the register pointed by pu16 with ba endianness - * - * @return - * - uint16_t value which represents the converted value from register - */ -uint16_t mb_set_uint16_ba(val_16_arr *pu16, uint16_t u16); - -/** - * @brief Get int32_t value from the register value pointed by pi32 with abcd endianness - * - * @return - * - int32_t value which represents the converted register value - */ -int32_t mb_get_int32_abcd(val_32_arr *pi32); - -/** - * @brief Set i32 value to the register pointed by pi32 with abcd endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_int32_abcd(val_32_arr *pi32, int32_t i32); - -/** - * @brief Get uint32_t value from the register value pointed by pu32 with abcd endianness - * - * @return - * - uint32_t value which represents the converted register value - */ -uint32_t mb_get_uint32_abcd(val_32_arr *pu32); - -/** - * @brief Set u32 value to the register pointed by pu32 with abcd endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_uint32_abcd(val_32_arr *pu32, uint32_t u32); - -/** - * @brief Get int32_t value from the register value pointed by pi32 with badc endianness - * - * @return - * - int32_t value which represents the converted register value - */ -int32_t mb_get_int32_badc(val_32_arr *pi32); - -/** - * @brief Set i32 value to the register pointed by pi32 with badc endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_int32_badc(val_32_arr *pi32, int32_t i32); - -/** - * @brief Get uint32_t value from the register value pointed by pu32 with badc endianness - * - * @return - * - unt32_t value which represents the converted register value - */ -uint32_t mb_get_uint32_badc(val_32_arr *pu32); - -/** - * @brief Set u32 value to the register pointed by pu32 with badc endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_uint32_badc(val_32_arr *pu32, uint32_t u32); - -/** - * @brief Get int32_t value from the register value pointed by pi32 with cdab endianness - * - * @return - * - int32_t value which represents the converted register value - */ -int32_t mb_get_int32_cdab(val_32_arr *pi32); - -/** - * @brief Set i32 value to the register pointed by pi32 with cdab endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_int32_cdab(val_32_arr *pi32, int32_t i32); - -/** - * @brief Get uint32_t value from the register value pointed by pu32 with cdab endianness - * - * @return - * - int32_t value which represents the converted register value - */ -uint32_t mb_get_uint32_cdab(val_32_arr *pu32); - -/** - * @brief Set u32 value to the register pointed by pu32 with cdab endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_uint32_cdab(val_32_arr *pu32, uint32_t u32); - -/** - * @brief Get int32_t value from the register value pointed by pi32 with dcba endianness - * - * @return - * - int32_t value which represents the converted register value - */ -int32_t mb_get_int32_dcba(val_32_arr *pi32); - -/** - * @brief Set i32 value to the register pointed by pi32 with dcba endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_int32_dcba(val_32_arr *pi32, int32_t i32); - -/** - * @brief Get uint32_t value from the register value pointed by pu32 with dcba endianness - * - * @return - * - uint32_t value which represents the converted register value - */ -uint32_t mb_get_uint32_dcba(val_32_arr *pu32); - -/** - * @brief Set u32 value to the register pointed by pu32 with dcba endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_uint32_dcba(val_32_arr *pu32, uint32_t u32); - -/** - * @brief Get float value from the register pointed by pf with abcd endianness - * - * @return - * - float value which represents the converted register value - */ -float mb_get_float_abcd(val_32_arr *pf); - -/** - * @brief Set f value to the register pointed by pf with abcd endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_float_abcd(val_32_arr *pf, float f); - -/** - * @brief Get float value from the register pointed by pf with badc endianness - * - * @return - * - float value which represents the converted register value - */ -float mb_get_float_badc(val_32_arr *pf); - -/** - * @brief Set f value to the register pointed by pf with badc endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_float_badc(val_32_arr *pf, float f); - -/** - * @brief Get float value from the register pointed by pf with cdab endianness - * - * @return - * - float value which represents the converted register value - */ -float mb_get_float_cdab(val_32_arr *pf); - -/** - * @brief Set f value to the register pointed by pf with cdab endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_float_cdab(val_32_arr *pf, float f); - -/** - * @brief Get float value from the register pointed by pf with dcba endianness - * - * @return - * - float value which represents the converted register value - */ -float mb_get_float_dcba(val_32_arr *pf); - -/** - * @brief Set f value to the register pointed by pf with dcba endianness - * - * @return - * - uint32_t value which represents the converted value from register - */ -uint32_t mb_set_float_dcba(val_32_arr *pf, float f); - -/** - * @brief Get double value from the register pointed by pd with abcdefgh endianness - * - * @return - * - double value which represents the converted register value - */ -double mb_get_double_abcdefgh(val_64_arr *pd); - -/** - * @brief Set d value to the register pointed by pd with abcdefgh endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_double_abcdefgh(val_64_arr *pd, double d); - -/** - * @brief Get double value from the register pointed by pd with hgfedcba endianness - * - * @return - * - double value which represents the converted register value - */ -double mb_get_double_hgfedcba(val_64_arr *pd); - -/** - * @brief Set d value to the register pointed by pd with hgfedcba endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_double_hgfedcba(val_64_arr *pd, double d); - -/** - * @brief Get double value from the register pointed by pd with ghefcdab endianness - * - * @return - * - double value which represents the converted register value - */ -double mb_get_double_ghefcdab(val_64_arr *pd); - -/** - * @brief Set d value to the register pointed by pd with ghefcdab endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_double_ghefcdab(val_64_arr *pd, double d); - -/** - * @brief Get double value from the register pointed by pd with badcfehg endianness - * - * @return - * - double value which represents the converted register value - */ -double mb_get_double_badcfehg(val_64_arr *pd); - -/** - * @brief Set d value to the register pointed by pd with badcfehg endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_double_badcfehg(val_64_arr *pd, double d); - -/** - * @brief Get int64_t value from the register pointed by pi64 with abcdefgh endianness - * - * @return - * - int64_t value which represents the converted register value - */ -int64_t mb_get_int64_abcdefgh(val_64_arr *pi64); - -/** - * @brief Set i value to the register pointed by pi with abcdefgh endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_int64_abcdefgh(val_64_arr *pi, int64_t i); - -/** - * @brief Get int64_t value from the register pointed by pi64 with ghefcdab endianness - * - * @return - * - int64_t value which represents the converted register value - */ -int64_t mb_get_int64_ghefcdab(val_64_arr *pi64); - -/** - * @brief Set i value to the register pointed by pi with ghefcdab endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_int64_ghefcdab(val_64_arr *pi, int64_t i); - -/** - * @brief Get int64_t value from the register pointed by pi64 with hgfedcba endianness - * - * @return - * - int64_t value which represents the converted register value - */ -int64_t mb_get_int64_hgfedcba(val_64_arr *pi64); - -/** - * @brief Set i value to the register pointed by pi with hgfedcba endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_int64_hgfedcba(val_64_arr *pi, int64_t i); - -/** - * @brief Get int64_t value from the register pointed by pi64 with badcfehg endianness - * - * @return - * - int64_t value which represents the converted register value - */ -int64_t mb_get_int64_badcfehg(val_64_arr *pi64); - -/** - * @brief Set i value to the register pointed by pi with badcfehg endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_int64_badcfehg(val_64_arr *pi, int64_t i); - -/** - * @brief Get uint64_t value from the register pointed by pui with abcdefgh endianness - * - * @return - * - uint64_t value which represents the converted register value - */ -uint64_t mb_get_uint64_abcdefgh(val_64_arr *pui); - -/** - * @brief Set ui value to the register pointed by pi with abcdefgh endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_uint64_abcdefgh(val_64_arr *pui, uint64_t ui); - -/** - * @brief Get uint64_t value from the register pointed by pui with hgfedcba endianness - * - * @return - * - uint64_t value which represents the converted register value - */ -uint64_t mb_get_uint64_hgfedcba(val_64_arr *pui); - -/** - * @brief Set ui value to the register pointed by pui with hgfedcba endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_uint64_hgfedcba(val_64_arr *pui, uint64_t ui); - -/** - * @brief Get uint64_t value from the register pointed by pui with ghefcdab endianness - * - * @return - * - uint64_t value which represents the converted register value - */ -uint64_t mb_get_uint64_ghefcdab(val_64_arr *pui); - -/** - * @brief Set ui value to the register pointed by pui with ghefcdab endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_uint64_ghefcdab(val_64_arr *pui, uint64_t ui); - -/** - * @brief Get uint64_t value from the register pointed by pui with badcfehg endianness - * - * @return - * - uint64_t value which represents the converted register value - */ -uint64_t mb_get_uint64_badcfehg(val_64_arr *pui); - -/** - * @brief Set ui value to the register pointed by pui with badcfehg endianness - * - * @return - * - uint64_t value which represents the converted value from register - */ -uint64_t mb_set_uint64_badcfehg(val_64_arr *pui, uint64_t ui); - -#ifdef __cplusplus -} -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/include/mbcontroller.h b/managed_components/espressif__esp-modbus/freemodbus/common/include/mbcontroller.h deleted file mode 100755 index 10205f8..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/include/mbcontroller.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ -// mbcontroller.h -// mbcontroller - common Modbus controller header file - -#ifndef _MODBUS_CONTROLLER_COMMON -#define _MODBUS_CONTROLLER_COMMON - -#include // for standard int types definition -#include // for NULL and std defines -#include "string.h" // for strerror() -#include "errno.h" // for errno -#include "esp_err.h" // for error handling -#include "driver/uart.h" // for uart port number defines -#include "sdkconfig.h" // for KConfig options - -#include "esp_modbus_master.h" -#include "esp_modbus_slave.h" - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/mb_endianness_utils.c b/managed_components/espressif__esp-modbus/freemodbus/common/mb_endianness_utils.c deleted file mode 100755 index 4a3a424..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/mb_endianness_utils.c +++ /dev/null @@ -1,683 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2024 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ -#include -#include - -#include "mb_endianness_utils.h" - -#define INLINE inline __attribute__((always_inline)) - -static INLINE int16_t mb_get_int16_generic(int n0, int n1, val_16_arr *psrc) -{ - val_16_arr *pv = psrc; - union { - val_16_arr arr; - int16_t value; - } bov; - bov.arr[n0] = (*pv)[MB_BO16_0]; - bov.arr[n1] = (*pv)[MB_BO16_1]; - return (bov.value); -} - -static INLINE uint16_t mb_get_uint16_generic(int n0, int n1, val_16_arr *psrc) -{ - val_16_arr *pv = psrc; - union { - val_16_arr arr; - uint16_t value; - } bov; - bov.arr[n0] = (*pv)[MB_BO16_0]; - bov.arr[n1] = (*pv)[MB_BO16_1]; - return (bov.value); -} - -static INLINE uint16_t mb_set_uint16_generic(int n0, int n1, val_16_arr *pdest, uint16_t val) -{ - val_16_arr *pv = pdest; - union { - val_16_arr arr; - uint16_t value; - } bov; - bov.value = val; - (*pv)[MB_BO16_0] = bov.arr[n0]; - (*pv)[MB_BO16_1] = bov.arr[n1]; - return (*((uint16_t *)pv)); -} - -static INLINE int16_t mb_set_int16_generic(int n0, int n1, val_16_arr *pdest, int16_t val) -{ - val_16_arr *pv = pdest; - union { - val_16_arr arr; - int16_t value; - } bov; - bov.value = val; - (*pv)[MB_BO16_0] = bov.arr[n0]; - (*pv)[MB_BO16_1] = bov.arr[n1]; - return (*((uint16_t *)pv)); -} - -static INLINE uint32_t mb_get_uint32_generic(int n0, int n1, int n2, int n3, val_32_arr *psrc) -{ - val_32_arr *pv = psrc; - union { - val_32_arr arr; - uint32_t value; - } bov; - bov.arr[n0] = (*pv)[MB_BO32_0]; - bov.arr[n1] = (*pv)[MB_BO32_1]; - bov.arr[n2] = (*pv)[MB_BO32_2]; - bov.arr[n3] = (*pv)[MB_BO32_3]; - return (bov.value); -} - -static INLINE int32_t mb_get_int32_generic(int n0, int n1, int n2, int n3, val_32_arr *psrc) -{ - val_32_arr *pv = psrc; - union { - val_32_arr arr; - int32_t value; - } bov; - bov.arr[n0] = (*pv)[MB_BO32_0]; - bov.arr[n1] = (*pv)[MB_BO32_1]; - bov.arr[n2] = (*pv)[MB_BO32_2]; - bov.arr[n3] = (*pv)[MB_BO32_3]; - return (bov.value); -} - -static INLINE float mb_get_float_generic(int n0, int n1, int n2, int n3, val_32_arr *psrc) -{ - val_32_arr *pv = psrc; - union { - val_32_arr arr; - float value; - } bov; - bov.arr[n0] = (*pv)[MB_BO32_0]; - bov.arr[n1] = (*pv)[MB_BO32_1]; - bov.arr[n2] = (*pv)[MB_BO32_2]; - bov.arr[n3] = (*pv)[MB_BO32_3]; - return (bov.value); -} - -static INLINE uint32_t mb_set_int32_generic(int n0, int n1, int n2, int n3, val_32_arr *pdest, int32_t val) -{ - val_32_arr *pv = pdest; - union { - val_32_arr arr; - int32_t value; - } bov; - bov.value = val; - (*pv)[MB_BO32_0] = bov.arr[n0]; - (*pv)[MB_BO32_1] = bov.arr[n1]; - (*pv)[MB_BO32_2] = bov.arr[n2]; - (*pv)[MB_BO32_3] = bov.arr[n3]; - return (*((uint32_t *)pv)); -} - -static INLINE uint32_t mb_set_uint32_generic(int n0, int n1, int n2, int n3, val_32_arr *pdest, uint32_t val) -{ - val_32_arr *pv = pdest; - union { - val_32_arr arr; - uint32_t value; - } bov; - bov.value = val; - (*pv)[MB_BO32_0] = bov.arr[n0]; - (*pv)[MB_BO32_1] = bov.arr[n1]; - (*pv)[MB_BO32_2] = bov.arr[n2]; - (*pv)[MB_BO32_3] = bov.arr[n3]; - return (*((uint32_t *)pv)); -} - -static INLINE uint32_t mb_set_float_generic(int n0, int n1, int n2, int n3, val_32_arr *pdest, float val) -{ - val_32_arr *pv = pdest; - union { - val_32_arr arr; - float value; - } bov; - bov.value = val; - (*pv)[MB_BO32_0] = bov.arr[n0]; - (*pv)[MB_BO32_1] = bov.arr[n1]; - (*pv)[MB_BO32_2] = bov.arr[n2]; - (*pv)[MB_BO32_3] = bov.arr[n3]; - return (*((uint32_t *)pv)); -} - -static INLINE int64_t mb_get_int64_generic(int n0, int n1, int n2, int n3, int n4, int n5, int n6, int n7, val_64_arr *psrc) -{ - val_64_arr *pv64 = psrc; - union { - val_64_arr arr; - int64_t value; - } bo64; - bo64.arr[n0] = (*pv64)[MB_BO64_0]; - bo64.arr[n1] = (*pv64)[MB_BO64_1]; - bo64.arr[n2] = (*pv64)[MB_BO64_2]; - bo64.arr[n3] = (*pv64)[MB_BO64_3]; - bo64.arr[n4] = (*pv64)[MB_BO64_4]; - bo64.arr[n5] = (*pv64)[MB_BO64_5]; - bo64.arr[n6] = (*pv64)[MB_BO64_6]; - bo64.arr[n7] = (*pv64)[MB_BO64_7]; - return (bo64.value); -} - -static INLINE uint64_t mb_get_uint64_generic(int n0, int n1, int n2, int n3, int n4, int n5, int n6, int n7, val_64_arr *psrc) -{ - val_64_arr *pv64 = psrc; - union { - val_64_arr arr; - uint64_t value; - } bo64; - bo64.arr[n0] = (*pv64)[MB_BO64_0]; - bo64.arr[n1] = (*pv64)[MB_BO64_1]; - bo64.arr[n2] = (*pv64)[MB_BO64_2]; - bo64.arr[n3] = (*pv64)[MB_BO64_3]; - bo64.arr[n4] = (*pv64)[MB_BO64_4]; - bo64.arr[n5] = (*pv64)[MB_BO64_5]; - bo64.arr[n6] = (*pv64)[MB_BO64_6]; - bo64.arr[n7] = (*pv64)[MB_BO64_7]; - return (bo64.value); -} - -static INLINE double mb_get_double_generic(int n0, int n1, int n2, int n3, int n4, int n5, int n6, int n7, val_64_arr *psrc) -{ - val_64_arr *pv64 = psrc; - union { - val_64_arr arr; - double value; - } bo64; - bo64.arr[n0] = (*pv64)[MB_BO64_0]; - bo64.arr[n1] = (*pv64)[MB_BO64_1]; - bo64.arr[n2] = (*pv64)[MB_BO64_2]; - bo64.arr[n3] = (*pv64)[MB_BO64_3]; - bo64.arr[n4] = (*pv64)[MB_BO64_4]; - bo64.arr[n5] = (*pv64)[MB_BO64_5]; - bo64.arr[n6] = (*pv64)[MB_BO64_6]; - bo64.arr[n7] = (*pv64)[MB_BO64_7]; - return (bo64.value); -} - -static INLINE uint64_t mb_set_int64_generic(int n0, int n1, int n2, int n3, int n4, int n5, int n6, int n7, val_64_arr *pdest, int64_t val) -{ - val_64_arr *pv = pdest; - union { - val_64_arr arr; - int64_t value; - } bo64; - bo64.value = val; - (*pv)[MB_BO64_0] = bo64.arr[n0]; - (*pv)[MB_BO64_1] = bo64.arr[n1]; - (*pv)[MB_BO64_2] = bo64.arr[n2]; - (*pv)[MB_BO64_3] = bo64.arr[n3]; - (*pv)[MB_BO64_4] = bo64.arr[n4]; - (*pv)[MB_BO64_5] = bo64.arr[n5]; - (*pv)[MB_BO64_6] = bo64.arr[n6]; - (*pv)[MB_BO64_7] = bo64.arr[n7]; - return (*((uint64_t *)pv)); -} - -static INLINE uint64_t mb_set_uint64_generic(int n0, int n1, int n2, int n3, int n4, int n5, int n6, int n7, val_64_arr *pdest, uint64_t val) -{ - val_64_arr *pv = pdest; - union { - val_64_arr arr; - uint64_t value; - } bo64; - bo64.value = val; - (*pv)[MB_BO64_0] = bo64.arr[n0]; - (*pv)[MB_BO64_1] = bo64.arr[n1]; - (*pv)[MB_BO64_2] = bo64.arr[n2]; - (*pv)[MB_BO64_3] = bo64.arr[n3]; - (*pv)[MB_BO64_4] = bo64.arr[n4]; - (*pv)[MB_BO64_5] = bo64.arr[n5]; - (*pv)[MB_BO64_6] = bo64.arr[n6]; - (*pv)[MB_BO64_7] = bo64.arr[n7]; - return (*((uint64_t *)pv)); -} - -static INLINE uint64_t mb_set_double_generic(int n0, int n1, int n2, int n3, int n4, int n5, int n6, int n7, val_64_arr *pdest, double val) -{ - val_64_arr *pv = pdest; - union { - val_64_arr arr; - double value; - } bo64; - bo64.value = val; - (*pv)[MB_BO64_0] = bo64.arr[n0]; - (*pv)[MB_BO64_1] = bo64.arr[n1]; - (*pv)[MB_BO64_2] = bo64.arr[n2]; - (*pv)[MB_BO64_3] = bo64.arr[n3]; - (*pv)[MB_BO64_4] = bo64.arr[n4]; - (*pv)[MB_BO64_5] = bo64.arr[n5]; - (*pv)[MB_BO64_6] = bo64.arr[n6]; - (*pv)[MB_BO64_7] = bo64.arr[n7]; - return (*((uint64_t *)pv)); -} - -int8_t mb_get_int8_a(pi16) -val_16_arr *pi16; -{ - return((int8_t)(*pi16)[MB_BO16_0]); -} - -uint16_t mb_set_int8_a(pi16, i8) -val_16_arr *pi16; -int8_t i8; -{ - (*pi16)[MB_BO16_0] = (uint8_t)i8; - (*pi16)[MB_BO16_1] = 0; - return (*((uint16_t *)pi16)); -} - -int8_t mb_get_int8_b(pi16) -val_16_arr *pi16; -{ - return((int8_t)(*pi16)[MB_BO16_1]); -} - -uint16_t mb_set_int8_b(pi16, i8) -val_16_arr *pi16; -int8_t i8; -{ - (*pi16)[MB_BO16_0] = 0; - (*pi16)[MB_BO16_1] = (int8_t)i8; - return (*((uint16_t *)pi16)); -} - -uint8_t mb_get_uint8_a(pu16) -val_16_arr *pu16; -{ - return((uint8_t)(*pu16)[MB_BO16_0]); -} - -uint16_t mb_set_uint8_a(pu16, u8) -val_16_arr *pu16; -uint8_t u8; -{ - (*pu16)[MB_BO16_0] = (uint8_t)u8; - (*pu16)[MB_BO16_1] = 0; - return (*((uint16_t *)pu16)); -} - -uint8_t mb_get_uint8_b(pu16) -val_16_arr *pu16; -{ - return((uint8_t)(*pu16)[MB_BO16_1]); -} - -uint16_t mb_set_uint8_b(pu16, u8) -val_16_arr *pu16; -uint8_t u8; -{ - (*pu16)[MB_BO16_0] = 0; - (*pu16)[MB_BO16_1] = (uint8_t)u8; - return (*((uint16_t *)pu16)); -} - -int16_t mb_get_int16_ab(pi16) -val_16_arr *pi16; -{ - return mb_get_int16_generic(0, 1, pi16); -} - -uint16_t mb_set_int16_ab(pi16, i16) -val_16_arr *pi16; -int16_t i16; -{ - return mb_set_int16_generic(0, 1, pi16, i16); -} - -uint16_t mb_get_uint16_ab(pu16) -val_16_arr *pu16; -{ - return mb_get_uint16_generic(0, 1, pu16); -} - -uint16_t mb_set_uint16_ab(pu16, u16) -val_16_arr *pu16; -uint16_t u16; -{ - return mb_set_uint16_generic(0, 1, pu16, u16); -} - -int16_t mb_get_int16_ba(pi16) -val_16_arr *pi16; -{ - return mb_get_int16_generic(1, 0, pi16); -} - -uint16_t mb_set_int16_ba(pi16, i16) -val_16_arr *pi16; -int16_t i16; -{ - return mb_set_int16_generic(1, 0, pi16, i16); -} - -uint16_t mb_get_uint16_ba(pu16) -val_16_arr *pu16; -{ - return mb_get_int16_generic(1, 0, pu16); -} - -uint16_t mb_set_uint16_ba(pu16, u16) -val_16_arr *pu16; -uint16_t u16; -{ - return mb_set_int16_generic(1, 0, pu16, u16); -} - -int32_t mb_get_int32_abcd(pi32) -val_32_arr *pi32; -{ - return mb_get_int32_generic(0, 1, 2, 3, pi32); -} - -uint32_t mb_set_int32_abcd(pi32, i32) -val_32_arr *pi32; -int32_t i32; -{ - return mb_set_int32_generic(0, 1, 2, 3, pi32, i32); -} - -uint32_t mb_get_uint32_abcd(pu32) -val_32_arr *pu32; -{ - return mb_get_uint32_generic(0, 1, 2, 3, pu32); -} - -uint32_t mb_set_uint32_abcd(pu32, u32) -val_32_arr *pu32; -uint32_t u32; -{ - return mb_set_uint32_generic(0, 1, 2, 3, pu32, u32); -} - -int32_t mb_get_int32_badc(pi32) -val_32_arr *pi32; -{ - return mb_get_int32_generic(1, 0, 3, 2, pi32); -} - -uint32_t mb_set_int32_badc(pi32, i32) -val_32_arr *pi32; -int32_t i32; -{ - return mb_set_int32_generic(1, 0, 3, 2, pi32, i32); -} - -uint32_t mb_get_uint32_badc(pu32) -val_32_arr *pu32; -{ - return mb_get_uint32_generic(1, 0, 3, 2, pu32); -} - -uint32_t mb_set_uint32_badc(pu32, u32) -val_32_arr *pu32; -uint32_t u32; -{ - return mb_set_uint32_generic(1, 0, 3, 2, pu32, u32); -} - -int32_t mb_get_int32_cdab(pi32) -val_32_arr *pi32; -{ - return mb_get_int32_generic(2, 3, 0, 1, pi32); -} - -uint32_t mb_set_int32_cdab(pi32, i32) -val_32_arr *pi32; -int32_t i32; -{ - return mb_set_int32_generic(2, 3, 0, 1, pi32, i32); -} - -uint32_t mb_get_uint32_cdab(pu32) -val_32_arr *pu32; -{ - return mb_get_uint32_generic(2, 3, 0, 1, pu32); -} - -uint32_t mb_set_uint32_cdab(pu32, u32) -val_32_arr *pu32; -uint32_t u32; -{ - return mb_set_uint32_generic(2, 3, 0, 1, pu32, u32); -} - -int32_t mb_get_int32_dcba(pi32) -val_32_arr *pi32; -{ - return mb_get_int32_generic(3, 2, 1, 0, pi32); -} - -uint32_t mb_set_int32_dcba(pi32, i32) -val_32_arr *pi32; -int32_t i32; -{ - return mb_set_int32_generic(3, 2, 1, 0, pi32, i32); -} - -uint32_t mb_get_uint32_dcba(pu32) -val_32_arr *pu32; -{ - return mb_get_uint32_generic(3, 2, 1, 0, pu32); -} - -uint32_t mb_set_uint32_dcba(pu32, u32) -val_32_arr *pu32; -uint32_t u32; -{ - return mb_set_uint32_generic(3, 2, 1, 0, pu32, u32); -} - -float mb_get_float_abcd(pf) -val_32_arr *pf; -{ - return mb_get_float_generic(0, 1, 2, 3, pf); -} - -uint32_t mb_set_float_abcd(pf, f) -val_32_arr *pf; -float f; -{ - return mb_set_float_generic(0, 1, 2, 3, pf, f); -} - -float mb_get_float_badc(pf) -val_32_arr *pf; -{ - return mb_get_float_generic(1, 0, 3, 2, pf); -} - -uint32_t mb_set_float_badc(pf, f) -val_32_arr *pf; -float f; -{ - return mb_set_float_generic(1, 0, 3, 2, pf, f); -} - -float mb_get_float_cdab(pf) -val_32_arr *pf; -{ - return mb_get_float_generic(2, 3, 0, 1, pf); -} - -uint32_t mb_set_float_cdab(pf, f) -val_32_arr *pf; -float f; -{ - return mb_set_float_generic(2, 3, 0, 1, pf, f); -} - -float mb_get_float_dcba(pf) -val_32_arr *pf; -{ - return mb_get_float_generic(3, 2, 1, 0, pf); -} - -uint32_t mb_set_float_dcba(pf, f) -val_32_arr *pf; -float f; -{ - return mb_set_float_generic(3, 2, 1, 0, pf, f); -} - -double mb_get_double_abcdefgh(pd) -val_64_arr *pd; -{ - return mb_get_double_generic(0, 1, 2, 3, 4, 5, 6, 7, pd); -} - -uint64_t mb_set_double_abcdefgh(pd, d) -val_64_arr *pd; -double d; -{ - return mb_set_double_generic(0, 1, 2, 3, 4, 5, 6, 7, pd, d); -} - -double mb_get_double_hgfedcba(pd) -val_64_arr *pd; -{ - return mb_get_double_generic(7, 6, 5, 4, 3, 2, 1, 0, pd); -} - -uint64_t mb_set_double_hgfedcba(pd, d) -val_64_arr *pd; -double d; -{ - return mb_set_double_generic(7, 6, 5, 4, 3, 2, 1, 0, pd, d); -} - -double mb_get_double_ghefcdab(pd) -val_64_arr *pd; -{ - return mb_get_double_generic(6, 7, 4, 5, 2, 3, 0, 1, pd); -} - -uint64_t mb_set_double_ghefcdab(pd, d) -val_64_arr *pd; -double d; -{ - return mb_set_double_generic(6, 7, 4, 5, 2, 3, 0, 1, pd, d); -} - -double mb_get_double_badcfehg(pd) -val_64_arr *pd; -{ - return mb_get_double_generic(1, 0, 3, 2, 5, 4, 7, 6, pd); -} - -uint64_t mb_set_double_badcfehg(pd, d) -val_64_arr *pd; -double d; -{ - return mb_set_double_generic(1, 0, 3, 2, 5, 4, 7, 6, pd, d); -} - -int64_t mb_get_int64_abcdefgh(pi64) -val_64_arr *pi64; -{ - return mb_get_int64_generic(0, 1, 2, 3, 4, 5, 6, 7, pi64); -} - -uint64_t mb_set_int64_abcdefgh(pi, i) -val_64_arr *pi; -int64_t i; -{ - return mb_set_int64_generic(0, 1, 2, 3, 4, 5, 6, 7, pi, i); -} - -int64_t mb_get_int64_hgfedcba(pi64) -val_64_arr *pi64; -{ - return mb_get_int64_generic(7, 6, 5, 4, 3, 2, 1, 0, pi64); -} - -uint64_t mb_set_int64_hgfedcba(pi, i) -val_64_arr *pi; -int64_t i; -{ - return mb_set_int64_generic(7, 6, 5, 4, 3, 2, 1, 0, pi, i); -} - -int64_t mb_get_int64_ghefcdab(pi64) -val_64_arr *pi64; -{ - return mb_get_int64_generic(6, 7, 4, 5, 2, 3, 0, 1, pi64); -} - -uint64_t mb_set_int64_ghefcdab(pi, i) -val_64_arr *pi; -int64_t i; -{ - return mb_set_int64_generic(6, 7, 4, 5, 2, 3, 0, 1, pi, i); -} - -int64_t mb_get_int64_badcfehg(pi64) -val_64_arr *pi64; -{ - return mb_get_int64_generic(1, 0, 3, 2, 5, 4, 7, 6, pi64); -} - -uint64_t mb_set_int64_badcfehg(pi, i) -val_64_arr *pi; -int64_t i; -{ - return mb_set_int64_generic(1, 0, 3, 2, 5, 4, 7, 6, pi, i); -} - -uint64_t mb_get_uint64_abcdefgh(pui) -val_64_arr *pui; -{ - return mb_get_uint64_generic(0, 1, 2, 3, 4, 5, 6, 7, pui); -} - -uint64_t mb_set_uint64_abcdefgh(pui, ui) -val_64_arr *pui; -uint64_t ui; -{ - return mb_set_uint64_generic(0, 1, 2, 3, 4, 5, 6, 7, pui, ui); -} - -uint64_t mb_get_uint64_hgfedcba(pui) -val_64_arr *pui; -{ - return mb_get_uint64_generic(7, 6, 5, 4, 3, 2, 1, 0, pui); -} - -uint64_t mb_set_uint64_hgfedcba(pui, ui) -val_64_arr *pui; -uint64_t ui; -{ - return mb_set_uint64_generic(7, 6, 5, 4, 3, 2, 1, 0, pui, ui); -} - -uint64_t mb_get_uint64_ghefcdab(pui) -val_64_arr *pui; -{ - return mb_get_uint64_generic(6, 7, 4, 5, 2, 3, 0, 1, pui); -} - -uint64_t mb_set_uint64_ghefcdab(pui, ui) -val_64_arr *pui; -uint64_t ui; -{ - return mb_set_uint64_generic(6, 7, 4, 5, 2, 3, 0, 1, pui, ui); -} - -uint64_t mb_get_uint64_badcfehg(pui) -val_64_arr *pui; -{ - return mb_get_int64_generic(1, 0, 3, 2, 5, 4, 7, 6, pui); -} - -uint64_t mb_set_uint64_badcfehg(pui, ui) -val_64_arr *pui; -uint64_t ui; -{ - return mb_set_uint64_generic(1, 0, 3, 2, 5, 4, 7, 6, pui, ui); -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/mbc_master.h b/managed_components/espressif__esp-modbus/freemodbus/common/mbc_master.h deleted file mode 100755 index a736fab..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/mbc_master.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef _MB_CONTROLLER_MASTER_H -#define _MB_CONTROLLER_MASTER_H - -#include // for list -#include "freertos/FreeRTOS.h" // for task creation and queue access -#include "freertos/task.h" // for task api access -#include "freertos/event_groups.h" // for event groups -#include "driver/uart.h" // for UART types -#include "errno.h" // for errno -#include "esp_log.h" // for log write -#include "string.h" // for strerror() -#include "esp_modbus_common.h" // for common types -#include "esp_modbus_master.h" // for public master types -#include "esp_modbus_callbacks.h" -#include "mb_m.h" // this is required to expose current transaction info - -/* ----------------------- Defines ------------------------------------------*/ - -/** - * @brief Request mode for parameter to use in data dictionary - */ -typedef enum { - MB_PARAM_READ, /*!< Read parameter values. */ - MB_PARAM_WRITE /*!< Write parameter values. */ -} mb_param_mode_t; - -/** - * @brief Device communication parameters for master - */ -typedef struct { - mb_mode_type_t mode; /*!< Modbus communication mode */ - uint8_t dummy; /*!< Dummy field */ - uart_port_t port; /*!< Modbus communication port (UART) number */ - uint32_t baudrate; /*!< Modbus baudrate */ - uart_parity_t parity; /*!< Modbus UART parity settings */ -} mb_master_comm_info_t; - -#if MB_MASTER_TCP_ENABLED -/** - * @brief Modbus slave addr list item for the master - */ -typedef struct mb_slave_addr_entry_s{ - uint16_t index; /*!< Index of the slave address */ - const char* ip_address; /*!< IP address string of the slave */ - uint8_t slave_addr; /*!< Short slave address */ - void* p_data; /*!< pointer to data structure */ - LIST_ENTRY(mb_slave_addr_entry_s) entries; /*!< The slave address entry */ -} mb_slave_addr_entry_t; -#endif - -/** - * @brief Modbus controller handler structure - */ -typedef struct { - mb_port_type_t port_type; /*!< Modbus port type */ - mb_communication_info_t mbm_comm; /*!< Modbus communication info */ - uint8_t* mbm_reg_buffer_ptr; /*!< Modbus data buffer pointer */ - uint16_t mbm_reg_buffer_size; /*!< Modbus data buffer size */ - TaskHandle_t mbm_task_handle; /*!< Modbus task handle */ - EventGroupHandle_t mbm_event_group; /*!< Modbus controller event group */ - const mb_parameter_descriptor_t* mbm_param_descriptor_table; /*!< Modbus controller parameter description table */ - size_t mbm_param_descriptor_size; /*!< Modbus controller parameter description table size*/ -#if MB_MASTER_TCP_ENABLED - LIST_HEAD(mbm_slave_addr_info_, mb_slave_addr_entry_s) mbm_slave_list; /*!< Slave address information list */ - uint16_t mbm_slave_list_count; -#endif -} mb_master_options_t; - -typedef esp_err_t (*iface_get_cid_info)(uint16_t, const mb_parameter_descriptor_t**); /*!< Interface get_cid_info method */ -typedef esp_err_t (*iface_get_parameter)(uint16_t, char*, uint8_t*, uint8_t*); /*!< Interface get_parameter method */ -typedef esp_err_t (*iface_send_request)(mb_param_request_t*, void*); /*!< Interface send_request method */ -typedef esp_err_t (*iface_set_descriptor)(const mb_parameter_descriptor_t*, const uint16_t); /*!< Interface set_descriptor method */ -typedef esp_err_t (*iface_set_parameter)(uint16_t, char*, uint8_t*, uint8_t*); /*!< Interface set_parameter method */ - -/** - * @brief Modbus controller interface structure - */ -typedef struct { - // Master object interface options - mb_master_options_t opts; - - // Public interface methods - iface_init init; /*!< Interface method init */ - iface_destroy destroy; /*!< Interface method destroy */ - iface_setup setup; /*!< Interface method setup */ - iface_start start; /*!< Interface method start */ - iface_get_cid_info get_cid_info; /*!< Interface get_cid_info method */ - iface_get_parameter get_parameter; /*!< Interface get_parameter method */ - iface_send_request send_request; /*!< Interface send_request method */ - iface_set_descriptor set_descriptor; /*!< Interface set_descriptor method */ - iface_set_parameter set_parameter; /*!< Interface set_parameter method */ - // Modbus register calback function pointers - reg_discrete_cb master_reg_cb_discrete; /*!< Stack callback discrete rw method */ - reg_input_cb master_reg_cb_input; /*!< Stack callback input rw method */ - reg_holding_cb master_reg_cb_holding; /*!< Stack callback holding rw method */ - reg_coils_cb master_reg_cb_coils; /*!< Stack callback coils rw method */ -} mb_master_interface_t; - -#endif //_MB_CONTROLLER_MASTER_H diff --git a/managed_components/espressif__esp-modbus/freemodbus/common/mbc_slave.h b/managed_components/espressif__esp-modbus/freemodbus/common/mbc_slave.h deleted file mode 100755 index 5b54038..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/common/mbc_slave.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef _MB_CONTROLLER_SLAVE_H -#define _MB_CONTROLLER_SLAVE_H - -#include "driver/uart.h" // for uart defines -#include "errno.h" // for errno -#include "sys/queue.h" // for list -#include "esp_log.h" // for log write -#include "string.h" // for strerror() - -#include "esp_modbus_slave.h" // for public type defines -#include "esp_modbus_callbacks.h" // for callback functions - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_INST_MIN_SIZE (2) // The minimal size of Modbus registers area in bytes -#define MB_INST_MAX_SIZE (65535 * 2) // The maximum size of Modbus area in bytes - -#define MB_CONTROLLER_NOTIFY_QUEUE_SIZE (CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE) // Number of messages in parameter notification queue -#define MB_CONTROLLER_NOTIFY_TIMEOUT (pdMS_TO_TICKS(CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT)) // notification timeout - -/** - * @brief Device communication parameters for master - */ -typedef struct { - mb_mode_type_t mode; /*!< Modbus communication mode */ - uint8_t slave_addr; /*!< Slave address field */ - uart_port_t port; /*!< Modbus communication port (UART) number */ - uint32_t baudrate; /*!< Modbus baudrate */ - uart_parity_t parity; /*!< Modbus UART parity settings */ -} mb_slave_comm_info_t; - -/** - * @brief Modbus area descriptor list item - */ -typedef struct mb_descr_entry_s{ - uint16_t start_offset; /*!< Modbus start address for area descriptor */ - mb_param_type_t type; /*!< Type of storage area descriptor */ - void* p_data; /*!< Instance address for storage area descriptor */ - size_t size; /*!< Instance size for area descriptor (bytes) */ - LIST_ENTRY(mb_descr_entry_s) entries; /*!< The Modbus area descriptor entry */ -} mb_descr_entry_t; - -/** - * @brief Modbus controller handler structure - */ -typedef struct { - mb_port_type_t port_type; /*!< port type */ - mb_communication_info_t mbs_comm; /*!< communication info */ - TaskHandle_t mbs_task_handle; /*!< task handle */ - EventGroupHandle_t mbs_event_group; /*!< controller event group */ - QueueHandle_t mbs_notification_queue_handle; /*!< controller notification queue */ - LIST_HEAD(mbs_area_descriptors_, mb_descr_entry_s) mbs_area_descriptors[MB_PARAM_COUNT]; /*!< register area descriptors */ -} mb_slave_options_t; - -typedef mb_event_group_t (*iface_check_event)(mb_event_group_t); /*!< Interface method check_event */ -typedef esp_err_t (*iface_get_param_info)(mb_param_info_t*, uint32_t); /*!< Interface method get_param_info */ -typedef esp_err_t (*iface_set_descriptor)(mb_register_area_descriptor_t); /*!< Interface method set_descriptor */ - -/** - * @brief Request mode for parameter to use in data dictionary - */ -typedef struct -{ - mb_slave_options_t opts; /*!< Modbus slave options */ - - // Functional pointers to internal static functions of the implementation (public interface methods) - iface_init init; /*!< Interface method init */ - iface_destroy destroy; /*!< Interface method destroy */ - iface_setup setup; /*!< Interface method setup */ - iface_start start; /*!< Interface method start */ - iface_check_event check_event; /*!< Interface method check_event */ - iface_get_param_info get_param_info; /*!< Interface method get_param_info */ - iface_set_descriptor set_descriptor; /*!< Interface method set_descriptor */ - - // Modbus register calback function pointers - reg_discrete_cb slave_reg_cb_discrete; /*!< Stack callback discrete rw method */ - reg_input_cb slave_reg_cb_input; /*!< Stack callback input rw method */ - reg_holding_cb slave_reg_cb_holding; /*!< Stack callback holding rw method */ - reg_coils_cb slave_reg_cb_coils; /*!< Stack callback coils rw method */ -} mb_slave_interface_t; - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/ascii/mbascii.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/ascii/mbascii.c deleted file mode 100755 index 3650d53..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/ascii/mbascii.c +++ /dev/null @@ -1,495 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbascii.c,v 1.17 2010/06/06 13:47:07 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbconfig.h" -#include "mbascii.h" -#include "mbframe.h" - -#include "mbcrc.h" -#include "mbport.h" - -#if MB_SLAVE_ASCII_ENABLED > 0 - -/* ----------------------- Type definitions ---------------------------------*/ -typedef enum -{ - STATE_RX_IDLE, /*!< Receiver is in idle state. */ - STATE_RX_RCV, /*!< Frame is beeing received. */ - STATE_RX_WAIT_EOF /*!< Wait for End of Frame. */ -} eMBRcvState; - -typedef enum -{ - STATE_TX_IDLE, /*!< Transmitter is in idle state. */ - STATE_TX_START, /*!< Starting transmission (':' sent). */ - STATE_TX_DATA, /*!< Sending of data (Address, Data, LRC). */ - STATE_TX_END, /*!< End of transmission. */ - STATE_TX_NOTIFY /*!< Notify sender that the frame has been sent. */ -} eMBSndState; - -typedef enum -{ - BYTE_HIGH_NIBBLE, /*!< Character for high nibble of byte. */ - BYTE_LOW_NIBBLE /*!< Character for low nibble of byte. */ -} eMBBytePos; - -/* ----------------------- Shared variables ---------------------------------*/ -/* We reuse the Modbus RTU buffer because only one driver is active */ -extern volatile UCHAR ucMbSlaveBuf[]; - -/* ----------------------- Static functions ---------------------------------*/ -static UCHAR prvucMBCHAR2BIN( UCHAR ucCharacter ); - -static UCHAR prvucMBBIN2CHAR( UCHAR ucByte ); - -static UCHAR prvucMBLRC( UCHAR * pucFrame, USHORT usLen ); - -/* ----------------------- Static variables ---------------------------------*/ -static volatile eMBSndState eSndState; -static volatile eMBRcvState eRcvState; - -static volatile UCHAR *ucASCIIBuf = ucMbSlaveBuf; - -static volatile USHORT usRcvBufferPos; -static volatile eMBBytePos eBytePos; - -static volatile UCHAR *pucSndBufferCur; -static volatile USHORT usSndBufferCount; - -static volatile UCHAR ucLRC; -static volatile UCHAR ucMBLFCharacter; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBASCIIInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - ( void )ucSlaveAddress; - - ENTER_CRITICAL_SECTION( ); - ucMBLFCharacter = MB_ASCII_DEFAULT_LF; - - if( xMBPortSerialInit( ucPort, ulBaudRate, MB_ASCII_BITS_PER_SYMB, eParity ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - else if( xMBPortTimersInit( MB_ASCII_TIMEOUT_MS * 20UL ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - - EXIT_CRITICAL_SECTION( ); - - return eStatus; -} - -void -eMBASCIIStart( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBPortSerialEnable( TRUE, FALSE ); - eRcvState = STATE_RX_IDLE; - EXIT_CRITICAL_SECTION( ); - - /* No special startup required for ASCII. */ - ( void )xMBPortEventPost( EV_READY ); -} - -void -eMBASCIIStop( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBPortSerialEnable( FALSE, FALSE ); - vMBPortTimersDisable( ); - EXIT_CRITICAL_SECTION( ); -} - -eMBErrorCode -eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR *pucMBASCIIFrame = ( UCHAR* ) ucASCIIBuf; - USHORT usFrameLength = usRcvBufferPos; - - if( xMBPortSerialGetRequest( &pucMBASCIIFrame, &usFrameLength ) == FALSE ) - { - return MB_EIO; - } - - ENTER_CRITICAL_SECTION( ); - assert( usFrameLength < MB_SER_PDU_SIZE_MAX ); - - /* Length and CRC check */ - if( ( usFrameLength >= MB_ASCII_SER_PDU_SIZE_MIN ) - && ( prvucMBLRC( ( UCHAR * ) pucMBASCIIFrame, usFrameLength ) == 0 ) ) - { - /* Save the address field. All frames are passed to the upper layed - * and the decision if a frame is used is done there. - */ - *pucRcvAddress = pucMBASCIIFrame[MB_SER_PDU_ADDR_OFF]; - - /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus - * size of address field and CRC checksum. - */ - *pusLength = ( USHORT )( usFrameLength - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_LRC ); - - /* Return the start of the Modbus PDU to the caller. */ - *pucFrame = ( UCHAR * ) & pucMBASCIIFrame[MB_SER_PDU_PDU_OFF]; - } - else - { - eStatus = MB_EIO; - } - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -eMBErrorCode -eMBASCIISend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR usLRC; - - - /* Check if the receiver is still in idle state. If not we where too - * slow with processing the received frame and the master sent another - * frame on the network. We have to abort sending the frame. - */ - if( eRcvState == STATE_RX_IDLE ) - { - ENTER_CRITICAL_SECTION( ); - /* First byte before the Modbus-PDU is the slave address. */ - pucSndBufferCur = ( UCHAR * ) pucFrame - 1; - usSndBufferCount = 1; - - /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ - pucSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress; - usSndBufferCount += usLength; - - /* Calculate LRC checksum for Modbus-Serial-Line-PDU. */ - usLRC = prvucMBLRC( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ); - ucASCIIBuf[usSndBufferCount++] = usLRC; - - /* Activate the transmitter. */ - eSndState = STATE_TX_START; - EXIT_CRITICAL_SECTION( ); - - if ( xMBPortSerialSendResponse( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ) == FALSE ) - { - eStatus = MB_EIO; - } - - vMBPortSerialEnable( FALSE, TRUE ); - } - else - { - eStatus = MB_EIO; - } - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -BOOL -xMBASCIIReceiveFSM( void ) -{ - BOOL xNeedPoll = FALSE; - UCHAR ucByte; - UCHAR ucResult; - - assert( eSndState == STATE_TX_IDLE ); - - xNeedPoll = xMBPortSerialGetByte( ( CHAR * ) & ucByte ); - switch ( eRcvState ) - { - /* A new character is received. If the character is a ':' the input - * buffer is cleared. A CR-character signals the end of the data - * block. Other characters are part of the data block and their - * ASCII value is converted back to a binary representation. - */ - case STATE_RX_RCV: - /* Enable timer for character timeout. */ - vMBPortTimersEnable( ); - if( ucByte == ':' ) - { - /* Empty receive buffer. */ - eBytePos = BYTE_HIGH_NIBBLE; - usRcvBufferPos = 0; - } - else if( ucByte == MB_ASCII_DEFAULT_CR ) - { - eRcvState = STATE_RX_WAIT_EOF; - } - else - { - ucResult = prvucMBCHAR2BIN( ucByte ); - switch ( eBytePos ) - { - /* High nibble of the byte comes first. We check for - * a buffer overflow here. */ - case BYTE_HIGH_NIBBLE: - if( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ) - { - ucASCIIBuf[usRcvBufferPos] = ( UCHAR )( ucResult << 4 ); - eBytePos = BYTE_LOW_NIBBLE; - break; - } - else - { - /* not handled in Modbus specification but seems - * a resonable implementation. */ - eRcvState = STATE_RX_IDLE; - /* Disable previously activated timer because of error state. */ - vMBPortTimersDisable( ); - } - break; - - case BYTE_LOW_NIBBLE: - ucASCIIBuf[usRcvBufferPos] |= ucResult; - usRcvBufferPos++; - eBytePos = BYTE_HIGH_NIBBLE; - break; - } - } - break; - - case STATE_RX_WAIT_EOF: - if( ucByte == ucMBLFCharacter ) - { - /* Disable character timeout timer because all characters are - * received. */ - vMBPortTimersDisable( ); - /* Receiver is again in idle state. */ - eRcvState = STATE_RX_IDLE; - - /* Notify the caller of eMBASCIIReceive that a new frame - * was received. */ - (void)xMBPortEventPost( EV_FRAME_RECEIVED ); - } - else if( ucByte == ':' ) - { - /* Empty receive buffer and back to receive state. */ - eBytePos = BYTE_HIGH_NIBBLE; - usRcvBufferPos = 0; - eRcvState = STATE_RX_RCV; - - /* Enable timer for character timeout. */ - vMBPortTimersEnable( ); - } - else - { - /* Frame is not okay. Delete entire frame. */ - eRcvState = STATE_RX_IDLE; - } - break; - - case STATE_RX_IDLE: - if( ucByte == ':' ) - { - /* Enable timer for character timeout. */ - vMBPortTimersEnable( ); - /* Reset the input buffers to store the frame. */ - usRcvBufferPos = 0; - eBytePos = BYTE_HIGH_NIBBLE; - eRcvState = STATE_RX_RCV; - } - break; - } - - return xNeedPoll; -} - -BOOL -xMBASCIITransmitFSM( void ) -{ - BOOL xNeedPoll = TRUE; - UCHAR ucByte; - - assert( eRcvState == STATE_RX_IDLE ); - switch ( eSndState ) - { - /* Start of transmission. The start of a frame is defined by sending - * the character ':'. */ - case STATE_TX_START: - ucByte = ':'; - xMBPortSerialPutByte( ( CHAR )ucByte ); - eSndState = STATE_TX_DATA; - eBytePos = BYTE_HIGH_NIBBLE; - break; - - /* Send the data block. Each data byte is encoded as a character hex - * stream with the high nibble sent first and the low nibble sent - * last. If all data bytes are exhausted we send a '\r' character - * to end the transmission. */ - case STATE_TX_DATA: - if( usSndBufferCount > 0 ) - { - switch ( eBytePos ) - { - case BYTE_HIGH_NIBBLE: - ucByte = prvucMBBIN2CHAR( ( UCHAR )( *pucSndBufferCur >> 4 ) ); - xMBPortSerialPutByte( ( CHAR ) ucByte ); - eBytePos = BYTE_LOW_NIBBLE; - break; - - case BYTE_LOW_NIBBLE: - ucByte = prvucMBBIN2CHAR( ( UCHAR )( *pucSndBufferCur & 0x0F ) ); - xMBPortSerialPutByte( ( CHAR )ucByte ); - pucSndBufferCur++; - eBytePos = BYTE_HIGH_NIBBLE; - usSndBufferCount--; - break; - } - } - else - { - xMBPortSerialPutByte( MB_ASCII_DEFAULT_CR ); - eSndState = STATE_TX_END; - } - break; - - /* Finish the frame by sending a LF character. */ - case STATE_TX_END: - xMBPortSerialPutByte( ( CHAR )ucMBLFCharacter ); - /* We need another state to make sure that the CR character has - * been sent. */ - eSndState = STATE_TX_NOTIFY; - break; - - /* Notify the task which called eMBASCIISend that the frame has - * been sent. */ - case STATE_TX_NOTIFY: - eSndState = STATE_TX_IDLE; - xMBPortEventPost( EV_FRAME_TRANSMIT ); - xNeedPoll = FALSE; - break; - - /* We should not get a transmitter event if the transmitter is in - * idle state. */ - case STATE_TX_IDLE: - break; - } - - return xNeedPoll; -} - -BOOL MB_PORT_ISR_ATTR -xMBASCIITimerT1SExpired( void ) -{ - switch ( eRcvState ) - { - /* If we have a timeout we go back to the idle state and wait for - * the next frame. - */ - case STATE_RX_RCV: - case STATE_RX_WAIT_EOF: - eRcvState = STATE_RX_IDLE; - break; - - default: - assert( ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_WAIT_EOF ) - || (eRcvState == STATE_RX_IDLE )); - break; - } - vMBPortTimersDisable( ); - - /* no context switch required. */ - return FALSE; -} - - -static UCHAR -prvucMBCHAR2BIN( UCHAR ucCharacter ) -{ - if( ( ucCharacter >= '0' ) && ( ucCharacter <= '9' ) ) - { - return ( UCHAR )( ucCharacter - '0' ); - } - else if( ( ucCharacter >= 'A' ) && ( ucCharacter <= 'F' ) ) - { - return ( UCHAR )( ucCharacter - 'A' + 0x0A ); - } - else - { - return 0xFF; - } -} - -static UCHAR -prvucMBBIN2CHAR( UCHAR ucByte ) -{ - if( ucByte <= 0x09 ) - { - return ( UCHAR )( '0' + ucByte ); - } - else if( ( ucByte >= 0x0A ) && ( ucByte <= 0x0F ) ) - { - return ( UCHAR )( ucByte - 0x0A + 'A' ); - } - else - { - /* Programming error. */ - assert( 0 ); - } - return '0'; -} - - -static UCHAR -prvucMBLRC( UCHAR * pucFrame, USHORT usLen ) -{ - UCHAR ucLRC = 0; /* LRC char initialized */ - - while( usLen-- ) - { - ucLRC += *pucFrame++; /* Add buffer byte without carry */ - } - - /* Return twos complement */ - ucLRC = ( UCHAR ) ( -( ( CHAR ) ucLRC ) ); - return ucLRC; -} - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/ascii/mbascii.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/ascii/mbascii.h deleted file mode 100755 index e4a2c6a..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/ascii/mbascii.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbascii.h,v 1.8 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_ASCII_H -#define _MB_ASCII_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_ASCII_DEFAULT_CR '\r' /*!< Default CR character for Modbus ASCII. */ -#define MB_ASCII_DEFAULT_LF '\n' /*!< Default LF character for Modbus ASCII. */ -#define MB_ASCII_SER_PDU_SIZE_MIN 3 /*!< Minimum size of a Modbus ASCII frame. */ - -/* ----------------------- Function declaration -----------------------------*/ - -#if MB_SLAVE_ASCII_ENABLED > 0 -eMBErrorCode eMBASCIIInit( UCHAR slaveAddress, UCHAR ucPort, - ULONG ulBaudRate, eMBParity eParity ); -void eMBASCIIStart( void ); -void eMBASCIIStop( void ); - -eMBErrorCode eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, - USHORT * pusLength ); -eMBErrorCode eMBASCIISend( UCHAR slaveAddress, const UCHAR * pucFrame, - USHORT usLength ); -BOOL xMBASCIIReceiveFSM( void ); -BOOL xMBASCIITransmitFSM( void ); -BOOL xMBASCIITimerT1SExpired( void ); -#endif - -#if MB_MASTER_ASCII_ENABLED > 0 -eMBErrorCode eMBMasterASCIIInit( UCHAR ucPort, - ULONG ulBaudRate, eMBParity eParity ); -void eMBMasterASCIIStart( void ); -void eMBMasterASCIIStop( void ); - -eMBErrorCode eMBMasterASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, - USHORT * pusLength ); -eMBErrorCode eMBMasterASCIISend( UCHAR slaveAddress, const UCHAR * pucFrame, - USHORT usLength ); -BOOL xMBMasterASCIIReceiveFSM( void ); -BOOL xMBMasterASCIITransmitFSM( void ); -BOOL xMBMasterASCIITimerT1SExpired( void ); -#endif - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/ascii/mbascii_m.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/ascii/mbascii_m.c deleted file mode 100755 index 67b6293..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/ascii/mbascii_m.c +++ /dev/null @@ -1,587 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbascii.c,v 1.17 2010/06/06 13:47:07 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb_m.h" -#include "mbconfig.h" -#include "mbascii.h" -#include "mbframe.h" - -#include "mbcrc.h" -#include "mbport.h" - -#if MB_MASTER_ASCII_ENABLED > 0 - -/* ----------------------- Defines ------------------------------------------*/ - -/* ----------------------- Type definitions ---------------------------------*/ -typedef enum -{ - STATE_M_RX_INIT, /*!< Receiver is in initial state. */ - STATE_M_RX_IDLE, /*!< Receiver is in idle state. */ - STATE_M_RX_RCV, /*!< Frame is beeing received. */ - STATE_M_RX_WAIT_EOF, /*!< Wait for End of Frame. */ - STATE_M_RX_ERROR, /*!< If the frame is invalid. */ -} eMBMasterAsciiRcvState; - -typedef enum -{ - STATE_M_TX_IDLE, /*!< Transmitter is in idle state. */ - STATE_M_TX_START, /*!< Starting transmission (':' sent). */ - STATE_M_TX_DATA, /*!< Sending of data (Address, Data, LRC). */ - STATE_M_TX_END, /*!< End of transmission. */ - STATE_M_TX_NOTIFY, /*!< Notify sender that the frame has been sent. */ - STATE_M_TX_XFWR, /*!< Transmitter is in transfer finish and wait receive state. */ -} eMBMasterAsciiSndState; - -typedef enum -{ - BYTE_HIGH_NIBBLE, /*!< Character for high nibble of byte. */ - BYTE_LOW_NIBBLE /*!< Character for low nibble of byte. */ -} eMBBytePos; - -/* ----------------------- Shared values -----------------------------------*/ -/* These Modbus values are shared in ASCII mode*/ -extern volatile UCHAR ucMasterRcvBuf[]; -extern volatile UCHAR ucMasterSndBuf[]; - -/* ----------------------- Static functions ---------------------------------*/ -static UCHAR prvucMBCHAR2BIN( UCHAR ucCharacter ); - -static UCHAR prvucMBBIN2CHAR( UCHAR ucByte ); - -static UCHAR prvucMBLRC( UCHAR * pucFrame, USHORT usLen ); - -/* ----------------------- Static variables ---------------------------------*/ -static volatile eMBMasterAsciiSndState eSndState; -static volatile eMBMasterAsciiRcvState eRcvState; - -static volatile UCHAR *ucMasterASCIIRcvBuf = ucMasterRcvBuf; -static volatile UCHAR *ucMasterASCIISndBuf = ucMasterSndBuf; - -static volatile USHORT usMasterRcvBufferPos; -static volatile eMBBytePos eBytePos; - -static volatile UCHAR *pucMasterSndBufferCur; -static volatile USHORT usMasterSndBufferCount; - -static volatile UCHAR ucLRC; -static volatile UCHAR ucMBLFCharacter; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBMasterASCIIInit( UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - ENTER_CRITICAL_SECTION( ); - ucMBLFCharacter = MB_ASCII_DEFAULT_LF; - - if( xMBMasterPortSerialInit( ucPort, ulBaudRate, MB_ASCII_BITS_PER_SYMB, eParity ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - else if( xMBMasterPortTimersInit( MB_ASCII_TIMEOUT_MS * MB_TIMER_TICS_PER_MS ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - - EXIT_CRITICAL_SECTION( ); - - return eStatus; -} - -void -eMBMasterASCIIStart( void ) -{ - ENTER_CRITICAL_SECTION( ); - eRcvState = STATE_M_RX_IDLE; - vMBMasterPortSerialEnable( TRUE, FALSE ); - xMBMasterPortEventPost(EV_MASTER_READY); - EXIT_CRITICAL_SECTION( ); -} - -void -eMBMasterASCIIStop( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBMasterPortSerialEnable( FALSE, FALSE ); - vMBMasterPortTimersDisable( ); - EXIT_CRITICAL_SECTION( ); -} - -eMBErrorCode -eMBMasterASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR *pucMBASCIIFrame = ( UCHAR* ) ucMasterASCIIRcvBuf; - USHORT usFrameLength = usMasterRcvBufferPos; - - if( xMBMasterPortSerialGetResponse( &pucMBASCIIFrame, &usFrameLength ) == FALSE ) - { - return MB_EIO; - } - ENTER_CRITICAL_SECTION( ); - assert( usFrameLength < MB_SER_PDU_SIZE_MAX ); - - assert( pucMBASCIIFrame ); - /* Length and CRC check */ - if( ( usFrameLength >= MB_ASCII_SER_PDU_SIZE_MIN ) - && ( prvucMBLRC( ( UCHAR * ) pucMBASCIIFrame, usFrameLength ) == 0 ) ) - { - /* Save the address field. All frames are passed to the upper layed - * and the decision if a frame is used is done there. - */ - *pucRcvAddress = pucMBASCIIFrame[MB_SER_PDU_ADDR_OFF]; - - /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus - * size of address field and CRC checksum. - */ - *pusLength = ( USHORT )( usFrameLength - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_LRC ); - - /* Return the start of the Modbus PDU to the caller. */ - *pucFrame = ( UCHAR * ) & pucMBASCIIFrame[MB_SER_PDU_PDU_OFF]; - } else { - eStatus = MB_EIO; - } - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -eMBErrorCode -eMBMasterASCIISend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR usLRC; - - if ( ucSlaveAddress > MB_MASTER_TOTAL_SLAVE_NUM ) return MB_EINVAL; - - /* Check if the receiver is still in idle state. If not we where too - * slow with processing the received frame and the master sent another - * frame on the network. We have to abort sending the frame. - */ - if(eRcvState == STATE_M_RX_IDLE) - { - ENTER_CRITICAL_SECTION( ); - /* First byte before the Modbus-PDU is the slave address. */ - pucMasterSndBufferCur = ( UCHAR * ) pucFrame - 1; - usMasterSndBufferCount = 1; - - /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ - pucMasterSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress; - usMasterSndBufferCount += usLength; - - /* Calculate LRC checksum for Modbus-Serial-Line-PDU. */ - usLRC = prvucMBLRC( ( UCHAR * ) pucMasterSndBufferCur, usMasterSndBufferCount ); - pucMasterSndBufferCur[usMasterSndBufferCount++] = usLRC; - - /* Activate the transmitter. */ - eSndState = STATE_M_TX_START; - EXIT_CRITICAL_SECTION( ); - - if ( xMBMasterPortSerialSendRequest( ( UCHAR * ) pucMasterSndBufferCur, usMasterSndBufferCount ) == FALSE ) - { - eStatus = MB_EIO; - } - vMBMasterPortSerialEnable( FALSE, TRUE ); - } - else - { - eStatus = MB_EIO; - } - return eStatus; -} - -BOOL -xMBMasterASCIIReceiveFSM( void ) -{ - BOOL xNeedPoll = FALSE; - UCHAR ucByte; - UCHAR ucResult; - - assert(( eSndState == STATE_M_TX_IDLE ) || ( eSndState == STATE_M_TX_XFWR )); - - /* Always read the character. */ - xNeedPoll = xMBMasterPortSerialGetByte( ( CHAR * ) & ucByte ); - - switch ( eRcvState ) - { - /* If we have received a character in the init state we have to - * wait until the frame is finished. - */ - case STATE_M_RX_INIT: - vMBMasterPortTimersT35Enable( ); - break; - - /* In the error state we wait until all characters in the - * damaged frame are transmitted. - */ - case STATE_M_RX_ERROR: - vMBMasterPortTimersRespondTimeoutEnable( ); - break; - - /* In the idle state we wait for a new character. If a character - * is received the t1.5 and t3.5 timers are started and the - * receiver is in the state STATE_RX_RECEIVE and disable early - * the timer of respond timeout . - */ - case STATE_M_RX_IDLE: - /* Waiting for the start of frame character during respond timeout */ - vMBMasterPortTimersRespondTimeoutEnable( ); - if( ucByte == ':' ) - { - /* Reset the input buffers to store the frame in receive state. */ - usMasterRcvBufferPos = 0; - eBytePos = BYTE_HIGH_NIBBLE; - eRcvState = STATE_M_RX_RCV; - eSndState = STATE_M_TX_IDLE; - } - break; - - /* A new character is received. If the character is a ':' the input - * buffer is cleared. A CR-character signals the end of the data - * block. Other characters are part of the data block and their - * ASCII value is converted back to a binary representation. - */ - case STATE_M_RX_RCV: - /* Enable timer timeout. */ - vMBMasterPortTimersT35Enable( ); - if( ucByte == ':' ) - { - /* Empty receive buffer. */ - eBytePos = BYTE_HIGH_NIBBLE; - usMasterRcvBufferPos = 0; - } - else if( ucByte == MB_ASCII_DEFAULT_CR ) - { - eRcvState = STATE_M_RX_WAIT_EOF; - } - else - { - ucResult = prvucMBCHAR2BIN( ucByte ); - switch ( eBytePos ) - { - /* High nibble of the byte comes first. We check for - * a buffer overflow here. */ - case BYTE_HIGH_NIBBLE: - if( usMasterRcvBufferPos < MB_SER_PDU_SIZE_MAX ) - { - ucMasterASCIIRcvBuf[usMasterRcvBufferPos] = ( UCHAR )( ucResult << 4 ); - eBytePos = BYTE_LOW_NIBBLE; - break; - } - else - { - /* not handled in Modbus specification but seems - * a resonable implementation. */ - eRcvState = STATE_M_RX_ERROR; - /* Disable previously activated timer because of error state. */ - vMBPortTimersDisable( ); - } - break; - - case BYTE_LOW_NIBBLE: - ucMasterASCIIRcvBuf[usMasterRcvBufferPos] |= ucResult; - usMasterRcvBufferPos++; - eBytePos = BYTE_HIGH_NIBBLE; - break; - } - } - break; - - case STATE_M_RX_WAIT_EOF: - if( ucByte == ucMBLFCharacter ) - { - /* Disable character timeout timer because all characters are - * received. */ - vMBMasterPortTimersDisable( ); - /* Receiver is again in idle state. */ - eRcvState = STATE_M_RX_IDLE; - - /* Notify the caller of eMBMasterASCIIReceive that a new frame - * was received. */ - (void)xMBMasterPortEventPost( EV_MASTER_FRAME_RECEIVED ); - xNeedPoll = FALSE; - } - else if( ucByte == ':' ) - { - /* Start of frame character received but last message is not completed. - * Empty receive buffer and back to receive state. */ - eBytePos = BYTE_HIGH_NIBBLE; - usMasterRcvBufferPos = 0; - eRcvState = STATE_M_RX_IDLE; - - /* Enable timer for respond timeout and wait for next frame. */ - vMBMasterPortTimersRespondTimeoutEnable( ); - } - else - { - /* Frame is not okay. Delete entire frame. */ - eRcvState = STATE_M_RX_IDLE; - } - break; - } - - return xNeedPoll; -} - -BOOL -xMBMasterASCIITransmitFSM( void ) -{ - BOOL xNeedPoll = TRUE; - UCHAR ucByte; - BOOL xFrameIsBroadcast = FALSE; - - assert( eRcvState == STATE_M_RX_IDLE ); - - switch ( eSndState ) - { - /* We should not get a transmitter event if the transmitter is in - * idle state. */ - case STATE_M_TX_XFWR: - break; - - /* We should not get a transmitter event if the transmitter is in - * idle state. */ - case STATE_M_TX_IDLE: - break; - - /* Start of transmission. The start of a frame is defined by sending - * the character ':'. */ - case STATE_M_TX_START: - ucByte = ':'; - xMBMasterPortSerialPutByte( ( CHAR )ucByte ); - eSndState = STATE_M_TX_DATA; - eBytePos = BYTE_HIGH_NIBBLE; - break; - - /* Send the data block. Each data byte is encoded as a character hex - * stream with the high nibble sent first and the low nibble sent - * last. If all data bytes are exhausted we send a '\r' character - * to end the transmission. */ - case STATE_M_TX_DATA: - if( usMasterSndBufferCount > 0 ) - { - switch ( eBytePos ) - { - case BYTE_HIGH_NIBBLE: - ucByte = prvucMBBIN2CHAR( ( UCHAR )( *pucMasterSndBufferCur >> 4 ) ); - xMBMasterPortSerialPutByte( ( CHAR ) ucByte ); - eBytePos = BYTE_LOW_NIBBLE; - break; - - case BYTE_LOW_NIBBLE: - ucByte = prvucMBBIN2CHAR( ( UCHAR )( *pucMasterSndBufferCur & 0x0F ) ); - xMBMasterPortSerialPutByte( ( CHAR )ucByte ); - pucMasterSndBufferCur++; - eBytePos = BYTE_HIGH_NIBBLE; - usMasterSndBufferCount--; - break; - } - } - else - { - xMBMasterPortSerialPutByte( MB_ASCII_DEFAULT_CR ); - eSndState = STATE_M_TX_END; - } - break; - - /* Finish the frame by sending a LF character. */ - case STATE_M_TX_END: - xMBMasterPortSerialPutByte( ( CHAR )ucMBLFCharacter ); - /* We need another state to make sure that the CR character has - * been sent. */ - eSndState = STATE_M_TX_NOTIFY; - break; - - /* Notify the task which called eMBMasterASCIISend that the frame has - * been sent. */ - case STATE_M_TX_NOTIFY: - xFrameIsBroadcast = ( ucMasterASCIISndBuf[MB_SEND_BUF_PDU_OFF - MB_SER_PDU_PDU_OFF] - == MB_ADDRESS_BROADCAST ) ? TRUE : FALSE; - vMBMasterRequestSetType( xFrameIsBroadcast ); - eSndState = STATE_M_TX_XFWR; - /* If the frame is broadcast ,master will enable timer of convert delay, - * else master will enable timer of respond timeout. */ - if ( xFrameIsBroadcast == TRUE ) - { - vMBMasterPortTimersConvertDelayEnable( ); - } - else - { - vMBMasterPortTimersRespondTimeoutEnable( ); - } - xNeedPoll = FALSE; - break; - } - - return xNeedPoll; -} - -BOOL MB_PORT_ISR_ATTR -xMBMasterASCIITimerT1SExpired( void ) -{ - BOOL xNeedPoll = FALSE; - - switch ( eRcvState ) - { - /* Timer t35 expired. Startup phase is finished. */ - case STATE_M_RX_INIT: - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_READY); - break; - - /* Start of message is not received during respond timeout. - * Process error. */ - case STATE_M_RX_IDLE: - eRcvState = STATE_M_RX_ERROR; - break; - - /* A recieve timeout expired and no any new character received. - * Wait for respond time and go to error state to inform listener about error */ - case STATE_M_RX_RCV: - eRcvState = STATE_M_RX_ERROR; - break; - - /* An error occured while receiving the frame. */ - case STATE_M_RX_ERROR: - vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); - xNeedPoll = xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); - break; - - /* If we have a timeout we go back to the idle state and wait for - * the next frame. - */ - case STATE_M_RX_WAIT_EOF: - eRcvState = STATE_M_RX_IDLE; - break; - - default: - assert( 0 ); - break; - } - eRcvState = STATE_M_RX_IDLE; - - switch (eSndState) - { - /* A frame was send finish and convert delay or respond timeout expired. - * If the frame is broadcast,The master will idle,and if the frame is not - * broadcast.*/ - case STATE_M_TX_XFWR: - if ( xMBMasterRequestIsBroadcast( ) == FALSE ) { - vMBMasterSetErrorType(EV_ERROR_RESPOND_TIMEOUT); - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_ERROR_PROCESS); - } - break; - - /* Function called in an illegal state. */ - default: - assert( ( eSndState == STATE_M_TX_START ) || ( eSndState == STATE_M_TX_IDLE ) - || ( eSndState == STATE_M_TX_DATA ) || ( eSndState == STATE_M_TX_END ) - || ( eSndState == STATE_M_TX_NOTIFY ) ); - break; - } - eSndState = STATE_M_TX_IDLE; - - vMBMasterPortTimersDisable( ); - /* If timer mode is convert delay, the master event then turns EV_MASTER_EXECUTE status. */ - if (xMBMasterGetCurTimerMode() == MB_TMODE_CONVERT_DELAY) { - xNeedPoll = xMBMasterPortEventPost( EV_MASTER_EXECUTE ); - } - - vMBMasterPortTimersDisable( ); - - /* no context switch required. */ - return xNeedPoll; -} - -static UCHAR -prvucMBCHAR2BIN( UCHAR ucCharacter ) -{ - if( ( ucCharacter >= '0' ) && ( ucCharacter <= '9' ) ) - { - return ( UCHAR )( ucCharacter - '0' ); - } - else if( ( ucCharacter >= 'A' ) && ( ucCharacter <= 'F' ) ) - { - return ( UCHAR )( ucCharacter - 'A' + 0x0A ); - } - else - { - return 0xFF; - } -} - -static UCHAR -prvucMBBIN2CHAR( UCHAR ucByte ) -{ - if( ucByte <= 0x09 ) - { - return ( UCHAR )( '0' + ucByte ); - } - else if( ( ucByte >= 0x0A ) && ( ucByte <= 0x0F ) ) - { - return ( UCHAR )( ucByte - 0x0A + 'A' ); - } - else - { - /* Programming error. */ - assert( 0 ); - } - return '0'; -} - -static UCHAR -prvucMBLRC( UCHAR * pucFrame, USHORT usLen ) -{ - UCHAR ucLRC = 0; /* LRC char initialized */ - - while( usLen-- ) - { - ucLRC += *pucFrame++; /* Add buffer byte without carry */ - } - - /* Return twos complement */ - ucLRC = ( UCHAR ) ( -( ( CHAR ) ucLRC ) ); - return ucLRC; -} - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfunccoils.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfunccoils.c deleted file mode 100755 index 600c756..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfunccoils.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfunccoils.c,v 1.8 2007/02/18 23:47:16 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_READ_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_COILCNT_MAX ( 0x07D0 ) - -#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_SIZE ( 4 ) - -#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_FUNC_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 ) -#define MB_PDU_FUNC_WRITE_MUL_SIZE_MIN ( 5 ) -#define MB_PDU_FUNC_WRITE_MUL_COILCNT_MAX ( 0x07B0 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_SLAVE_RTU_ENABLED || MB_SLAVE_ASCII_ENABLED || MB_TCP_ENABLED - -#if MB_FUNC_READ_COILS_ENABLED - -eMBException -eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usCoilCount; - UCHAR ucNBytes; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usCoilCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF] << 8 ); - usCoilCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usCoilCount >= 1 ) && - ( usCoilCount < MB_PDU_FUNC_READ_COILCNT_MAX ) ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READ_COILS; - *usLen += 1; - - /* Test if the quantity of coils is a multiple of 8. If not last - * byte is only partially field with unused coils set to zero. */ - if( ( usCoilCount & 0x0007 ) != 0 ) - { - ucNBytes = ( UCHAR )( usCoilCount / 8 + 1 ); - } - else - { - ucNBytes = ( UCHAR )( usCoilCount / 8 ); - } - *pucFrameCur++ = ucNBytes; - *usLen += 1; - - eRegStatus = - eMBRegCoilsCB( pucFrameCur, usRegAddress, usCoilCount, - MB_REG_READ ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - /* The response contains the function code, the starting address - * and the quantity of registers. We reuse the old values in the - * buffer because they are still valid. */ - *usLen += ucNBytes;; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#if MB_FUNC_WRITE_COIL_ENABLED > 0 -eMBException -eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - UCHAR ucBuf[2]; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); - usRegAddress++; - - if( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF + 1] == 0x00 ) && - ( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0xFF ) || - ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0x00 ) ) ) - { - ucBuf[1] = 0; - if( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0xFF ) - { - ucBuf[0] = 1; - } - else - { - ucBuf[0] = 0; - } - eRegStatus = - eMBRegCoilsCB( &ucBuf[0], usRegAddress, 1, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid write coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 -eMBException -eMBFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usCoilCnt; - UCHAR ucByteCount; - UCHAR ucByteCountVerify; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen > ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); - usRegAddress++; - - usCoilCnt = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF] << 8 ); - usCoilCnt |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF + 1] ); - - ucByteCount = pucFrame[MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF]; - - /* Compute the number of expected bytes in the request. */ - if( ( usCoilCnt & 0x0007 ) != 0 ) - { - ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 + 1 ); - } - else - { - ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 ); - } - - if( ( usCoilCnt >= 1 ) && - ( usCoilCnt <= MB_PDU_FUNC_WRITE_MUL_COILCNT_MAX ) && - ( ucByteCountVerify == ucByteCount ) ) - { - eRegStatus = - eMBRegCoilsCB( &pucFrame[MB_PDU_FUNC_WRITE_MUL_VALUES_OFF], - usRegAddress, usCoilCnt, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - /* The response contains the function code, the starting address - * and the quantity of registers. We reuse the old values in the - * buffer because they are still valid. */ - *usLen = MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid write coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#endif - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfunccoils_m.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfunccoils_m.c deleted file mode 100755 index 8399d2f..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfunccoils_m.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfunccoils_m.c,v 1.60 2013/10/12 15:10:12 Armink Add Master Functions - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb_m.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" -#include "mbutils.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_REQ_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_READ_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_COILCNT_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 ) -#define MB_PDU_FUNC_READ_SIZE_MIN ( 1 ) - -#define MB_PDU_REQ_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_REQ_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_WRITE_SIZE ( 4 ) -#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_SIZE ( 4 ) - -#define MB_PDU_REQ_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_REQ_WRITE_MUL_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_REQ_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 ) -#define MB_PDU_REQ_WRITE_MUL_SIZE_MIN ( 5 ) -#define MB_PDU_REQ_WRITE_MUL_COILCNT_MAX ( 0x07B0 ) -#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_MUL_SIZE ( 5 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED - -#if MB_FUNC_READ_COILS_ENABLED - -/** - * This function will request read coil. - * - * @param ucSndAddr salve address - * @param usCoilAddr coil start address - * @param usNCoils coil total number - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqReadCoils( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_READ_COILS; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] = usCoilAddr >> 8; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] = usCoilAddr; - ucMBFrame[MB_PDU_REQ_READ_COILCNT_OFF ] = usNCoils >> 8; - ucMBFrame[MB_PDU_REQ_READ_COILCNT_OFF + 1] = usNCoils; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_TRANSMIT | EV_MASTER_TRANS_START ); - eErrStatus = eMBMasterWaitRequestFinish( ); - - } - return eErrStatus; -} - -eMBException -eMBMasterFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) -{ - UCHAR *ucMBFrame; - USHORT usRegAddress; - USHORT usCoilCount; - UCHAR ucByteCount; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, and it's read mode. This request don't need execute. */ - if ( xMBMasterRequestIsBroadcast() ) - { - eStatus = MB_EX_NONE; - } - else if ( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usCoilCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_COILCNT_OFF] << 8 ); - usCoilCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_COILCNT_OFF + 1] ); - - /* Test if the quantity of coils is a multiple of 8. If not last - * byte is only partially field with unused coils set to zero. */ - if( ( usCoilCount & 0x0007 ) != 0 ) - { - ucByteCount = ( UCHAR )( usCoilCount / 8 + 1 ); - } - else - { - ucByteCount = ( UCHAR )( usCoilCount / 8 ); - } - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usCoilCount >= 1 ) && - ( ucByteCount == pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF] ) ) - { - /* Make callback to fill the buffer. */ - eRegStatus = eMBMasterRegCoilsCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usCoilCount, MB_REG_READ ); - - /* If an error occurred convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} -#endif - -#if MB_FUNC_WRITE_COIL_ENABLED > 0 - -/** - * This function will request write one coil. - * - * @param ucSndAddr salve address - * @param usCoilAddr coil start address - * @param usCoilData data to be written - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - * - * @see eMBMasterReqWriteMultipleCoils - */ -eMBMasterReqErrCode -eMBMasterReqWriteCoil( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( ( usCoilData != 0xFF00 ) && ( usCoilData != 0x0000 ) ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_WRITE_SINGLE_COIL; - ucMBFrame[MB_PDU_REQ_WRITE_ADDR_OFF] = usCoilAddr >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_ADDR_OFF + 1] = usCoilAddr; - ucMBFrame[MB_PDU_REQ_WRITE_VALUE_OFF ] = usCoilData >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_VALUE_OFF + 1] = usCoilData; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_TRANSMIT | EV_MASTER_TRANS_START ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - UCHAR ucBuf[2]; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); - usRegAddress++; - - if( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF + 1] == 0x00 ) && - ( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0xFF ) || - ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0x00 ) ) ) - { - ucBuf[1] = 0; - if( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0xFF ) - { - ucBuf[0] = 1; - } - else - { - ucBuf[0] = 0; - } - eRegStatus = - eMBMasterRegCoilsCB( &ucBuf[0], usRegAddress, 1, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid write coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif // #if MB_FUNC_WRITE_COIL_ENABLED > 0 - -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 - -/** - * This function will request write multiple coils. - * - * @param ucSndAddr salve address - * @param usCoilAddr coil start address - * @param usNCoils coil total number - * @param usCoilData data to be written - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - * - * @see eMBMasterReqWriteCoil - */ -eMBMasterReqErrCode -eMBMasterReqWriteMultipleCoils( UCHAR ucSndAddr, - USHORT usCoilAddr, USHORT usNCoils, UCHAR * pucDataBuffer, LONG lTimeOut) -{ - UCHAR *ucMBFrame; - USHORT usRegIndex = 0; - UCHAR ucByteCount; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( usNCoils > MB_PDU_REQ_WRITE_MUL_COILCNT_MAX ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_WRITE_MULTIPLE_COILS; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF] = usCoilAddr >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF + 1] = usCoilAddr; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_COILCNT_OFF] = usNCoils >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_COILCNT_OFF + 1] = usNCoils ; - if( ( usNCoils & 0x0007 ) != 0 ) - { - ucByteCount = ( UCHAR )( usNCoils / 8 + 1 ); - } - else - { - ucByteCount = ( UCHAR )( usNCoils / 8 ); - } - ucMBFrame[MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF] = ucByteCount; - ucMBFrame += MB_PDU_REQ_WRITE_MUL_VALUES_OFF; - while( ucByteCount > usRegIndex) - { - *ucMBFrame++ = pucDataBuffer[usRegIndex++]; - } - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_MUL_SIZE_MIN + ucByteCount ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_TRANSMIT | EV_MASTER_TRANS_START ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usCoilCnt; - UCHAR ucByteCount; - UCHAR ucByteCountVerify; - UCHAR *ucMBFrame; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, the *usLen is not need check. */ - if( ( *usLen == MB_PDU_FUNC_WRITE_MUL_SIZE ) || xMBMasterRequestIsBroadcast() ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); - usRegAddress++; - - usCoilCnt = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF] << 8 ); - usCoilCnt |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF + 1] ); - - ucByteCount = ucMBFrame[MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF]; - - /* Compute the number of expected bytes in the request. */ - if( ( usCoilCnt & 0x0007 ) != 0 ) - { - ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 + 1 ); - } - else - { - ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 ); - } - - if( ( usCoilCnt >= 1 ) && ( ucByteCountVerify == ucByteCount ) ) - { - eRegStatus = - eMBMasterRegCoilsCB( &ucMBFrame[MB_PDU_REQ_WRITE_MUL_VALUES_OFF], - usRegAddress, usCoilCnt, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid write coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif // #if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 -#endif // #if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncdiag.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncdiag.c deleted file mode 100755 index b988cb8..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncdiag.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncdiag.c,v 1.3 2006/12/07 22:10:34 wolti Exp $ - */ diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncdisc.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncdisc.c deleted file mode 100755 index 1ff743d..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncdisc.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeRTOS Modbus Libary: A Modbus serial implementation for FreeRTOS - * Copyright (C) 2006 Christian Walter - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncdisc.c,v 1.10 2007/09/12 10:15:56 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_READ_DISCCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_DISCCNT_MAX ( 0x07D0 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_SLAVE_RTU_ENABLED || MB_SLAVE_ASCII_ENABLED || MB_TCP_ENABLED - -#if MB_FUNC_READ_COILS_ENABLED - -eMBException -eMBFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usDiscreteCnt; - UCHAR ucNBytes; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usDiscreteCnt = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF] << 8 ); - usDiscreteCnt |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usDiscreteCnt >= 1 ) && - ( usDiscreteCnt < MB_PDU_FUNC_READ_DISCCNT_MAX ) ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READ_DISCRETE_INPUTS; - *usLen += 1; - - /* Test if the quantity of coils is a multiple of 8. If not last - * byte is only partially field with unused coils set to zero. */ - if( ( usDiscreteCnt & 0x0007 ) != 0 ) - { - ucNBytes = ( UCHAR ) ( usDiscreteCnt / 8 + 1 ); - } - else - { - ucNBytes = ( UCHAR ) ( usDiscreteCnt / 8 ); - } - *pucFrameCur++ = ucNBytes; - *usLen += 1; - - eRegStatus = - eMBRegDiscreteCB( pucFrameCur, usRegAddress, usDiscreteCnt ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - /* The response contains the function code, the starting address - * and the quantity of registers. We reuse the old values in the - * buffer because they are still valid. */ - *usLen += ucNBytes;; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncdisc_m.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncdisc_m.c deleted file mode 100755 index 0af1169..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncdisc_m.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncdisc_m.c,v 1.60 2013/10/15 8:48:20 Armink Add Master Functions Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb_m.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_REQ_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_READ_DISCCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_DISCCNT_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 ) -#define MB_PDU_FUNC_READ_SIZE_MIN ( 1 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED - -#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED - -/** - * This function will request read discrete inputs. - * - * @param ucSndAddr salve address - * @param usDiscreteAddr discrete start address - * @param usNDiscreteIn discrete total number - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT usNDiscreteIn, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_READ_DISCRETE_INPUTS; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] = usDiscreteAddr >> 8; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] = usDiscreteAddr; - ucMBFrame[MB_PDU_REQ_READ_DISCCNT_OFF ] = usNDiscreteIn >> 8; - ucMBFrame[MB_PDU_REQ_READ_DISCCNT_OFF + 1] = usNDiscreteIn; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_TRANSMIT | EV_MASTER_TRANS_START ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usDiscreteCnt; - UCHAR ucNBytes; - UCHAR *ucMBFrame; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, and it's read mode. This request don't need execute. */ - if ( xMBMasterRequestIsBroadcast() ) - { - eStatus = MB_EX_NONE; - } - else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usDiscreteCnt = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_DISCCNT_OFF] << 8 ); - usDiscreteCnt |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_DISCCNT_OFF + 1] ); - - /* Test if the quantity of coils is a multiple of 8. If not last - * byte is only partially field with unused coils set to zero. */ - if( ( usDiscreteCnt & 0x0007 ) != 0 ) - { - ucNBytes = ( UCHAR )( usDiscreteCnt / 8 + 1 ); - } - else - { - ucNBytes = ( UCHAR )( usDiscreteCnt / 8 ); - } - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if ((usDiscreteCnt >= 1) && ucNBytes == pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF]) - { - /* Make callback to fill the buffer. */ - eRegStatus = eMBMasterRegDiscreteCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usDiscreteCnt ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif -#endif // #if MB_SERIAL_MASTER_RTU_ENABLED || MB_SERIAL_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncholding.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncholding.c deleted file mode 100755 index 723ba1a..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncholding.c +++ /dev/null @@ -1,318 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncholding.c,v 1.12 2007/02/18 23:48:22 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0) -#define MB_PDU_FUNC_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D ) - -#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 0) -#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_SIZE ( 4 ) - -#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_FUNC_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 ) -#define MB_PDU_FUNC_WRITE_MUL_SIZE_MIN ( 5 ) -#define MB_PDU_FUNC_WRITE_MUL_REGCNT_MAX ( 0x0078 ) - -#define MB_PDU_FUNC_READWRITE_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF ( MB_PDU_DATA_OFF + 6 ) -#define MB_PDU_FUNC_READWRITE_BYTECNT_OFF ( MB_PDU_DATA_OFF + 8 ) -#define MB_PDU_FUNC_READWRITE_WRITE_VALUES_OFF ( MB_PDU_DATA_OFF + 9 ) -#define MB_PDU_FUNC_READWRITE_SIZE_MIN ( 9 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_SLAVE_RTU_ENABLED || MB_SLAVE_ASCII_ENABLED || MB_TCP_ENABLED - -#if MB_FUNC_WRITE_HOLDING_ENABLED - -eMBException -eMBFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); - usRegAddress++; - - /* Make callback to update the value. */ - eRegStatus = eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF], - usRegAddress, 1, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} -#endif - -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 -eMBException -eMBFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usRegCount; - UCHAR ucRegByteCount; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen >= ( MB_PDU_FUNC_WRITE_MUL_SIZE_MIN + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF + 1] ); - - ucRegByteCount = pucFrame[MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF]; - - if( ( usRegCount >= 1 ) && - ( usRegCount <= MB_PDU_FUNC_WRITE_MUL_REGCNT_MAX ) && - ( ucRegByteCount == ( UCHAR ) ( 2 * usRegCount ) ) ) - { - /* Make callback to update the register values. */ - eRegStatus = - eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_WRITE_MUL_VALUES_OFF], - usRegAddress, usRegCount, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - /* The response contains the function code, the starting - * address and the quantity of registers. We reuse the - * old values in the buffer because they are still valid. - */ - *usLen = MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} -#endif - -#if MB_FUNC_READ_HOLDING_ENABLED > 0 - -eMBException -eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usRegCount; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usRegCount >= 1 ) && ( usRegCount <= MB_PDU_FUNC_READ_REGCNT_MAX ) ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READ_HOLDING_REGISTER; - *usLen += 1; - - /* Second byte in the response contain the number of bytes. */ - *pucFrameCur++ = ( UCHAR ) ( usRegCount * 2 ); - *usLen += 1; - - /* Make callback to fill the buffer. */ - eRegStatus = eMBRegHoldingCB( pucFrameCur, usRegAddress, usRegCount, MB_REG_READ ); - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - *usLen += usRegCount * 2; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 - -eMBException -eMBFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegReadAddress; - USHORT usRegReadCount; - USHORT usRegWriteAddress; - USHORT usRegWriteCount; - UCHAR ucRegWriteByteCount; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen >= ( MB_PDU_FUNC_READWRITE_SIZE_MIN + MB_PDU_SIZE_MIN ) ) - { - usRegReadAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_ADDR_OFF] << 8U ); - usRegReadAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_ADDR_OFF + 1] ); - usRegReadAddress++; - - usRegReadCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF] << 8U ); - usRegReadCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF + 1] ); - - usRegWriteAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF] << 8U ); - usRegWriteAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF + 1] ); - usRegWriteAddress++; - - usRegWriteCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF] << 8U ); - usRegWriteCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF + 1] ); - - ucRegWriteByteCount = pucFrame[MB_PDU_FUNC_READWRITE_BYTECNT_OFF]; - - if( ( usRegReadCount >= 1 ) && ( usRegReadCount <= 0x7D ) && - ( usRegWriteCount >= 1 ) && ( usRegWriteCount <= 0x79 ) && - ( ( 2 * usRegWriteCount ) == ucRegWriteByteCount ) ) - { - /* Make callback to update the register values. */ - eRegStatus = eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_READWRITE_WRITE_VALUES_OFF], - usRegWriteAddress, usRegWriteCount, MB_REG_WRITE ); - - if( eRegStatus == MB_ENOERR ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READWRITE_MULTIPLE_REGISTERS; - *usLen += 1; - - /* Second byte in the response contain the number of bytes. */ - *pucFrameCur++ = ( UCHAR ) ( usRegReadCount * 2 ); - *usLen += 1; - - /* Make the read callback. */ - eRegStatus = - eMBRegHoldingCB( pucFrameCur, usRegReadAddress, usRegReadCount, MB_REG_READ ); - if( eRegStatus == MB_ENOERR ) - { - *usLen += 2 * usRegReadCount; - } - } - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - return eStatus; -} - -#endif - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncholding_m.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncholding_m.c deleted file mode 100755 index 840d499..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncholding_m.c +++ /dev/null @@ -1,461 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncholding_m.c,v 1.60 2013/09/02 14:13:40 Armink Add Master Functions Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -//#include "mb.h" -#include "mb_m.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_REQ_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D ) -#define MB_PDU_FUNC_READ_BYTECNT_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 ) -#define MB_PDU_FUNC_READ_SIZE_MIN ( 1 ) - -#define MB_PDU_REQ_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 0) -#define MB_PDU_REQ_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_WRITE_SIZE ( 4 ) -#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 0) -#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_SIZE ( 4 ) - -#define MB_PDU_REQ_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_WRITE_MUL_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_REQ_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 ) -#define MB_PDU_REQ_WRITE_MUL_SIZE_MIN ( 5 ) -#define MB_PDU_REQ_WRITE_MUL_REGCNT_MAX ( 0x0078 ) -#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_MUL_SIZE ( 4 ) - -#define MB_PDU_REQ_READWRITE_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_READWRITE_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF ( MB_PDU_DATA_OFF + 6 ) -#define MB_PDU_REQ_READWRITE_WRITE_BYTECNT_OFF ( MB_PDU_DATA_OFF + 8 ) -#define MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF ( MB_PDU_DATA_OFF + 9 ) -#define MB_PDU_REQ_READWRITE_SIZE_MIN ( 9 ) -#define MB_PDU_FUNC_READWRITE_READ_BYTECNT_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READWRITE_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 ) -#define MB_PDU_FUNC_READWRITE_SIZE_MIN ( 1 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED - -#if MB_FUNC_WRITE_HOLDING_ENABLED - -/** - * This function will request write holding register. - * - * @param ucSndAddr salve address - * @param usRegAddr register start address - * @param usRegData register data to be written - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_WRITE_REGISTER; - ucMBFrame[MB_PDU_REQ_WRITE_ADDR_OFF] = usRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_ADDR_OFF + 1] = usRegAddr; - ucMBFrame[MB_PDU_REQ_WRITE_VALUE_OFF] = usRegData >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_VALUE_OFF + 1] = usRegData ; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_TRANSMIT | EV_MASTER_TRANS_START ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_SIZE_MIN + MB_PDU_FUNC_WRITE_SIZE ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); - usRegAddress++; - - /* Make callback to update the value. */ - eRegStatus = eMBMasterRegHoldingCB( &pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF], - usRegAddress, 1, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} -#endif - -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 - -/** - * This function will request write multiple holding register. - * - * @param ucSndAddr salve address - * @param usRegAddr register start address - * @param usNRegs register total number - * @param pusDataBuffer data to be written - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr, - USHORT usRegAddr, USHORT usNRegs, USHORT * pusDataBuffer, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - USHORT usRegIndex = 0; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_WRITE_MULTIPLE_REGISTERS; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF] = usRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF + 1] = usRegAddr; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_REGCNT_OFF] = usNRegs >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_REGCNT_OFF + 1] = usNRegs ; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF] = usNRegs * 2; - ucMBFrame += MB_PDU_REQ_WRITE_MUL_VALUES_OFF; - while( usNRegs > usRegIndex) - { - *ucMBFrame++ = pusDataBuffer[usRegIndex] >> 8; - *ucMBFrame++ = pusDataBuffer[usRegIndex++] ; - } - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_MUL_SIZE_MIN + 2*usNRegs ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_TRANSMIT | EV_MASTER_TRANS_START ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - UCHAR *ucMBFrame; - USHORT usRegAddress; - USHORT usRegCount; - UCHAR ucRegByteCount; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, the *usLen is not need check. */ - if( ( *usLen == MB_PDU_SIZE_MIN + MB_PDU_FUNC_WRITE_MUL_SIZE ) || xMBMasterRequestIsBroadcast() ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_WRITE_MUL_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_WRITE_MUL_REGCNT_OFF + 1] ); - - ucRegByteCount = ucMBFrame[MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF]; - - if( ucRegByteCount == 2 * usRegCount ) - { - /* Make callback to update the register values. */ - eRegStatus = eMBMasterRegHoldingCB( &ucMBFrame[MB_PDU_REQ_WRITE_MUL_VALUES_OFF], - usRegAddress, usRegCount, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} -#endif - -#if MB_FUNC_READ_HOLDING_ENABLED > 0 - -/** - * This function will request read holding register. - * - * @param ucSndAddr salve address - * @param usRegAddr register start address - * @param usNRegs register total number - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_READ_HOLDING_REGISTER; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] = usRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] = usRegAddr; - ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF] = usNRegs >> 8; - ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] = usNRegs; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_TRANSMIT | EV_MASTER_TRANS_START ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - UCHAR *ucMBFrame; - USHORT usRegAddress; - USHORT usRegCount; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, and it's read mode. This request don't need execute. */ - if ( xMBMasterRequestIsBroadcast() ) - { - eStatus = MB_EX_NONE; - } - else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usRegCount >= 1 ) && ( 2 * usRegCount == pucFrame[MB_PDU_FUNC_READ_BYTECNT_OFF] ) ) - { - /* Make callback to fill the buffer. */ - eRegStatus = eMBMasterRegHoldingCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usRegCount, MB_REG_READ ); - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 - -/** - * This function will request read and write holding register. - * - * @param ucSndAddr salve address - * @param usReadRegAddr read register start address - * @param usNReadRegs read register total number - * @param pusDataBuffer data to be written - * @param usWriteRegAddr write register start address - * @param usNWriteRegs write register total number - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqReadWriteMultipleHoldingRegister( UCHAR ucSndAddr, - USHORT usReadRegAddr, USHORT usNReadRegs, USHORT * pusDataBuffer, - USHORT usWriteRegAddr, USHORT usNWriteRegs, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - USHORT usRegIndex = 0; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_READWRITE_MULTIPLE_REGISTERS; - ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF] = usReadRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF + 1] = usReadRegAddr; - ucMBFrame[MB_PDU_REQ_READWRITE_READ_REGCNT_OFF] = usNReadRegs >> 8; - ucMBFrame[MB_PDU_REQ_READWRITE_READ_REGCNT_OFF + 1] = usNReadRegs ; - ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF] = usWriteRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF + 1] = usWriteRegAddr; - ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF] = usNWriteRegs >> 8; - ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF + 1] = usNWriteRegs ; - ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_BYTECNT_OFF] = usNWriteRegs * 2; - ucMBFrame += MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF; - while( usNWriteRegs > usRegIndex) - { - *ucMBFrame++ = pusDataBuffer[usRegIndex] >> 8; - *ucMBFrame++ = pusDataBuffer[usRegIndex++] ; - } - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READWRITE_SIZE_MIN + 2*usNWriteRegs ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_TRANSMIT | EV_MASTER_TRANS_START ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegReadAddress; - USHORT usRegReadCount; - USHORT usRegWriteAddress; - USHORT usRegWriteCount; - UCHAR *ucMBFrame; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, and it's read mode. This request don't need execute. */ - if ( xMBMasterRequestIsBroadcast() ) - { - eStatus = MB_EX_NONE; - } - else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READWRITE_SIZE_MIN ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegReadAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF] << 8U ); - usRegReadAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF + 1] ); - usRegReadAddress++; - - usRegReadCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_REGCNT_OFF] << 8U ); - usRegReadCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_REGCNT_OFF + 1] ); - - usRegWriteAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF] << 8U ); - usRegWriteAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF + 1] ); - usRegWriteAddress++; - - usRegWriteCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF] << 8U ); - usRegWriteCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF + 1] ); - - if( ( 2 * usRegReadCount ) == pucFrame[MB_PDU_FUNC_READWRITE_READ_BYTECNT_OFF] ) - { - /* Make callback to update the register values. */ - eRegStatus = eMBMasterRegHoldingCB( &ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF], - usRegWriteAddress, usRegWriteCount, MB_REG_WRITE ); - - if( eRegStatus == MB_ENOERR ) - { - /* Make the read callback. */ - eRegStatus = eMBMasterRegHoldingCB(&pucFrame[MB_PDU_FUNC_READWRITE_READ_VALUES_OFF], - usRegReadAddress, usRegReadCount, MB_REG_READ); - } - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - return eStatus; -} - -#endif -#endif // #if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncinput.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncinput.c deleted file mode 100755 index a86a2f3..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncinput.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncinput.c,v 1.10 2007/09/12 10:15:56 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D ) - -#define MB_PDU_FUNC_READ_RSP_BYTECNT_OFF ( MB_PDU_DATA_OFF ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_SLAVE_RTU_ENABLED || MB_SLAVE_ASCII_ENABLED || MB_TCP_ENABLED - -#if MB_FUNC_READ_INPUT_ENABLED - -eMBException -eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usRegCount; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usRegCount >= 1 ) - && ( usRegCount <= MB_PDU_FUNC_READ_REGCNT_MAX ) ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READ_INPUT_REGISTER; - *usLen += 1; - - /* Second byte in the response contain the number of bytes. */ - *pucFrameCur++ = ( UCHAR )( usRegCount * 2 ); - *usLen += 1; - - eRegStatus = - eMBRegInputCB( pucFrameCur, usRegAddress, usRegCount ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - *usLen += usRegCount * 2; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read input register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncinput_m.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncinput_m.c deleted file mode 100755 index 7fb3126..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncinput_m.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncinput_m.c,v 1.60 2013/10/12 14:23:40 Armink Add Master Functions Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb_m.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_REQ_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_BYTECNT_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 ) -#define MB_PDU_FUNC_READ_SIZE_MIN ( 1 ) - -#define MB_PDU_FUNC_READ_RSP_BYTECNT_OFF ( MB_PDU_DATA_OFF ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED -#if MB_FUNC_READ_INPUT_ENABLED - -/** - * This function will request read input register. - * - * @param ucSndAddr salve address - * @param usRegAddr register start address - * @param usNRegs register total number - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_READ_INPUT_REGISTER; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] = usRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] = usRegAddr; - ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF] = usNRegs >> 8; - ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] = usNRegs; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_TRANSMIT | EV_MASTER_TRANS_START ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - UCHAR *ucMBFrame; - USHORT usRegAddress; - USHORT usRegCount; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, and it's read mode. This request don't need execute. */ - if ( xMBMasterRequestIsBroadcast() ) - { - eStatus = MB_EX_NONE; - } - else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usRegCount >= 1 ) && ( 2 * usRegCount == pucFrame[MB_PDU_FUNC_READ_BYTECNT_OFF] ) ) - { - /* Make callback to fill the buffer. */ - eRegStatus = eMBMasterRegInputCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usRegCount ); - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif -#endif // #if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncother.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncother.c deleted file mode 100755 index 59d6bda..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbfuncother.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncother.c,v 1.8 2006/12/07 22:10:34 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -#if MB_SLAVE_RTU_ENABLED || MB_SLAVE_ASCII_ENABLED || MB_TCP_ENABLED - -#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED - -/* ----------------------- Static variables ---------------------------------*/ -static UCHAR ucMBSlaveID[MB_FUNC_OTHER_REP_SLAVEID_BUF]; -static USHORT usMBSlaveIDLen; - -/* ----------------------- Start implementation -----------------------------*/ - -eMBErrorCode -eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning, - UCHAR const *pucAdditional, USHORT usAdditionalLen ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - /* the first byte and second byte in the buffer is reserved for - * the parameter ucSlaveID and the running flag. The rest of - * the buffer is available for additional data. */ - if( usAdditionalLen + 2 < MB_FUNC_OTHER_REP_SLAVEID_BUF ) - { - usMBSlaveIDLen = 0; - ucMBSlaveID[usMBSlaveIDLen++] = ucSlaveID; - ucMBSlaveID[usMBSlaveIDLen++] = ( UCHAR )( xIsRunning ? 0xFF : 0x00 ); - if( usAdditionalLen > 0 ) - { - memcpy( &ucMBSlaveID[usMBSlaveIDLen], pucAdditional, - ( size_t )usAdditionalLen ); - usMBSlaveIDLen += usAdditionalLen; - } - } - else - { - eStatus = MB_ENORES; - } - return eStatus; -} - -eMBException -eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ) -{ - memcpy( &pucFrame[MB_PDU_DATA_OFF], &ucMBSlaveID[0], ( size_t )usMBSlaveIDLen ); - *usLen = ( USHORT )( MB_PDU_DATA_OFF + usMBSlaveIDLen ); - return MB_EX_NONE; -} - -#endif - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbutils.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbutils.c deleted file mode 100755 index 1332c02..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/functions/mbutils.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbutils.c,v 1.6 2007/02/18 23:49:07 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbproto.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define BITS_UCHAR 8U - -/* ----------------------- Start implementation -----------------------------*/ -void -xMBUtilSetBits( UCHAR * ucByteBuf, USHORT usBitOffset, UCHAR ucNBits, - UCHAR ucValue ) -{ - USHORT usWordBuf; - USHORT usMask; - USHORT usByteOffset; - USHORT usNPreBits; - USHORT usValue = ucValue; - - assert( ucNBits <= 8 ); - assert( ( size_t )BITS_UCHAR == sizeof( UCHAR ) * 8 ); - - /* Calculate byte offset for first byte containing the bit values starting - * at usBitOffset. */ - usByteOffset = ( USHORT )( ( usBitOffset ) / BITS_UCHAR ); - - /* How many bits precede our bits to set. */ - usNPreBits = ( USHORT )( usBitOffset - usByteOffset * BITS_UCHAR ); - - /* Move bit field into position over bits to set */ - usValue <<= usNPreBits; - - /* Prepare a mask for setting the new bits. */ - usMask = ( USHORT )( ( 1 << ( USHORT ) ucNBits ) - 1 ); - usMask <<= usBitOffset - usByteOffset * BITS_UCHAR; - - /* copy bits into temporary storage. */ - usWordBuf = ucByteBuf[usByteOffset]; - usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR; - - /* Zero out bit field bits and then or value bits into them. */ - usWordBuf = ( USHORT )( ( usWordBuf & ( ~usMask ) ) | usValue ); - - /* move bits back into storage */ - ucByteBuf[usByteOffset] = ( UCHAR )( usWordBuf & 0xFF ); - ucByteBuf[usByteOffset + 1] = ( UCHAR )( usWordBuf >> BITS_UCHAR ); -} - -UCHAR -xMBUtilGetBits( UCHAR * ucByteBuf, USHORT usBitOffset, UCHAR ucNBits ) -{ - USHORT usWordBuf; - USHORT usMask; - USHORT usByteOffset; - USHORT usNPreBits; - - /* Calculate byte offset for first byte containing the bit values starting - * at usBitOffset. */ - usByteOffset = ( USHORT )( ( usBitOffset ) / BITS_UCHAR ); - - /* How many bits precede our bits to set. */ - usNPreBits = ( USHORT )( usBitOffset - usByteOffset * BITS_UCHAR ); - - /* Prepare a mask for setting the new bits. */ - usMask = ( USHORT )( ( 1 << ( USHORT ) ucNBits ) - 1 ); - - /* copy bits into temporary storage. */ - usWordBuf = ucByteBuf[usByteOffset]; - usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR; - - /* throw away unneeded bits. */ - usWordBuf >>= usNPreBits; - - /* mask away bits above the requested bitfield. */ - usWordBuf &= usMask; - - return ( UCHAR ) usWordBuf; -} - -eMBException -prveMBError2Exception( eMBErrorCode eErrorCode ) -{ - eMBException eStatus; - - switch ( eErrorCode ) - { - case MB_ENOERR: - eStatus = MB_EX_NONE; - break; - - case MB_ENOREG: - eStatus = MB_EX_ILLEGAL_DATA_ADDRESS; - break; - - case MB_ETIMEDOUT: - eStatus = MB_EX_SLAVE_BUSY; - break; - - default: - eStatus = MB_EX_SLAVE_DEVICE_FAILURE; - break; - } - - return eStatus; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mb.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mb.h deleted file mode 100755 index 32a1aa2..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mb.h +++ /dev/null @@ -1,425 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mb.h,v 1.17 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_H -#define _MB_H - -#include "port.h" - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -#include "mbport.h" -#include "mbproto.h" - -/*! \defgroup modbus Modbus - * \code #include "mb.h" \endcode - * - * This module defines the interface for the application. It contains - * the basic functions and types required to use the Modbus protocol stack. - * A typical application will want to call eMBInit() first. If the device - * is ready to answer network requests it must then call eMBEnable() to activate - * the protocol stack. In the main loop the function eMBPoll() must be called - * periodically. The time interval between pooling depends on the configured - * Modbus timeout. If an RTOS is available a separate task should be created - * and the task should always call the function eMBPoll(). - * - * \code - * // Initialize protocol stack in RTU mode for a slave with address 10 = 0x0A - * eMBInit( MB_RTU, 0x0A, 38400, MB_PAR_EVEN ); - * // Enable the Modbus Protocol Stack. - * eMBEnable( ); - * for( ;; ) - * { - * // Call the main polling loop of the Modbus protocol stack. - * eMBPoll( ); - * ... - * } - * \endcode - */ - -/* ----------------------- Defines ------------------------------------------*/ - -/*! \ingroup modbus - * \brief Use the default Modbus TCP port (502) - */ -#define MB_TCP_PORT_USE_DEFAULT 0 - -#define MB_FUNC_CODE_MAX 127 - -/* ----------------------- Type definitions ---------------------------------*/ -/*! \ingroup modbus - * \brief Modbus serial transmission modes (RTU/ASCII). - * - * Modbus serial supports two transmission modes. Either ASCII or RTU. RTU - * is faster but has more hardware requirements and requires a network with - * a low jitter. ASCII is slower and more reliable on slower links (E.g. modems) - */ -typedef enum -{ - MB_RTU, /*!< RTU transmission mode. */ - MB_ASCII, /*!< ASCII transmission mode. */ - MB_TCP /*!< TCP mode. */ -} eMBMode; - -/*! \ingroup modbus - * \brief If register should be written or read. - * - * This value is passed to the callback functions which support either - * reading or writing register values. Writing means that the application - * registers should be updated and reading means that the modbus protocol - * stack needs to know the current register values. - * - * \see eMBRegHoldingCB( ), eMBRegCoilsCB( ), eMBRegDiscreteCB( ) and - * eMBRegInputCB( ). - */ -typedef enum -{ - MB_REG_READ, /*!< Read register values and pass to protocol stack. */ - MB_REG_WRITE /*!< Update register values. */ -} eMBRegisterMode; - -/*! \ingroup modbus - * \brief Errorcodes used by all function in the protocol stack. - */ -typedef enum -{ - MB_ENOERR, /*!< no error. */ - MB_ENOREG, /*!< illegal register address. */ - MB_EINVAL, /*!< illegal argument. */ - MB_EPORTERR, /*!< porting layer error. */ - MB_ENORES, /*!< insufficient resources. */ - MB_EIO, /*!< I/O error. */ - MB_EILLSTATE, /*!< protocol stack in illegal state. */ - MB_ETIMEDOUT /*!< timeout error occurred. */ -} eMBErrorCode; - -/* ----------------------- Function prototypes ------------------------------*/ -/*! \ingroup modbus - * \brief Initialize the Modbus protocol stack. - * - * This functions initializes the ASCII or RTU module and calls the - * init functions of the porting layer to prepare the hardware. Please - * note that the receiver is still disabled and no Modbus frames are - * processed until eMBEnable( ) has been called. - * - * \param eMode If ASCII or RTU mode should be used. - * \param ucSlaveAddress The slave address. Only frames sent to this - * address or to the broadcast address are processed. - * \param ucPort The port to use. E.g. 1 for COM1 on windows. This value - * is platform dependent and some ports simply choose to ignore it. - * \param ulBaudRate The baudrate. E.g. 19200. Supported baudrates depend - * on the porting layer. - * \param eParity Parity used for serial transmission. - * - * \return If no error occurs the function returns eMBErrorCode::MB_ENOERR. - * The protocol is then in the disabled state and ready for activation - * by calling eMBEnable( ). Otherwise one of the following error codes - * is returned: - * - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid - * slave addresses are in the range 1 - 247. - * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. - */ -eMBErrorCode eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, - UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ); - -/*! \ingroup modbus - * \brief Initialize the Modbus protocol stack for Modbus TCP. - * - * This function initializes the Modbus TCP Module. Please note that - * frame processing is still disabled until eMBEnable( ) is called. - * - * \param usTCPPort The TCP port to listen on. - * \param ucSlaveUid The UID field for slave to listen on. - * \return If the protocol stack has been initialized correctly the function - * returns eMBErrorCode::MB_ENOERR. Otherwise one of the following error - * codes is returned: - * - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid - * slave addresses are in the range 1 - 247. - * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. - */ -eMBErrorCode eMBTCPInit( UCHAR ucSlaveUid, USHORT usTCPPort ); - -/*! \ingroup modbus - * \brief Release resources used by the protocol stack. - * - * This function disables the Modbus protocol stack and release all - * hardware resources. It must only be called when the protocol stack - * is disabled. - * - * \note Note all ports implement this function. A port which wants to - * get an callback must define the macro MB_PORT_HAS_CLOSE to 1. - * - * \return If the resources where released it return eMBErrorCode::MB_ENOERR. - * If the protocol stack is not in the disabled state it returns - * eMBErrorCode::MB_EILLSTATE. - */ -eMBErrorCode eMBClose( void ); - -/*! \ingroup modbus - * \brief Enable the Modbus protocol stack. - * - * This function enables processing of Modbus frames. Enabling the protocol - * stack is only possible if it is in the disabled state. - * - * \return If the protocol stack is now in the state enabled it returns - * eMBErrorCode::MB_ENOERR. If it was not in the disabled state it - * return eMBErrorCode::MB_EILLSTATE. - */ -eMBErrorCode eMBEnable( void ); - -/*! \ingroup modbus - * \brief Disable the Modbus protocol stack. - * - * This function disables processing of Modbus frames. - * - * \return If the protocol stack has been disabled it returns - * eMBErrorCode::MB_ENOERR. If it was not in the enabled state it returns - * eMBErrorCode::MB_EILLSTATE. - */ -eMBErrorCode eMBDisable( void ); - -/*! \ingroup modbus - * \brief The main pooling loop of the Modbus protocol stack. - * - * This function must be called periodically. The timer interval required - * is given by the application dependent Modbus slave timeout. Internally the - * function calls xMBPortEventGet() and waits for an event from the receiver or - * transmitter state machines. - * - * \return If the protocol stack is not in the enabled state the function - * returns eMBErrorCode::MB_EILLSTATE. Otherwise it returns - * eMBErrorCode::MB_ENOERR. - */ -eMBErrorCode eMBPoll( void ); - -/*! \ingroup modbus - * \brief Configure the slave id of the device. - * - * This function should be called when the Modbus function Report Slave ID - * is enabled ( By defining MB_FUNC_OTHER_REP_SLAVEID_ENABLED in mbconfig.h ). - * - * \param ucSlaveID Values is returned in the Slave ID byte of the - * Report Slave ID response. - * \param xIsRunning If TRUE the Run Indicator Status byte is set to 0xFF. - * otherwise the Run Indicator Status is 0x00. - * \param pucAdditional Values which should be returned in the Additional - * bytes of the Report Slave ID response. - * \param usAdditionalLen Length of the buffer pucAdditonal. - * - * \return If the static buffer defined by MB_FUNC_OTHER_REP_SLAVEID_BUF in - * mbconfig.h is to small it returns eMBErrorCode::MB_ENORES. Otherwise - * it returns eMBErrorCode::MB_ENOERR. - */ -eMBErrorCode eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning, - UCHAR const *pucAdditional, - USHORT usAdditionalLen ); - -/*! \ingroup modbus - * \brief Registers a callback handler for a given function code. - * - * This function registers a new callback handler for a given function code. - * The callback handler supplied is responsible for interpreting the Modbus PDU and - * the creation of an appropriate response. In case of an error it should return - * one of the possible Modbus exceptions which results in a Modbus exception frame - * sent by the protocol stack. - * - * \param ucFunctionCode The Modbus function code for which this handler should - * be registers. Valid function codes are in the range 1 to 127. - * \param pxHandler The function handler which should be called in case - * such a frame is received. If \c NULL a previously registered function handler - * for this function code is removed. - * - * \return eMBErrorCode::MB_ENOERR if the handler has been installed. If no - * more resources are available it returns eMBErrorCode::MB_ENORES. In this - * case the values in mbconfig.h should be adjusted. If the argument was not - * valid it returns eMBErrorCode::MB_EINVAL. - */ -eMBErrorCode eMBRegisterCB( UCHAR ucFunctionCode, - pxMBFunctionHandler pxHandler ); - -/* ----------------------- Callback -----------------------------------------*/ - -/*! \defgroup modbus_registers Modbus Registers - * \code #include "mb.h" \endcode - * The protocol stack does not internally allocate any memory for the - * registers. This makes the protocol stack very small and also usable on - * low end targets. In addition the values don't have to be in the memory - * and could for example be stored in a flash.
- * Whenever the protocol stack requires a value it calls one of the callback - * function with the register address and the number of registers to read - * as an argument. The application should then read the actual register values - * (for example the ADC voltage) and should store the result in the supplied - * buffer.
- * If the protocol stack wants to update a register value because a write - * register function was received a buffer with the new register values is - * passed to the callback function. The function should then use these values - * to update the application register values. - */ - -/*! \ingroup modbus_registers - * \brief Callback function used if the value of a Input Register - * is required by the protocol stack. The starting register address is given - * by \c usAddress and the last register is given by usAddress + - * usNRegs - 1. - * - * \param pucRegBuffer A buffer where the callback function should write - * the current value of the modbus registers to. - * \param usAddress The starting address of the register. Input registers - * are in the range 1 - 65535. - * \param usNRegs Number of registers the callback function must supply. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application can not supply values - * for registers within this range. In this case a - * ILLEGAL DATA ADDRESS exception frame is sent as a response. - * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is - * currently not available and the application dependent response - * timeout would be violated. In this case a SLAVE DEVICE BUSY - * exception is sent as a response. - * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case - * a SLAVE DEVICE FAILURE exception is sent as a response. - */ -eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Holding Register value is - * read or written by the protocol stack. The starting register address - * is given by \c usAddress and the last register is given by - * usAddress + usNRegs - 1. - * - * \param pucRegBuffer If the application registers values should be updated the - * buffer points to the new registers values. If the protocol stack needs - * to now the current values the callback function should write them into - * this buffer. - * \param usAddress The starting address of the register. - * \param usNRegs Number of registers to read or write. - * \param eMode If eMBRegisterMode::MB_REG_WRITE the application register - * values should be updated from the values in the buffer. For example - * this would be the case when the Modbus master has issued an - * WRITE SINGLE REGISTER command. - * If the value eMBRegisterMode::MB_REG_READ the application should copy - * the current values into the buffer \c pucRegBuffer. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application can not supply values - * for registers within this range. In this case a - * ILLEGAL DATA ADDRESS exception frame is sent as a response. - * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is - * currently not available and the application dependent response - * timeout would be violated. In this case a SLAVE DEVICE BUSY - * exception is sent as a response. - * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case - * a SLAVE DEVICE FAILURE exception is sent as a response. - */ -eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Coil Register value is - * read or written by the protocol stack. If you are going to use - * this function you might use the functions xMBUtilSetBits( ) and - * xMBUtilGetBits( ) for working with bitfields. - * - * \param pucRegBuffer The bits are packed in bytes where the first coil - * starting at address \c usAddress is stored in the LSB of the - * first byte in the buffer pucRegBuffer. - * If the buffer should be written by the callback function unused - * coil values (I.e. if not a multiple of eight coils is used) should be set - * to zero. - * \param usAddress The first coil number. - * \param usNCoils Number of coil values requested. - * \param eMode If eMBRegisterMode::MB_REG_WRITE the application values should - * be updated from the values supplied in the buffer \c pucRegBuffer. - * If eMBRegisterMode::MB_REG_READ the application should store the current - * values in the buffer \c pucRegBuffer. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application does not map an coils - * within the requested address range. In this case a - * ILLEGAL DATA ADDRESS is sent as a response. - * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is - * currently not available and the application dependent response - * timeout would be violated. In this case a SLAVE DEVICE BUSY - * exception is sent as a response. - * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case - * a SLAVE DEVICE FAILURE exception is sent as a response. - */ -eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Input Discrete Register value is - * read by the protocol stack. - * - * If you are going to use his function you might use the functions - * xMBUtilSetBits( ) and xMBUtilGetBits( ) for working with bitfields. - * - * \param pucRegBuffer The buffer should be updated with the current - * coil values. The first discrete input starting at \c usAddress must be - * stored at the LSB of the first byte in the buffer. If the requested number - * is not a multiple of eight the remaining bits should be set to zero. - * \param usAddress The starting address of the first discrete input. - * \param usNDiscrete Number of discrete input values. - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If no such discrete inputs exists. - * In this case a ILLEGAL DATA ADDRESS exception frame is sent - * as a response. - * - eMBErrorCode::MB_ETIMEDOUT If the requested register block is - * currently not available and the application dependent response - * timeout would be violated. In this case a SLAVE DEVICE BUSY - * exception is sent as a response. - * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case - * a SLAVE DEVICE FAILURE exception is sent as a response. - */ -eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNDiscrete ); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mb_m.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mb_m.h deleted file mode 100755 index 33421ef..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mb_m.h +++ /dev/null @@ -1,438 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mb_m.h,v 1.60 2013/09/03 10:20:05 Armink Add Master Functions $ - */ - -#ifndef _MB_M_H -#define _MB_M_H - -#include "mbconfig.h" -#include "port.h" -#include "mb.h" - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -#include "mbport.h" -#include "mbproto.h" -/*! \defgroup modbus Modbus - * \code #include "mb.h" \endcode - * - * This module defines the interface for the application. It contains - * the basic functions and types required to use the Modbus Master protocol stack. - * A typical application will want to call eMBMasterInit() first. If the device - * is ready to answer network requests it must then call eMBEnable() to activate - * the protocol stack. In the main loop the function eMBMasterPoll() must be called - * periodically. The time interval between pooling depends on the configured - * Modbus timeout. If an RTOS is available a separate task should be created - * and the task should always call the function eMBMasterPoll(). - * - * \code - * // Initialize protocol stack in RTU mode for a Master - * eMBMasterInit( MB_RTU, 38400, MB_PAR_EVEN ); - * // Enable the Modbus Protocol Stack. - * eMBMasterEnable( ); - * for( ;; ) - * { - * // Call the main polling loop of the Modbus Master protocol stack. - * eMBMasterPoll( ); - * ... - * } - * \endcode - */ - -/* ----------------------- Defines ------------------------------------------*/ - -/*! \ingroup modbus - * \brief Use the default Modbus Master TCP port (502) - */ -#define MB_MASTER_TCP_PORT_USE_DEFAULT 0 - -/*! \ingroup modbus - * \brief Errorcodes used by all function in the Master request. - */ -typedef enum -{ - MB_MRE_NO_ERR, /*!< no error. */ - MB_MRE_NO_REG, /*!< illegal register address. */ - MB_MRE_ILL_ARG, /*!< illegal argument. */ - MB_MRE_REV_DATA, /*!< receive data error. */ - MB_MRE_TIMEDOUT, /*!< timeout error occurred. */ - MB_MRE_MASTER_BUSY, /*!< master is busy now. */ - MB_MRE_EXE_FUN /*!< execute function error. */ -} eMBMasterReqErrCode; - - -/*! \ingroup modbus - * \brief Transaction information structure. - */ -typedef struct -{ - uint64_t xTransId; - UCHAR ucDestAddr; - UCHAR ucFuncCode; - eMBException eException; - UCHAR ucFrameError; -} TransactionInfo_t; - -/*! \ingroup modbus - * \brief TimerMode is Master 3 kind of Timer modes. - */ -typedef enum -{ - MB_TMODE_T35, /*!< Master receive frame T3.5 timeout. */ - MB_TMODE_RESPOND_TIMEOUT, /*!< Master wait respond for slave. */ - MB_TMODE_CONVERT_DELAY /*!< Master sent broadcast ,then delay sometime.*/ -} eMBMasterTimerMode; - -extern _lock_t xMBMLock; // Modbus lock object - -#define MB_ATOMIC_SECTION CRITICAL_SECTION(xMBMLock) - -/* ----------------------- Function prototypes ------------------------------*/ -/*! \ingroup modbus - * \brief Initialize the Modbus Master protocol stack. - * - * This functions initializes the ASCII or RTU module and calls the - * init functions of the porting layer to prepare the hardware. Please - * note that the receiver is still disabled and no Modbus frames are - * processed until eMBMasterEnable( ) has been called. - * - * \param eMode If ASCII or RTU mode should be used. - * \param ucPort The port to use. E.g. 1 for COM1 on windows. This value - * is platform dependent and some ports simply choose to ignore it. - * \param ulBaudRate The baudrate. E.g. 19200. Supported baudrates depend - * on the porting layer. - * \param eParity Parity used for serial transmission. - * - * \return If no error occurs the function returns eMBErrorCode::MB_ENOERR. - * The protocol is then in the disabled state and ready for activation - * by calling eMBMasterEnable( ). Otherwise one of the following error codes - * is returned: - * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. - */ -eMBErrorCode eMBMasterSerialInit( eMBMode eMode, UCHAR ucPort, - ULONG ulBaudRate, eMBParity eParity ); - -/*! \ingroup modbus - * \brief Initialize the Modbus Master protocol stack for Modbus TCP. - * - * This function initializes the Modbus TCP Module. Please note that - * frame processing is still disabled until eMBEnable( ) is called. - * - * \param usTCPPort The TCP port to listen on. - * \return If the protocol stack has been initialized correctly the function - * returns eMBErrorCode::MB_ENOERR. Otherwise one of the following error - * codes is returned: - * - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid - * slave addresses are in the range 1 - 247. - * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. - */ -eMBErrorCode eMBMasterTCPInit( USHORT usTCPPort ); - -/*! \ingroup modbus - * \brief Release resources used by the protocol stack. - * - * This function disables the Modbus Master protocol stack and release all - * hardware resources. It must only be called when the protocol stack - * is disabled. - * - * \note Note all ports implement this function. A port which wants to - * get an callback must define the macro MB_PORT_HAS_CLOSE to 1. - * - * \return If the resources where released it return eMBErrorCode::MB_ENOERR. - * If the protocol stack is not in the disabled state it returns - * eMBErrorCode::MB_EILLSTATE. - */ -eMBErrorCode eMBMasterClose( void ); - -/*! \ingroup modbus - * \brief Enable the Modbus Master protocol stack. - * - * This function enables processing of Modbus Master frames. Enabling the protocol - * stack is only possible if it is in the disabled state. - * - * \return If the protocol stack is now in the state enabled it returns - * eMBErrorCode::MB_ENOERR. If it was not in the disabled state it - * return eMBErrorCode::MB_EILLSTATE. - */ -eMBErrorCode eMBMasterEnable( void ); - -/*! \ingroup modbus - * \brief Disable the Modbus Master protocol stack. - * - * This function disables processing of Modbus frames. - * - * \return If the protocol stack has been disabled it returns - * eMBErrorCode::MB_ENOERR. If it was not in the enabled state it returns - * eMBErrorCode::MB_EILLSTATE. - */ -eMBErrorCode eMBMasterDisable( void ); - -/*! \ingroup modbus - * \brief The main pooling loop of the Modbus Master protocol stack. - * - * This function must be called periodically. The timer interval required - * is given by the application dependent Modbus slave timeout. Internally the - * function calls xMBMasterPortEventGet() and waits for an event from the receiver or - * transmitter state machines. - * - * \return If the protocol stack is not in the enabled state the function - * returns eMBErrorCode::MB_EILLSTATE. Otherwise it returns - * eMBErrorCode::MB_ENOERR. - */ -eMBErrorCode eMBMasterPoll( void ); - -/*! \ingroup modbus - * \brief Registers a callback handler for a given function code. - * - * This function registers a new callback handler for a given function code. - * The callback handler supplied is responsible for interpreting the Modbus PDU and - * the creation of an appropriate response. In case of an error it should return - * one of the possible Modbus exceptions which results in a Modbus exception frame - * sent by the protocol stack. - * - * \param ucFunctionCode The Modbus function code for which this handler should - * be registers. Valid function codes are in the range 1 to 127. - * \param pxHandler The function handler which should be called in case - * such a frame is received. If \c NULL a previously registered function handler - * for this function code is removed. - * - * \return eMBErrorCode::MB_ENOERR if the handler has been installed. If no - * more resources are available it returns eMBErrorCode::MB_ENORES. In this - * case the values in mbconfig.h should be adjusted. If the argument was not - * valid it returns eMBErrorCode::MB_EINVAL. - */ -eMBErrorCode eMBMasterRegisterCB( UCHAR ucFunctionCode, - pxMBFunctionHandler pxHandler ); - -/* ----------------------- Callback -----------------------------------------*/ - -/*! \defgroup modbus_master registers Modbus Registers - * \code #include "mb_m.h" \endcode - * The protocol stack does not internally allocate any memory for the - * registers. This makes the protocol stack very small and also usable on - * low end targets. In addition the values don't have to be in the memory - * and could for example be stored in a flash.
- * Whenever the protocol stack requires a value it calls one of the callback - * function with the register address and the number of registers to read - * as an argument. The application should then read the actual register values - * (for example the ADC voltage) and should store the result in the supplied - * buffer.
- * If the protocol stack wants to update a register value because a write - * register function was received a buffer with the new register values is - * passed to the callback function. The function should then use these values - * to update the application register values. - */ - -/*! \ingroup modbus_registers - * \brief Callback function used if the value of a Input Register - * is required by the protocol stack. The starting register address is given - * by \c usAddress and the last register is given by usAddress + - * usNRegs - 1. - * - * \param pucRegBuffer A buffer where the callback function should write - * the current value of the modbus registers to. - * \param usAddress The starting address of the register. Input registers - * are in the range 1 - 65535. - * \param usNRegs Number of registers the callback function must supply. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application does not map an coils - * within the requested address range. In this case a - * ILLEGAL DATA ADDRESS is sent as a response. - */ -eMBErrorCode eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Holding Register value is - * read or written by the protocol stack. The starting register address - * is given by \c usAddress and the last register is given by - * usAddress + usNRegs - 1. - * - * \param pucRegBuffer If the application registers values should be updated the - * buffer points to the new registers values. If the protocol stack needs - * to now the current values the callback function should write them into - * this buffer. - * \param usAddress The starting address of the register. - * \param usNRegs Number of registers to read or write. - * \param eMode If eMBRegisterMode::MB_REG_WRITE the application register - * values should be updated from the values in the buffer. For example - * this would be the case when the Modbus master has issued an - * WRITE SINGLE REGISTER command. - * If the value eMBRegisterMode::MB_REG_READ the application should copy - * the current values into the buffer \c pucRegBuffer. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application does not map an coils - * within the requested address range. In this case a - * ILLEGAL DATA ADDRESS is sent as a response. - */ -eMBErrorCode eMBMasterRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Coil Register value is - * read or written by the protocol stack. If you are going to use - * this function you might use the functions xMBUtilSetBits( ) and - * xMBUtilGetBits( ) for working with bitfields. - * - * \param pucRegBuffer The bits are packed in bytes where the first coil - * starting at address \c usAddress is stored in the LSB of the - * first byte in the buffer pucRegBuffer. - * If the buffer should be written by the callback function unused - * coil values (I.e. if not a multiple of eight coils is used) should be set - * to zero. - * \param usAddress The first coil number. - * \param usNCoils Number of coil values requested. - * \param eMode If eMBRegisterMode::MB_REG_WRITE the application values should - * be updated from the values supplied in the buffer \c pucRegBuffer. - * If eMBRegisterMode::MB_REG_READ the application should store the current - * values in the buffer \c pucRegBuffer. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application does not map an coils - * within the requested address range. In this case a - * ILLEGAL DATA ADDRESS is sent as a response. - */ -eMBErrorCode eMBMasterRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Input Discrete Register value is - * read by the protocol stack. - * - * If you are going to use his function you might use the functions - * xMBUtilSetBits( ) and xMBUtilGetBits( ) for working with bitfields. - * - * \param pucRegBuffer The buffer should be updated with the current - * coil values. The first discrete input starting at \c usAddress must be - * stored at the LSB of the first byte in the buffer. If the requested number - * is not a multiple of eight the remaining bits should be set to zero. - * \param usAddress The starting address of the first discrete input. - * \param usNDiscrete Number of discrete input values. - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application does not map an coils - * within the requested address range. In this case a - * ILLEGAL DATA ADDRESS is sent as a response. - */ -eMBErrorCode eMBMasterRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNDiscrete ); - -/*! \ingroup modbus - *\brief These Modbus functions are called for user when Modbus run in Master Mode. - */ -eMBMasterReqErrCode -eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, - USHORT usNRegs, USHORT * pusDataBuffer, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqReadWriteMultipleHoldingRegister( UCHAR ucSndAddr, - USHORT usReadRegAddr, USHORT usNReadRegs, USHORT * pusDataBuffer, - USHORT usWriteRegAddr, USHORT usNWriteRegs, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqReadCoils( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqWriteCoil( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqWriteMultipleCoils( UCHAR ucSndAddr, - USHORT usCoilAddr, USHORT usNCoils, UCHAR * pucDataBuffer, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT usNDiscreteIn, LONG lTimeOut ); - -eMBException -eMBMasterFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); - -/* \ingroup modbus - * \brief These functions are interface for Modbus Master - */ -void vMBMasterGetPDUSndBuf( UCHAR ** pucFrame ); -UCHAR ucMBMasterGetDestAddress( void ); -void vMBMasterSetDestAddress( UCHAR Address ); -BOOL xMBMasterGetCBRunInMasterMode( void ); -void vMBMasterSetCBRunInMasterMode( BOOL IsMasterMode ); -USHORT usMBMasterGetPDUSndLength( void ); -void vMBMasterSetPDUSndLength( USHORT SendPDULength ); -void vMBMasterSetCurTimerMode( eMBMasterTimerMode eMBTimerMode ); -void vMBMasterRequestSetType( BOOL xIsBroadcast ); -eMBMasterTimerMode xMBMasterGetCurTimerMode( void ); -BOOL xMBMasterRequestIsBroadcast( void ); -eMBMasterErrorEventType eMBMasterGetErrorType( void ); -void vMBMasterSetErrorType( eMBMasterErrorEventType errorType ); -eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ); -eMBMode ucMBMasterGetCommMode( void ); -BOOL xMBMasterGetLastTransactionInfo( uint64_t *pxTransId, UCHAR *pucDestAddress, - UCHAR *pucFunctionCode, UCHAR *pucException, - USHORT *pusErrorType ); - -/* ----------------------- Callback -----------------------------------------*/ - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbconfig.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbconfig.h deleted file mode 100755 index 171208a..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbconfig.h +++ /dev/null @@ -1,200 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbconfig.h,v 1.15 2010/06/06 13:54:40 wolti Exp $ - * $Id: mbconfig.h,v 1.60 2013/08/13 21:19:55 Armink Add Master Functions $ - */ - -#ifndef _MB_CONFIG_H -#define _MB_CONFIG_H - -#include // needs to be included for default system types (such as PRIxx) -#include "sdkconfig.h" // for KConfig options - -#if __has_include("esp_idf_version.h") -#include "esp_idf_version.h" -#endif - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif -/* ----------------------- Defines ------------------------------------------*/ -/*! \defgroup modbus_cfg Modbus Configuration - * - * Most modules in the protocol stack are completly optional and can be - * excluded. This is specially important if target resources are very small - * and program memory space should be saved.
- * - * All of these settings are available in the file mbconfig.h - */ -/*! \addtogroup modbus_cfg - * @{ - */ -/*! \brief If Modbus Master ASCII support is enabled. */ -#define MB_MASTER_ASCII_ENABLED ( CONFIG_FMB_COMM_MODE_ASCII_EN ) -/*! \brief If Modbus Master RTU support is enabled. */ -#define MB_MASTER_RTU_ENABLED ( CONFIG_FMB_COMM_MODE_RTU_EN ) -/*! \brief If Modbus Master TCP support is enabled. */ -#define MB_MASTER_TCP_ENABLED ( CONFIG_FMB_COMM_MODE_TCP_EN ) -/*! \brief If Modbus Slave ASCII support is enabled. */ -#define MB_SLAVE_ASCII_ENABLED ( CONFIG_FMB_COMM_MODE_ASCII_EN ) -/*! \brief If Modbus Slave RTU support is enabled. */ -#define MB_SLAVE_RTU_ENABLED ( CONFIG_FMB_COMM_MODE_RTU_EN ) -/*! \brief If Modbus Slave TCP support is enabled. */ -#define MB_TCP_ENABLED ( CONFIG_FMB_COMM_MODE_TCP_EN ) - -#if !CONFIG_FMB_COMM_MODE_ASCII_EN && !CONFIG_FMB_COMM_MODE_RTU_EN && !MB_MASTER_TCP_ENABLED && !MB_TCP_ENABLED -#error "None of Modbus communication mode is enabled. Please enable one of (ASCII, RTU, TCP) mode in Kconfig." -#endif - -#ifdef ESP_IDF_VERSION - -#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0)) -// Features supported from 4.4 -#define MB_TIMER_SUPPORTS_ISR_DISPATCH_METHOD 1 -#endif - -#endif - -/*! \brief The option is required for support of RTU over TCP. - */ -#define MB_TCP_UID_ENABLED ( CONFIG_FMB_TCP_UID_ENABLED ) - -/*! \brief This option defines the number of data bits per ASCII character. - * - * A parity bit is added before the stop bit which keeps the actual byte size at 10 bits. - */ -#ifdef CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB -#define MB_ASCII_BITS_PER_SYMB ( CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB ) -#endif - -#define MB_EVENT_QUEUE_SIZE ( CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE ) -#define MB_EVENT_QUEUE_TIMEOUT ( pdMS_TO_TICKS( CONFIG_FMB_EVENT_QUEUE_TIMEOUT ) ) - -/*! \brief The character timeout value for Modbus ASCII. - * - * The character timeout value is not fixed for Modbus ASCII and is therefore - * a configuration option. It should be set to the maximum expected delay - * time of the network. - */ -#ifdef CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS -#define MB_ASCII_TIMEOUT_MS ( CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS ) -#endif - -/*! \brief Timeout to wait in ASCII prior to enabling transmitter. - * - * If defined the function calls vMBPortSerialDelay with the argument - * MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS to allow for a delay before - * the serial transmitter is enabled. This is required because some - * targets are so fast that there is no time between receiving and - * transmitting the frame. If the master is to slow with enabling its - * receiver then he will not receive the response correctly. - */ -#ifndef CONFIG_FMB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS -#define MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ( 0 ) -#else -#define MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ( CONFIG_FMB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ) -#endif - -/*! \brief Maximum number of Modbus functions codes the protocol stack - * should support. - * - * The maximum number of supported Modbus functions must be greater than - * the sum of all enabled functions in this file and custom function - * handlers. If set to small adding more functions will fail. - */ -#define MB_FUNC_HANDLERS_MAX ( 16 ) - -/*! \brief Number of bytes which should be allocated for the Report Slave ID - * command. - * - * This number limits the maximum size of the additional segment in the - * report slave id function. See eMBSetSlaveID( ) for more information on - * how to set this value. It is only used if MB_FUNC_OTHER_REP_SLAVEID_ENABLED - * is set to 1. - */ -#define MB_FUNC_OTHER_REP_SLAVEID_BUF ( 32 ) - -/*! \brief If the Report Slave ID function should be enabled. */ -#define MB_FUNC_OTHER_REP_SLAVEID_ENABLED ( CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT ) - -/*! \brief If the Read Input Registers function should be enabled. */ -#define MB_FUNC_READ_INPUT_ENABLED ( 1 ) - -/*! \brief If the Read Holding Registers function should be enabled. */ -#define MB_FUNC_READ_HOLDING_ENABLED ( 1 ) - -/*! \brief If the Write Single Register function should be enabled. */ -#define MB_FUNC_WRITE_HOLDING_ENABLED ( 1 ) - -/*! \brief If the Write Multiple registers function should be enabled. */ -#define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED ( 1 ) - -/*! \brief If the Read Coils function should be enabled. */ -#define MB_FUNC_READ_COILS_ENABLED ( 1 ) - -/*! \brief If the Write Coils function should be enabled. */ -#define MB_FUNC_WRITE_COIL_ENABLED ( 1 ) - -/*! \brief If the Write Multiple Coils function should be enabled. */ -#define MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED ( 1 ) - -/*! \brief If the Read Discrete Inputs function should be enabled. */ -#define MB_FUNC_READ_DISCRETE_INPUTS_ENABLED ( 1 ) - -/*! \brief If the Read/Write Multiple Registers function should be enabled. */ -#define MB_FUNC_READWRITE_HOLDING_ENABLED ( 1 ) - -/*! \brief Check the option to place timer handler into IRAM */ -#define MB_PORT_TIMER_ISR_IN_IRAM ( CONFIG_FMB_TIMER_USE_ISR_DISPATCH_METHOD ) - -/*! @} */ -#ifdef __cplusplus - PR_END_EXTERN_C -#endif - -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED -/*! \brief If master send a broadcast frame, the master will wait time of convert to delay, - * then master can send other frame */ -#define MB_MASTER_DELAY_MS_CONVERT ( CONFIG_FMB_MASTER_DELAY_MS_CONVERT ) -/*! \brief If master send a frame which is not broadcast,the master will wait sometime for slave. - * And if slave is not respond in this time,the master will process this timeout error. - * Then master can send other frame */ -#define MB_MASTER_TIMEOUT_MS_RESPOND ( CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND ) -/*! \brief The total slaves in Modbus Master system. - * \note : The slave ID must be continuous from 1.*/ -#define MB_MASTER_TOTAL_SLAVE_NUM ( 247 ) -#endif - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbframe.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbframe.h deleted file mode 100755 index 9df0b1d..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbframe.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbframe.h,v 1.9 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_FRAME_H -#define _MB_FRAME_H - -#include "port.h" - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -/*! - * Constants which defines the format of a modbus frame. The example is - * shown for a Modbus RTU/ASCII frame. Note that the Modbus PDU is not - * dependent on the underlying transport. - * - * - * <------------------------ MODBUS SERIAL LINE PDU (1) -------------------> - * <----------- MODBUS PDU (1') ----------------> - * +-----------+---------------+----------------------------+-------------+ - * | Address | Function Code | Data | CRC/LRC | - * +-----------+---------------+----------------------------+-------------+ - * | | | | - * (2) (3/2') (3') (4) - * - * (1) ... MB_SER_PDU_SIZE_MAX = 256 - * (2) ... MB_SER_PDU_ADDR_OFF = 0 - * (3) ... MB_SER_PDU_PDU_OFF = 1 - * (4) ... MB_SER_PDU_SIZE_CRC = 2 - * - * (1') ... MB_PDU_SIZE_MAX = 253 - * (2') ... MB_PDU_FUNC_OFF = 0 - * (3') ... MB_PDU_DATA_OFF = 1 - * - */ - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_SIZE_MAX 253 /*!< Maximum size of a PDU. */ -#define MB_PDU_SIZE_MIN 1 /*!< Function Code */ -#define MB_PDU_FUNC_OFF 0 /*!< Offset of function code in PDU. */ -#define MB_PDU_DATA_OFF 1 /*!< Offset for response data in PDU. */ - -#define MB_SER_PDU_SIZE_MAX MB_SERIAL_BUF_SIZE /*!< Maximum size of a Modbus frame. */ -#define MB_SER_PDU_SIZE_LRC 1 /*!< Size of LRC field in PDU. */ -#define MB_SER_PDU_ADDR_OFF 0 /*!< Offset of slave address in Ser-PDU. */ -#define MB_SER_PDU_PDU_OFF 1 /*!< Offset of Modbus-PDU in Ser-PDU. */ -#define MB_SER_PDU_SIZE_CRC 2 /*!< Size of CRC field in PDU. */ - -#define MB_TCP_TID 0 -#define MB_TCP_PID 2 -#define MB_TCP_LEN 4 -#define MB_TCP_UID 6 -#define MB_TCP_FUNC 7 - -#if MB_MASTER_TCP_ENABLED -#define MB_SEND_BUF_PDU_OFF MB_TCP_FUNC -#else -#define MB_SEND_BUF_PDU_OFF MB_SER_PDU_PDU_OFF -#endif - -#define MB_TCP_PSEUDO_ADDRESS 255 - -/* ----------------------- Prototypes 0-------------------------------------*/ -typedef void ( *pvMBFrameStart ) ( void ); - -typedef void ( *pvMBFrameStop ) ( void ); - -typedef eMBErrorCode( *peMBFrameReceive ) ( UCHAR * pucRcvAddress, - UCHAR ** pucFrame, - USHORT * pusLength ); - -typedef eMBErrorCode( *peMBFrameSend ) ( UCHAR slaveAddress, - const UCHAR * pucFrame, - USHORT usLength ); - -typedef void( *pvMBFrameClose ) ( void ); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbfunc.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbfunc.h deleted file mode 100755 index fcb88bb..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbfunc.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfunc.h,v 1.12 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_FUNC_H -#define _MB_FUNC_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif -#if MB_FUNC_OTHER_REP_SLAVEID_BUF > 0 - eMBException eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_INPUT_ENABLED > 0 -eMBException eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_HOLDING_ENABLED > 0 -eMBException eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 -eMBException eMBFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 -eMBException eMBFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_COILS_ENABLED > 0 -eMBException eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_COIL_ENABLED > 0 -eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 -eMBException eMBFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 -eMBException eMBFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 -eMBException eMBFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbport.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbport.h deleted file mode 100755 index d397669..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbport.h +++ /dev/null @@ -1,284 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbport.h,v 1.19 2010/06/06 13:54:40 wolti Exp $ - */ - -#ifndef _MB_PORT_H -#define _MB_PORT_H - -#include "mbconfig.h" // for options - - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -#if CONFIG_UART_ISR_IN_IRAM -#define MB_PORT_SERIAL_ISR_FLAG ESP_INTR_FLAG_IRAM -#else -#define MB_PORT_SERIAL_ISR_FLAG ESP_INTR_FLAG_LOWMED -#endif - -#if CONFIG_FMB_TIMER_USE_ISR_DISPATCH_METHOD && MB_TIMER_SUPPORTS_ISR_DISPATCH_METHOD -#define MB_PORT_ISR_ATTR IRAM_ATTR -#else -#define MB_PORT_ISR_ATTR -#endif - -/* ----------------------- Type definitions ---------------------------------*/ - -typedef enum -{ - EV_READY = 0x01, /*!< Startup finished. */ - EV_FRAME_RECEIVED = 0x02, /*!< Frame received. */ - EV_EXECUTE = 0x04, /*!< Execute function. */ - EV_FRAME_SENT = 0x08, /*!< Frame sent. */ - EV_FRAME_TRANSMIT = 0x10 /*!< Frame transmit. */ -} eMBEventType; - -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED -typedef enum { - EV_MASTER_NO_EVENT = 0x0000, - EV_MASTER_TRANS_START = 0x0001, /*!< Transaction start flag */ - EV_MASTER_READY = 0x0002, /*!< Startup finished. */ - EV_MASTER_FRAME_RECEIVED = 0x0004, /*!< Frame received. */ - EV_MASTER_EXECUTE = 0x0008, /*!< Execute function. */ - EV_MASTER_FRAME_SENT = 0x0010, /*!< Frame sent. */ - EV_MASTER_FRAME_TRANSMIT = 0x0020, /*!< Frame transmission. */ - EV_MASTER_ERROR_PROCESS = 0x0040, /*!< Frame error process. */ - EV_MASTER_PROCESS_SUCCESS = 0x0080, /*!< Request process success. */ - EV_MASTER_ERROR_RESPOND_TIMEOUT = 0x0100, /*!< Request respond timeout. */ - EV_MASTER_ERROR_RECEIVE_DATA = 0x0200, /*!< Request receive data error. */ - EV_MASTER_ERROR_EXECUTE_FUNCTION = 0x0400 /*!< Request execute function error. */ -} eMBMasterEventEnum; - -typedef enum { - EV_ERROR_INIT, /*!< No error, initial state. */ - EV_ERROR_RESPOND_TIMEOUT, /*!< Slave respond timeout. */ - EV_ERROR_RECEIVE_DATA, /*!< Receive frame data error. */ - EV_ERROR_EXECUTE_FUNCTION, /*!< Execute function error. */ - EV_ERROR_OK /*!< No error, processing completed. */ -} eMBMasterErrorEventType; - -typedef struct _MbEventType { - eMBMasterEventEnum eEvent; /*!< event itself. */ - uint64_t xTransactionId; /*!< ID of the transaction */ - uint64_t xPostTimestamp; /*!< timestamp of event posted */ - uint64_t xGetTimestamp; /*!< timestamp of event get */ -} xMBMasterEventType; - -#endif - -/*! \ingroup modbus - * \brief Parity used for characters in serial mode. - * - * The parity which should be applied to the characters sent over the serial - * link. Please note that this values are actually passed to the porting - * layer and therefore not all parity modes might be available. - */ -typedef enum -{ - MB_PAR_NONE, /*!< No parity. */ - MB_PAR_ODD, /*!< Odd parity. */ - MB_PAR_EVEN /*!< Even parity. */ -} eMBParity; - -/* ----------------------- Supporting functions -----------------------------*/ -BOOL xMBPortEventInit( void ); - -BOOL xMBPortEventPost( eMBEventType eEvent ); - -BOOL xMBPortEventGet( /*@out@ */ eMBEventType * eEvent ); - -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED -BOOL xMBMasterPortEventInit( void ); - -BOOL xMBMasterPortEventPost( eMBMasterEventEnum eEvent ); - -BOOL xMBMasterPortEventGet( /*@out@ */ xMBMasterEventType * eEvent ); - -eMBMasterEventEnum - xMBMasterPortFsmWaitConfirmation( eMBMasterEventEnum eEventMask, ULONG ulTimeout); - -void vMBMasterOsResInit( void ); - -BOOL xMBMasterRunResTake( LONG time ); - -void vMBMasterRunResRelease( void ); - -uint64_t xMBMasterPortGetTransactionId( void ); - -#endif // MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED -/* ----------------------- Serial port functions ----------------------------*/ - -BOOL xMBPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, - UCHAR ucDataBits, eMBParity eParity ); - -void vMBPortClose( void ); - -void xMBPortSerialClose( void ); - -void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable ); - -BOOL xMBPortSerialGetByte( CHAR * pucByte ); - -BOOL xMBPortSerialPutByte( CHAR ucByte ); - -BOOL xMBPortSerialGetRequest( UCHAR **ppucMBSerialFrame, USHORT * pusSerialLength ) __attribute__ ((weak)); - -BOOL xMBPortSerialSendResponse( UCHAR *pucMBSerialFrame, USHORT usSerialLength ) __attribute__ ((weak)); - -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED -BOOL xMBMasterPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, - UCHAR ucDataBits, eMBParity eParity ); - -void vMBMasterPortClose( void ); - -void xMBMasterPortSerialClose( void ); - -void vMBMasterPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable ); - -BOOL xMBMasterPortSerialGetByte( CHAR * pucByte ); - -BOOL xMBMasterPortSerialPutByte( CHAR ucByte ); - -BOOL xMBMasterPortSerialGetResponse( UCHAR **ppucMBSerialFrame, USHORT * usSerialLength ); - -BOOL xMBMasterPortSerialSendRequest( UCHAR *pucMBSerialFrame, USHORT usSerialLength ); - -void vMBMasterRxFlush( void ); - -#endif - -/* ----------------------- Timers functions ---------------------------------*/ -BOOL xMBPortTimersInit( USHORT usTimeOut50us ); - -void xMBPortTimersClose( void ); - -void vMBPortTimersEnable( void ); - -void vMBPortTimersDisable( void ); - -void vMBPortTimersDelay( USHORT usTimeOutMS ); - -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED -BOOL xMBMasterPortTimersInit( USHORT usTimeOut50us ); - -void xMBMasterPortTimersClose( void ); - -void vMBMasterPortTimersT35Enable( void ); - -void vMBMasterPortTimersConvertDelayEnable( void ); - -void vMBMasterPortTimersRespondTimeoutEnable( void ); - -void vMBMasterPortTimersDisable( void ); - - -/* ----------------- Callback for the master error process ------------------*/ -void vMBMasterErrorCBRespondTimeout( uint64_t xTransId, UCHAR ucDestAddress, - const UCHAR* pucSendData, USHORT ucSendLength ); - -void vMBMasterErrorCBReceiveData( uint64_t xTransId, UCHAR ucDestAddress, - const UCHAR* pucRecvData, USHORT ucRecvLength, - const UCHAR* pucSendData, USHORT ucSendLength ); - -void vMBMasterErrorCBExecuteFunction( uint64_t xTransId, UCHAR ucDestAddress, - const UCHAR* pucRecvData, USHORT ucRecvLength, - const UCHAR* pucSendData, USHORT ucSendLength ); - -void vMBMasterCBRequestSuccess( uint64_t xTransId, UCHAR ucDestAddress, - const UCHAR* pucRecvData, USHORT ucRecvLength, - const UCHAR* pucSendData, USHORT ucSendLength ); -#endif -/* ----------------------- Callback for the protocol stack ------------------*/ -/*! - * \brief Callback function for the porting layer when a new byte is - * available. - * - * Depending upon the mode this callback function is used by the RTU or - * ASCII transmission layers. In any case a call to xMBPortSerialGetByte() - * must immediately return a new character. - * - * \return TRUE if a event was posted to the queue because - * a new byte was received. The port implementation should wake up the - * tasks which are currently blocked on the eventqueue. - */ -extern BOOL( *pxMBFrameCBByteReceived ) ( void ); - -extern BOOL( *pxMBFrameCBTransmitterEmpty ) ( void ); - -extern BOOL( *pxMBPortCBTimerExpired ) ( void ); - -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED -extern BOOL( *pxMBMasterFrameCBByteReceived ) ( void ); - -extern BOOL( *pxMBMasterFrameCBTransmitterEmpty ) ( void ); - -extern BOOL( *pxMBMasterPortCBTimerExpired ) ( void ); -#endif -/* ----------------------- TCP port functions -------------------------------*/ -#if MB_TCP_ENABLED -BOOL xMBTCPPortInit( USHORT usTCPPort ); - -void vMBTCPPortClose( void ); - -void vMBTCPPortEnable( void ); - -void vMBTCPPortDisable( void ); - -BOOL xMBTCPPortGetRequest( UCHAR **ppucMBTCPFrame, USHORT * usTCPLength ); - -BOOL xMBTCPPortSendResponse( UCHAR *pucMBTCPFrame, USHORT usTCPLength ); - -#endif - -#if MB_MASTER_TCP_ENABLED -BOOL xMBMasterTCPPortInit( USHORT usTCPPort ); - -void vMBMasterTCPPortClose( void ); - -void vMBMasterTCPPortEnable( void ); - -void vMBMasterTCPPortDisable( void ); - -BOOL xMBMasterTCPPortGetRequest( UCHAR **ppucMBTCPFrame, USHORT * usTCPLength ); - -BOOL xMBMasterTCPPortSendResponse( UCHAR *pucMBTCPFrame, USHORT usTCPLength ); -#endif -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbproto.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbproto.h deleted file mode 100755 index 6d02c18..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbproto.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbproto.h,v 1.14 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_PROTO_H -#define _MB_PROTO_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif -/* ----------------------- Defines ------------------------------------------*/ -#define MB_ADDRESS_BROADCAST ( 0 ) /*! Modbus broadcast address. */ -#define MB_ADDRESS_MIN ( 1 ) /*! Smallest possible slave address. */ -#define MB_ADDRESS_MAX ( 247 ) /*! Biggest possible slave address. */ -#define MB_FUNC_NONE ( 0 ) -#define MB_FUNC_READ_COILS ( 1 ) -#define MB_FUNC_READ_DISCRETE_INPUTS ( 2 ) -#define MB_FUNC_WRITE_SINGLE_COIL ( 5 ) -#define MB_FUNC_WRITE_MULTIPLE_COILS ( 15 ) -#define MB_FUNC_READ_HOLDING_REGISTER ( 3 ) -#define MB_FUNC_READ_INPUT_REGISTER ( 4 ) -#define MB_FUNC_WRITE_REGISTER ( 6 ) -#define MB_FUNC_WRITE_MULTIPLE_REGISTERS ( 16 ) -#define MB_FUNC_READWRITE_MULTIPLE_REGISTERS ( 23 ) -#define MB_FUNC_DIAG_READ_EXCEPTION ( 7 ) -#define MB_FUNC_DIAG_DIAGNOSTIC ( 8 ) -#define MB_FUNC_DIAG_GET_COM_EVENT_CNT ( 11 ) -#define MB_FUNC_DIAG_GET_COM_EVENT_LOG ( 12 ) -#define MB_FUNC_OTHER_REPORT_SLAVEID ( 17 ) -#define MB_FUNC_ERROR ( 128u ) -/* ----------------------- Type definitions ---------------------------------*/ -typedef enum -{ - MB_EX_NONE = 0x00, - MB_EX_ILLEGAL_FUNCTION = 0x01, - MB_EX_ILLEGAL_DATA_ADDRESS = 0x02, - MB_EX_ILLEGAL_DATA_VALUE = 0x03, - MB_EX_SLAVE_DEVICE_FAILURE = 0x04, - MB_EX_ACKNOWLEDGE = 0x05, - MB_EX_SLAVE_BUSY = 0x06, - MB_EX_MEMORY_PARITY_ERROR = 0x08, - MB_EX_GATEWAY_PATH_FAILED = 0x0A, - MB_EX_GATEWAY_TGT_FAILED = 0x0B -} eMBException; - -typedef eMBException( *pxMBFunctionHandler ) ( UCHAR * pucFrame, USHORT * pusLength ); - -typedef struct -{ - UCHAR ucFunctionCode; - pxMBFunctionHandler pxHandler; -} xMBFunctionHandler; - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbutils.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbutils.h deleted file mode 100755 index de64c4a..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/include/mbutils.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbutils.h,v 1.5 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_UTILS_H -#define _MB_UTILS_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif -/*! \defgroup modbus_utils Utilities - * - * This module contains some utility functions which can be used by - * the application. It includes some special functions for working with - * bitfields backed by a character array buffer. - * - */ -/*! \addtogroup modbus_utils - * @{ - */ -/*! \brief Function to set bits in a byte buffer. - * - * This function allows the efficient use of an array to implement bitfields. - * The array used for storing the bits must always be a multiple of two - * bytes. Up to eight bits can be set or cleared in one operation. - * - * \param ucByteBuf A buffer where the bit values are stored. Must be a - * multiple of 2 bytes. No length checking is performed and if - * usBitOffset / 8 is greater than the size of the buffer memory contents - * is overwritten. - * \param usBitOffset The starting address of the bits to set. The first - * bit has the offset 0. - * \param ucNBits Number of bits to modify. The value must always be smaller - * than 8. - * \param ucValues Thew new values for the bits. The value for the first bit - * starting at usBitOffset is the LSB of the value - * ucValues - * - * \code - * ucBits[2] = {0, 0}; - * - * // Set bit 4 to 1 (read: set 1 bit starting at bit offset 4 to value 1) - * xMBUtilSetBits( ucBits, 4, 1, 1 ); - * - * // Set bit 7 to 1 and bit 8 to 0. - * xMBUtilSetBits( ucBits, 7, 2, 0x01 ); - * - * // Set bits 8 - 11 to 0x05 and bits 12 - 15 to 0x0A; - * xMBUtilSetBits( ucBits, 8, 8, 0x5A); - * \endcode - */ -void xMBUtilSetBits( UCHAR * ucByteBuf, USHORT usBitOffset, - UCHAR ucNBits, UCHAR ucValues ); - -/*! \brief Function to read bits in a byte buffer. - * - * This function is used to extract up bit values from an array. Up to eight - * bit values can be extracted in one step. - * - * \param ucByteBuf A buffer where the bit values are stored. - * \param usBitOffset The starting address of the bits to set. The first - * bit has the offset 0. - * \param ucNBits Number of bits to modify. The value must always be smaller - * than 8. - * - * \code - * UCHAR ucBits[2] = {0, 0}; - * UCHAR ucResult; - * - * // Extract the bits 3 - 10. - * ucResult = xMBUtilGetBits( ucBits, 3, 8 ); - * \endcode - */ -UCHAR xMBUtilGetBits( UCHAR * ucByteBuf, USHORT usBitOffset, - UCHAR ucNBits ); - -/*! @} */ - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/mb.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/mb.c deleted file mode 100755 index daf9ac0..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/mb.c +++ /dev/null @@ -1,441 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mb.c,v 1.28 2010/06/06 13:54:40 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbconfig.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbfunc.h" -#include "mbport.h" - -#if MB_SLAVE_RTU_ENABLED -#include "mbrtu.h" -#endif -#if MB_SLAVE_ASCII_ENABLED -#include "mbascii.h" -#endif -#if MB_TCP_ENABLED -#include "mbtcp.h" -#endif - -#ifndef MB_PORT_HAS_CLOSE -#define MB_PORT_HAS_CLOSE 1 -#endif - -/* ----------------------- Static variables ---------------------------------*/ - -static UCHAR ucMBAddress; -static eMBMode eMBCurrentMode; - -volatile UCHAR ucMbSlaveBuf[MB_SERIAL_BUF_SIZE]; - -static enum -{ - STATE_ENABLED, - STATE_DISABLED, - STATE_NOT_INITIALIZED -} eMBState = STATE_NOT_INITIALIZED; - -/* Functions pointer which are initialized in eMBInit( ). Depending on the - * mode (RTU or ASCII) the are set to the correct implementations. - */ -static peMBFrameSend peMBFrameSendCur; -static pvMBFrameStart pvMBFrameStartCur; -static pvMBFrameStop pvMBFrameStopCur; -static peMBFrameReceive peMBFrameReceiveCur; -static pvMBFrameClose pvMBFrameCloseCur; - -/* Callback functions required by the porting layer. They are called when - * an external event has happend which includes a timeout or the reception - * or transmission of a character. - */ -BOOL( *pxMBFrameCBByteReceived ) ( void ); -BOOL( *pxMBFrameCBTransmitterEmpty ) ( void ); -BOOL( *pxMBPortCBTimerExpired ) ( void ); -BOOL( *pxMBFrameCBReceiveFSMCur ) ( void ); -BOOL( *pxMBFrameCBTransmitFSMCur ) ( void ); - -/* An array of Modbus functions handlers which associates Modbus function - * codes with implementing functions. - */ -static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX] = { -#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0 - {MB_FUNC_OTHER_REPORT_SLAVEID, eMBFuncReportSlaveID}, -#endif -#if MB_FUNC_READ_INPUT_ENABLED > 0 - {MB_FUNC_READ_INPUT_REGISTER, eMBFuncReadInputRegister}, -#endif -#if MB_FUNC_READ_HOLDING_ENABLED > 0 - {MB_FUNC_READ_HOLDING_REGISTER, eMBFuncReadHoldingRegister}, -#endif -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 - {MB_FUNC_WRITE_MULTIPLE_REGISTERS, eMBFuncWriteMultipleHoldingRegister}, -#endif -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 - {MB_FUNC_WRITE_REGISTER, eMBFuncWriteHoldingRegister}, -#endif -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 - {MB_FUNC_READWRITE_MULTIPLE_REGISTERS, eMBFuncReadWriteMultipleHoldingRegister}, -#endif -#if MB_FUNC_READ_COILS_ENABLED > 0 - {MB_FUNC_READ_COILS, eMBFuncReadCoils}, -#endif -#if MB_FUNC_WRITE_COIL_ENABLED > 0 - {MB_FUNC_WRITE_SINGLE_COIL, eMBFuncWriteCoil}, -#endif -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 - {MB_FUNC_WRITE_MULTIPLE_COILS, eMBFuncWriteMultipleCoils}, -#endif -#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 - {MB_FUNC_READ_DISCRETE_INPUTS, eMBFuncReadDiscreteInputs}, -#endif -}; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - /* check preconditions */ - if( ( ucSlaveAddress == MB_ADDRESS_BROADCAST ) || - ( ucSlaveAddress < MB_ADDRESS_MIN ) || ( ucSlaveAddress > MB_ADDRESS_MAX ) ) - { - eStatus = MB_EINVAL; - } - else - { - ucMBAddress = ucSlaveAddress; - - switch ( eMode ) - { -#if MB_SLAVE_RTU_ENABLED > 0 - case MB_RTU: - pvMBFrameStartCur = eMBRTUStart; - pvMBFrameStopCur = eMBRTUStop; - peMBFrameSendCur = eMBRTUSend; - peMBFrameReceiveCur = eMBRTUReceive; - pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; - pxMBFrameCBByteReceived = xMBRTUReceiveFSM; - pxMBFrameCBTransmitterEmpty = xMBRTUTransmitFSM; - pxMBPortCBTimerExpired = xMBRTUTimerT35Expired; - - eStatus = eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity ); - break; -#endif -#if MB_SLAVE_ASCII_ENABLED > 0 - case MB_ASCII: - pvMBFrameStartCur = eMBASCIIStart; - pvMBFrameStopCur = eMBASCIIStop; - peMBFrameSendCur = eMBASCIISend; - peMBFrameReceiveCur = eMBASCIIReceive; - pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; - pxMBFrameCBByteReceived = xMBASCIIReceiveFSM; - pxMBFrameCBTransmitterEmpty = xMBASCIITransmitFSM; - pxMBPortCBTimerExpired = xMBASCIITimerT1SExpired; - - eStatus = eMBASCIIInit( ucMBAddress, ucPort, ulBaudRate, eParity ); - break; -#endif - default: - eStatus = MB_EINVAL; - } - - if( eStatus == MB_ENOERR ) - { - if( !xMBPortEventInit( ) ) - { - /* port dependent event module initalization failed. */ - eStatus = MB_EPORTERR; - } - else - { - eMBCurrentMode = eMode; - eMBState = STATE_DISABLED; - } - } - } - return eStatus; -} - -#if MB_TCP_ENABLED > 0 -eMBErrorCode -eMBTCPInit( UCHAR ucSlaveUid, USHORT ucTCPPort ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - /* Check preconditions */ - if( ucSlaveUid > MB_ADDRESS_MAX ) - { - eStatus = MB_EINVAL; - } - else if( ( eStatus = eMBTCPDoInit( ucTCPPort ) ) != MB_ENOERR ) - { - eMBState = STATE_DISABLED; - } - else if( !xMBPortEventInit( ) ) - { - /* Port dependent event module initalization failed. */ - eStatus = MB_EPORTERR; - } - else - { - pvMBFrameStartCur = eMBTCPStart; - pvMBFrameStopCur = eMBTCPStop; - peMBFrameReceiveCur = eMBTCPReceive; - peMBFrameSendCur = eMBTCPSend; - pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBTCPPortClose : NULL; - ucMBAddress = ucSlaveUid; - eMBCurrentMode = MB_TCP; - eMBState = STATE_DISABLED; - } - return eStatus; -} -#endif - -eMBErrorCode -eMBRegisterCB( UCHAR ucFunctionCode, pxMBFunctionHandler pxHandler ) -{ - int i; - eMBErrorCode eStatus; - - if( ( 0 < ucFunctionCode ) && ( ucFunctionCode <= MB_FUNC_CODE_MAX ) ) - { - ENTER_CRITICAL_SECTION( ); - if( pxHandler != NULL ) - { - for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - if( ( xFuncHandlers[i].pxHandler == NULL ) || - ( xFuncHandlers[i].pxHandler == pxHandler ) ) - { - xFuncHandlers[i].ucFunctionCode = ucFunctionCode; - xFuncHandlers[i].pxHandler = pxHandler; - break; - } - } - eStatus = ( i != MB_FUNC_HANDLERS_MAX ) ? MB_ENOERR : MB_ENORES; - } - else - { - for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) - { - xFuncHandlers[i].ucFunctionCode = 0; - xFuncHandlers[i].pxHandler = NULL; - break; - } - } - /* Remove can't fail. */ - eStatus = MB_ENOERR; - } - EXIT_CRITICAL_SECTION( ); - } - else - { - eStatus = MB_EINVAL; - } - return eStatus; -} - - -eMBErrorCode -eMBClose( void ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( eMBState == STATE_DISABLED ) - { - if( pvMBFrameCloseCur != NULL ) - { - pvMBFrameCloseCur( ); - } - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBEnable( void ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( eMBState == STATE_DISABLED ) - { - /* Activate the protocol stack. */ - pvMBFrameStartCur( ); - eMBState = STATE_ENABLED; - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBDisable( void ) -{ - eMBErrorCode eStatus; - - if( eMBState == STATE_ENABLED ) - { - pvMBFrameStopCur( ); - eMBState = STATE_DISABLED; - eStatus = MB_ENOERR; - } - else if( eMBState == STATE_DISABLED ) - { - eStatus = MB_ENOERR; - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBPoll( void ) -{ - static UCHAR *ucMBFrame = NULL; - static UCHAR ucRcvAddress; - static UCHAR ucFunctionCode; - static USHORT usLength; - static eMBException eException; - - int i; - eMBErrorCode eStatus = MB_ENOERR; - eMBEventType eEvent; - - /* Check if the protocol stack is ready. */ - if( eMBState != STATE_ENABLED ) - { - return MB_EILLSTATE; - } - - /* Check if there is a event available. If not return control to caller. - * Otherwise we will handle the event. */ - if( xMBPortEventGet( &eEvent ) == TRUE ) - { - switch ( eEvent ) - { - case EV_READY: - ESP_LOGD(MB_PORT_TAG, "%s:EV_READY", __func__); - break; - - case EV_FRAME_RECEIVED: - ESP_LOGD(MB_PORT_TAG, "EV_FRAME_RECEIVED"); - eStatus = peMBFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength ); - if( eStatus == MB_ENOERR ) - { - /* Check if the frame is for us. If not ignore the frame. */ - if( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) - || ( ucRcvAddress == MB_TCP_PSEUDO_ADDRESS ) ) - { - ( void )xMBPortEventPost( EV_EXECUTE ); - ESP_LOG_BUFFER_HEX_LEVEL(MB_PORT_TAG, &ucMBFrame[MB_PDU_FUNC_OFF], usLength, ESP_LOG_DEBUG); - } - } - break; - - case EV_EXECUTE: - if ( !ucMBFrame ) { - return MB_EILLSTATE; - } - ESP_LOGD(MB_PORT_TAG, "%s:EV_EXECUTE", __func__); - ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF]; - eException = MB_EX_ILLEGAL_FUNCTION; - for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - /* No more function handlers registered. Abort. */ - if( xFuncHandlers[i].ucFunctionCode == 0 ) - { - break; - } - if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) - { - eException = xFuncHandlers[i].pxHandler( ucMBFrame, &usLength ); - break; - } - } - - /* If the request was not sent to the broadcast address we - * return a reply. In case of TCP the slave answers to broadcast address. */ - if( ( ucRcvAddress != MB_ADDRESS_BROADCAST ) || ( eMBCurrentMode == MB_TCP ) ) - { - if( eException != MB_EX_NONE ) - { - /* An exception occurred. Build an error frame. */ - usLength = 0; - ucMBFrame[usLength++] = ( UCHAR )( ucFunctionCode | MB_FUNC_ERROR ); - ucMBFrame[usLength++] = eException; - } - if( ( eMBCurrentMode == MB_ASCII ) && MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ) - { - vMBPortTimersDelay( MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS ); - } - eStatus = peMBFrameSendCur( ucMBAddress, ucMBFrame, usLength ); - } - break; - - case EV_FRAME_TRANSMIT: - ESP_LOGD(MB_PORT_TAG, "%s:EV_FRAME_TRANSMIT", __func__); - break; - - case EV_FRAME_SENT: - ESP_LOGD(MB_PORT_TAG, "%s:EV_FRAME_SENT", __func__); - break; - - default: - break; - } - } - return eStatus; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/mb_m.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/mb_m.c deleted file mode 100755 index 573dfd7..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/mb_m.c +++ /dev/null @@ -1,641 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbrtu_m.c,v 1.60 2013/08/20 11:18:10 Armink Add Master Functions $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include -#include -#include - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb_m.h" -#include "mbconfig.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbfunc.h" - -#include "mbport.h" -#if MB_MASTER_RTU_ENABLED -#include "mbrtu.h" -#endif -#if MB_MASTER_ASCII_ENABLED -#include "mbascii.h" -#endif -#if MB_MASTER_TCP_ENABLED -#include "mbtcp.h" -#include "mbtcp_m.h" -#endif - -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED - -#ifndef MB_PORT_HAS_CLOSE -#define MB_PORT_HAS_CLOSE 1 -#endif - -/*------------------------ Shared variables ---------------------------------*/ - -_lock_t xMBMLock; // base modbus object lock -volatile UCHAR ucMasterSndBuf[MB_SERIAL_BUF_SIZE]; -volatile UCHAR ucMasterRcvBuf[MB_SERIAL_BUF_SIZE]; - -static _Atomic USHORT usMasterSendPDULength = 0; -static _Atomic eMBMasterErrorEventType eMBMasterCurErrorType = EV_ERROR_INIT; -static _Atomic BOOL xMBRunInMasterMode = FALSE; -static _Atomic UCHAR ucMBMasterDestAddress = 0; -static _Atomic BOOL xFrameIsBroadcast = FALSE; - -static _Atomic eMBMasterTimerMode eMasterCurTimerMode; - -/* ----------------------- Static variables ---------------------------------*/ -static uint64_t xCurTransactionId = 0; -static UCHAR *pucMBSendFrame = NULL; -static UCHAR *pucMBRecvFrame = NULL; -static UCHAR ucRecvAddress = 0; -static eMBMode eMBMasterCurrentMode; - -/* The transaction information structure which keep last processing state */ -static TransactionInfo_t xTransactionInfo = {0}; - -static enum -{ - STATE_ENABLED, - STATE_DISABLED, - STATE_NOT_INITIALIZED -} eMBState = STATE_NOT_INITIALIZED; - -/* Functions pointer which are initialized in eMBInit( ). Depending on the - * mode (RTU or ASCII) the are set to the correct implementations. - * Using for Modbus Master,Add by Armink 20130813 - */ -static peMBFrameSend peMBMasterFrameSendCur; -static pvMBFrameStart pvMBMasterFrameStartCur; -static pvMBFrameStop pvMBMasterFrameStopCur; -static peMBFrameReceive peMBMasterFrameReceiveCur; -static pvMBFrameClose pvMBMasterFrameCloseCur; - -/* Callback functions required by the porting layer. They are called when - * an external event has happend which includes a timeout or the reception - * or transmission of a character. - * Using for Modbus Master,Add by Armink 20130813 - */ -BOOL( *pxMBMasterFrameCBByteReceived ) ( void ); - -BOOL( *pxMBMasterFrameCBTransmitterEmpty ) ( void ); - -BOOL( *pxMBMasterPortCBTimerExpired ) ( void ); - -BOOL( *pxMBMasterFrameCBReceiveFSMCur ) ( void ); - -BOOL( *pxMBMasterFrameCBTransmitFSMCur ) ( void ); - -/* An array of Modbus functions handlers which associates Modbus function - * codes with implementing functions. - */ -static xMBFunctionHandler xMasterFuncHandlers[MB_FUNC_HANDLERS_MAX] = { -#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0 - {MB_FUNC_OTHER_REPORT_SLAVEID, eMBFuncReportSlaveID}, -#endif -#if MB_FUNC_READ_INPUT_ENABLED > 0 - {MB_FUNC_READ_INPUT_REGISTER, eMBMasterFuncReadInputRegister}, -#endif -#if MB_FUNC_READ_HOLDING_ENABLED > 0 - {MB_FUNC_READ_HOLDING_REGISTER, eMBMasterFuncReadHoldingRegister}, -#endif -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 - {MB_FUNC_WRITE_MULTIPLE_REGISTERS, eMBMasterFuncWriteMultipleHoldingRegister}, -#endif -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 - {MB_FUNC_WRITE_REGISTER, eMBMasterFuncWriteHoldingRegister}, -#endif -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 - {MB_FUNC_READWRITE_MULTIPLE_REGISTERS, eMBMasterFuncReadWriteMultipleHoldingRegister}, -#endif -#if MB_FUNC_READ_COILS_ENABLED > 0 - {MB_FUNC_READ_COILS, eMBMasterFuncReadCoils}, -#endif -#if MB_FUNC_WRITE_COIL_ENABLED > 0 - {MB_FUNC_WRITE_SINGLE_COIL, eMBMasterFuncWriteCoil}, -#endif -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 - {MB_FUNC_WRITE_MULTIPLE_COILS, eMBMasterFuncWriteMultipleCoils}, -#endif -#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 - {MB_FUNC_READ_DISCRETE_INPUTS, eMBMasterFuncReadDiscreteInputs}, -#endif -}; - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_MASTER_TCP_ENABLED -eMBErrorCode -eMBMasterTCPInit( USHORT ucTCPPort ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( ( eStatus = eMBMasterTCPDoInit( ucTCPPort ) ) != MB_ENOERR ) { - eMBState = STATE_DISABLED; - } - else if( !xMBMasterPortEventInit( ) ) { - /* Port dependent event module initialization failed. */ - eStatus = MB_EPORTERR; - } else { - pvMBMasterFrameStartCur = eMBMasterTCPStart; - pvMBMasterFrameStopCur = eMBMasterTCPStop; - peMBMasterFrameReceiveCur = eMBMasterTCPReceive; - peMBMasterFrameSendCur = eMBMasterTCPSend; - pxMBMasterPortCBTimerExpired = xMBMasterTCPTimerExpired; - pvMBMasterFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBMasterTCPPortClose : NULL; - eMBMasterCurrentMode = MB_TCP; - eMBState = STATE_DISABLED; - ucRecvAddress = MB_TCP_PSEUDO_ADDRESS; - xCurTransactionId = 0; - xTransactionInfo.xTransId = 0; - xTransactionInfo.ucDestAddr = 0; - xTransactionInfo.ucFuncCode = 0; - xTransactionInfo.eException = MB_EX_NONE; - xTransactionInfo.ucFrameError = 0; - - /* initialize the state values. */ - atomic_init(&usMasterSendPDULength, 0); - atomic_init(&eMBMasterCurErrorType, EV_ERROR_INIT); - atomic_init(&xMBRunInMasterMode, FALSE); - atomic_init(&ucMBMasterDestAddress, MB_TCP_PSEUDO_ADDRESS); - - // initialize the OS resource for modbus master. - vMBMasterOsResInit(); - if (xMBMasterPortTimersInit(MB_MASTER_TIMEOUT_MS_RESPOND * MB_TIMER_TICS_PER_MS) != TRUE) - { - eStatus = MB_EPORTERR; - } - - } - return eStatus; -} -#endif - -eMBErrorCode -eMBMasterSerialInit( eMBMode eMode, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - switch (eMode) - { -#if MB_MASTER_RTU_ENABLED > 0 - case MB_RTU: - pvMBMasterFrameStartCur = eMBMasterRTUStart; - pvMBMasterFrameStopCur = eMBMasterRTUStop; - peMBMasterFrameSendCur = eMBMasterRTUSend; - peMBMasterFrameReceiveCur = eMBMasterRTUReceive; - pvMBMasterFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBMasterPortClose : NULL; - pxMBMasterFrameCBByteReceived = xMBMasterRTUReceiveFSM; - pxMBMasterFrameCBTransmitterEmpty = xMBMasterRTUTransmitFSM; - pxMBMasterPortCBTimerExpired = xMBMasterRTUTimerExpired; - eMBMasterCurrentMode = eMode; - - eStatus = eMBMasterRTUInit(ucPort, ulBaudRate, eParity); - break; -#endif -#if MB_MASTER_ASCII_ENABLED > 0 - case MB_ASCII: - pvMBMasterFrameStartCur = eMBMasterASCIIStart; - pvMBMasterFrameStopCur = eMBMasterASCIIStop; - peMBMasterFrameSendCur = eMBMasterASCIISend; - peMBMasterFrameReceiveCur = eMBMasterASCIIReceive; - pvMBMasterFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBMasterPortClose : NULL; - pxMBMasterFrameCBByteReceived = xMBMasterASCIIReceiveFSM; - pxMBMasterFrameCBTransmitterEmpty = xMBMasterASCIITransmitFSM; - pxMBMasterPortCBTimerExpired = xMBMasterASCIITimerT1SExpired; - eMBMasterCurrentMode = eMode; - - eStatus = eMBMasterASCIIInit(ucPort, ulBaudRate, eParity ); - break; -#endif - default: - eStatus = MB_EINVAL; - break; - } - - if (eStatus == MB_ENOERR) - { - if (!xMBMasterPortEventInit()) - { - /* port dependent event module initalization failed. */ - eStatus = MB_EPORTERR; - } - else - { - eMBState = STATE_DISABLED; - ucRecvAddress = 0; - xCurTransactionId = 0; - xTransactionInfo.xTransId = 0; - xTransactionInfo.ucDestAddr = 0; - xTransactionInfo.ucFuncCode = 0; - xTransactionInfo.eException = MB_EX_NONE; - xTransactionInfo.ucFrameError = 0; - - /* initialize the state values. */ - atomic_init(&usMasterSendPDULength, 0); - atomic_init(&eMBMasterCurErrorType, EV_ERROR_INIT); - atomic_init(&xMBRunInMasterMode, FALSE); - atomic_init(&ucMBMasterDestAddress, 0); - } - /* initialize the OS resource for modbus master. */ - vMBMasterOsResInit(); - } - return eStatus; -} - -eMBErrorCode -eMBMasterClose( void ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( eMBState == STATE_DISABLED ) - { - if( pvMBMasterFrameCloseCur != NULL ) - { - pvMBMasterFrameCloseCur( ); - } - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBMasterEnable( void ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( eMBState == STATE_DISABLED ) - { - /* Activate the protocol stack. */ - pvMBMasterFrameStartCur( ); - /* Release the resource, because it created in busy state */ - //vMBMasterRunResRelease( ); - eMBState = STATE_ENABLED; - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBMasterDisable( void ) -{ - eMBErrorCode eStatus; - - if( eMBState == STATE_ENABLED ) - { - pvMBMasterFrameStopCur( ); - eMBState = STATE_DISABLED; - eStatus = MB_ENOERR; - } - else if( eMBState == STATE_DISABLED ) - { - eStatus = MB_ENOERR; - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBMasterPoll( void ) -{ - int i; - int j; - eMBErrorCode eStatus = MB_ENOERR; - xMBMasterEventType xEvent; - eMBMasterErrorEventType errorType = EV_ERROR_INIT; - static eMBException eException = MB_EX_NONE; - static UCHAR ucFunctionCode = 0; - static USHORT usRecvLength = 0; - - /* Check if the protocol stack is ready. */ - if( eMBState != STATE_ENABLED ) { - return MB_EILLSTATE; - } - - /* Check if there is a event available. If not return control to caller. - * Otherwise we will handle the event. */ - if ( xMBMasterPortEventGet( &xEvent ) == TRUE ) { - switch( xEvent.eEvent ) { - // In some cases it is possible that more than one event set - // together (even from one subset mask) than process them consistently - case EV_MASTER_READY: - ESP_LOGD(MB_PORT_TAG, "%" PRIu64 ":EV_MASTER_READY", xEvent.xTransactionId); - vMBMasterSetErrorType( EV_ERROR_INIT ); - vMBMasterRunResRelease( ); - break; - case EV_MASTER_FRAME_TRANSMIT: - ESP_LOGD(MB_PORT_TAG, "%" PRIu64 ":EV_MASTER_FRAME_TRANSMIT", xEvent.xTransactionId); - /* Master is busy now. */ - vMBMasterGetPDUSndBuf( &pucMBSendFrame ); - ESP_LOG_BUFFER_HEX_LEVEL("POLL transmit buffer", (void*)pucMBSendFrame, usMBMasterGetPDUSndLength(), ESP_LOG_DEBUG); - eStatus = peMBMasterFrameSendCur( ucMBMasterGetDestAddress(), pucMBSendFrame, usMBMasterGetPDUSndLength() ); - if (eStatus != MB_ENOERR) { - vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); - ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); - ESP_LOGE( MB_PORT_TAG, "%" PRIu64 ":Frame send error = %d", xEvent.xTransactionId, (unsigned)eStatus ); - } - xCurTransactionId = xEvent.xTransactionId; - break; - case EV_MASTER_FRAME_SENT: - if (xCurTransactionId == xEvent.xTransactionId) { - ESP_LOGD( MB_PORT_TAG, "%" PRIu64 ":EV_MASTER_FRAME_SENT", xEvent.xTransactionId ); - ESP_LOG_BUFFER_HEX_LEVEL("POLL sent buffer", (void*)pucMBSendFrame, usMBMasterGetPDUSndLength(), ESP_LOG_DEBUG); - } - break; - case EV_MASTER_FRAME_RECEIVED: - ESP_LOGD( MB_PORT_TAG, "%" PRIu64 ":EV_MASTER_FRAME_RECEIVED", xEvent.xTransactionId ); - eStatus = peMBMasterFrameReceiveCur( &ucRecvAddress, &pucMBRecvFrame, &usRecvLength); - if (xCurTransactionId == xEvent.xTransactionId) { - MB_PORT_CHECK(pucMBSendFrame, MB_EILLSTATE, "Send buffer initialization fail."); - // Check if the frame is for us. If not ,send an error process event. - if ( ( eStatus == MB_ENOERR ) && ( ( ucRecvAddress == ucMBMasterGetDestAddress() ) - || ( ucRecvAddress == MB_TCP_PSEUDO_ADDRESS) ) ) { - if ( ( pucMBRecvFrame[MB_PDU_FUNC_OFF] & ~MB_FUNC_ERROR ) == ( pucMBSendFrame[MB_PDU_FUNC_OFF] ) ) { - ESP_LOGD(MB_PORT_TAG, "%" PRIu64 ": Packet data received successfully (%u).", xEvent.xTransactionId, (unsigned)eStatus); - ESP_LOG_BUFFER_HEX_LEVEL("POLL receive buffer", (void*)pucMBRecvFrame, (uint16_t)usRecvLength, ESP_LOG_DEBUG); - ( void ) xMBMasterPortEventPost( EV_MASTER_EXECUTE ); - } else { - ESP_LOGE( MB_PORT_TAG, "Drop incorrect frame, receive_func(%u) != send_func(%u)", - pucMBRecvFrame[MB_PDU_FUNC_OFF], pucMBSendFrame[MB_PDU_FUNC_OFF]); - vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); - ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); - } - } else { - vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); - ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); - ESP_LOGD( MB_PORT_TAG, "%" PRIu64 ": Packet data receive failed (addr=%u)(%u).", - xEvent.xTransactionId, (unsigned)ucRecvAddress, (unsigned)eStatus); - } - } else { - // Ignore the `EV_MASTER_FRAME_RECEIVED` event because the respond timeout occurred - // and this is likely respond to previous transaction - ESP_LOGE( MB_PORT_TAG, "Drop data received outside of transaction (%" PRIu64 ")", xEvent.xTransactionId ); - } - break; - case EV_MASTER_EXECUTE: - if (xCurTransactionId == xEvent.xTransactionId) { - if ( xMBMasterRequestIsBroadcast() - && (( ucMBMasterGetCommMode() == MB_RTU ) || ( ucMBMasterGetCommMode() == MB_ASCII ) ) ) { - pucMBRecvFrame = pucMBSendFrame; - } - MB_PORT_CHECK(pucMBRecvFrame, MB_EILLSTATE, "receive buffer initialization fail."); - ESP_LOGD(MB_PORT_TAG, "%" PRIu64 ":EV_MASTER_EXECUTE", xEvent.xTransactionId); - ucFunctionCode = pucMBRecvFrame[MB_PDU_FUNC_OFF]; - eException = MB_EX_ILLEGAL_FUNCTION; - /* If receive frame has exception. The receive function code highest bit is 1.*/ - if (ucFunctionCode & MB_FUNC_ERROR) { - eException = (eMBException)pucMBRecvFrame[MB_PDU_DATA_OFF]; - } else { - for ( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - /* No more function handlers registered. Abort. */ - if (xMasterFuncHandlers[i].ucFunctionCode == 0) { - break; - } - if (xMasterFuncHandlers[i].ucFunctionCode == ucFunctionCode) { - vMBMasterSetCBRunInMasterMode(TRUE); - /* If master request is broadcast, - * the master need execute function for all slave. - */ - if ( xMBMasterRequestIsBroadcast() ) { - USHORT usLength = usMBMasterGetPDUSndLength(); - for(j = 1; j <= MB_MASTER_TOTAL_SLAVE_NUM; j++) - { - vMBMasterSetDestAddress(j); - eException = xMasterFuncHandlers[i].pxHandler(pucMBRecvFrame, &usLength); - } - } else { - eException = xMasterFuncHandlers[i].pxHandler(pucMBRecvFrame, &usRecvLength); - } - vMBMasterSetCBRunInMasterMode( FALSE ); - break; - } - } - } - /* If master has exception, will send error process event. Otherwise the master is idle.*/ - if ( eException != MB_EX_NONE ) { - vMBMasterSetErrorType( EV_ERROR_EXECUTE_FUNCTION ); - ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); - } else { - if ( eMBMasterGetErrorType( ) == EV_ERROR_INIT ) { - vMBMasterSetErrorType(EV_ERROR_OK); - ESP_LOGD( MB_PORT_TAG, "%" PRIu64 ":set event EV_ERROR_OK", xEvent.xTransactionId ); - ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); - } - } - } else { - ESP_LOGD( MB_PORT_TAG, "%" PRIu64 ":EV_MASTER_EXECUTE is expired", xEvent.xTransactionId ); - } - break; - case EV_MASTER_ERROR_PROCESS: - if (xCurTransactionId == xEvent.xTransactionId) { - ESP_LOGD( MB_PORT_TAG, "%" PRIu64 ":EV_MASTER_ERROR_PROCESS", xEvent.xTransactionId); - /* Execute specified error process callback function. */ - errorType = eMBMasterGetErrorType( ); - vMBMasterGetPDUSndBuf( &pucMBSendFrame ); - switch ( errorType ) - { - case EV_ERROR_RESPOND_TIMEOUT: - vMBMasterErrorCBRespondTimeout( xEvent.xTransactionId, - ucMBMasterGetDestAddress( ), - pucMBSendFrame, usMBMasterGetPDUSndLength( ) ); - break; - case EV_ERROR_RECEIVE_DATA: - vMBMasterErrorCBReceiveData( xEvent.xTransactionId, - ucMBMasterGetDestAddress( ), - pucMBRecvFrame, usRecvLength, - pucMBSendFrame, usMBMasterGetPDUSndLength( ) ); - break; - case EV_ERROR_EXECUTE_FUNCTION: - vMBMasterErrorCBExecuteFunction( xEvent.xTransactionId, - ucMBMasterGetDestAddress( ), - pucMBRecvFrame, usRecvLength, - pucMBSendFrame, usMBMasterGetPDUSndLength( ) ); - break; - case EV_ERROR_OK: - vMBMasterCBRequestSuccess( xEvent.xTransactionId, - ucMBMasterGetDestAddress( ), - pucMBRecvFrame, usRecvLength, - pucMBSendFrame, usMBMasterGetPDUSndLength( ) ); - break; - default: - ESP_LOGE( MB_PORT_TAG, "%" PRIu64 ":incorrect error type = %d.", xEvent.xTransactionId, (int)errorType); - break; - } - } - vMBMasterPortTimersDisable( ); - uint64_t xProcTime = xCurTransactionId ? ( xEvent.xPostTimestamp - xCurTransactionId ) : 0; - ESP_LOGD( MB_PORT_TAG, "Transaction (%" PRIu64 "), processing time(us) = %" PRId64, xCurTransactionId, xProcTime ); - MB_ATOMIC_SECTION { - xTransactionInfo.xTransId = xCurTransactionId; - xTransactionInfo.ucDestAddr = ucMBMasterGetDestAddress(); - xTransactionInfo.ucFuncCode = ucFunctionCode; - xTransactionInfo.eException = eException; - xTransactionInfo.ucFrameError = errorType; - } - xCurTransactionId = 0; - vMBMasterSetErrorType( EV_ERROR_INIT ); - vMBMasterRunResRelease( ); - break; - default: - ESP_LOGE( MB_PORT_TAG, "%" PRIu64 ":Unexpected event triggered 0x%02x.", xEvent.xTransactionId, (int)xEvent.eEvent ); - break; - } - } else { - // Something went wrong and task unblocked but there are no any correct events set - ESP_LOGE( MB_PORT_TAG, "%" PRIu64 ": Unexpected event triggered 0x%02x.", xEvent.xTransactionId, (int)xEvent.eEvent ); - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -// Get whether the Modbus Master is run in master mode. -BOOL xMBMasterGetCBRunInMasterMode( void ) -{ - return atomic_load(&xMBRunInMasterMode); -} - -// Set whether the Modbus Master is run in master mode. -void vMBMasterSetCBRunInMasterMode( BOOL IsMasterMode ) -{ - atomic_store(&xMBRunInMasterMode, IsMasterMode); -} - -// Get Modbus Master send destination address. -UCHAR ucMBMasterGetDestAddress( void ) -{ - return atomic_load(&ucMBMasterDestAddress); -} - -// Set Modbus Master send destination address. -void vMBMasterSetDestAddress( UCHAR Address ) -{ - atomic_store(&ucMBMasterDestAddress, Address); -} - -// Get Modbus Master current error event type. -eMBMasterErrorEventType inline eMBMasterGetErrorType( void ) -{ - return atomic_load(&eMBMasterCurErrorType); -} - -// Set Modbus Master current error event type. -void IRAM_ATTR vMBMasterSetErrorType( eMBMasterErrorEventType errorType ) -{ - atomic_store(&eMBMasterCurErrorType, errorType); -} - -/* Get Modbus Master send PDU's buffer address pointer.*/ -void vMBMasterGetPDUSndBuf( UCHAR ** pucFrame ) -{ - *pucFrame = ( UCHAR * ) &ucMasterSndBuf[MB_SEND_BUF_PDU_OFF]; -} - -/* Set Modbus Master send PDU's buffer length.*/ -void vMBMasterSetPDUSndLength( USHORT SendPDULength ) -{ - atomic_store(&usMasterSendPDULength, SendPDULength); -} - -/* Get Modbus Master send PDU's buffer length.*/ -USHORT usMBMasterGetPDUSndLength( void ) -{ - return atomic_load(&usMasterSendPDULength); -} - -/* Set Modbus Master current timer mode.*/ -void vMBMasterSetCurTimerMode( eMBMasterTimerMode eMBTimerMode ) -{ - atomic_store(&eMasterCurTimerMode, eMBTimerMode); -} - -/* Get Modbus Master current timer mode.*/ -eMBMasterTimerMode MB_PORT_ISR_ATTR xMBMasterGetCurTimerMode( void ) -{ - return atomic_load(&eMasterCurTimerMode); -} - -/* The master request is broadcast? */ -BOOL MB_PORT_ISR_ATTR xMBMasterRequestIsBroadcast( void ) -{ - return atomic_load(&xFrameIsBroadcast); -} - -/* The master request is broadcast? */ -void vMBMasterRequestSetType( BOOL xIsBroadcast ) -{ - atomic_store(&xFrameIsBroadcast, xIsBroadcast); -} - -// Get Modbus Master communication mode. -eMBMode ucMBMasterGetCommMode(void) -{ - return eMBMasterCurrentMode; -} - -/* Get current transaction information */ -BOOL xMBMasterGetLastTransactionInfo( uint64_t *pxTransId, UCHAR *pucDestAddress, - UCHAR *pucFunctionCode, UCHAR *pucException, - USHORT *pusErrorType ) -{ - BOOL xState = (eMBState == STATE_ENABLED); - if (xState && pxTransId && pucDestAddress && pucFunctionCode - && pucException && pusErrorType) { - MB_ATOMIC_SECTION { - *pxTransId = xTransactionInfo.xTransId; - *pucDestAddress = xTransactionInfo.ucDestAddr; - *pucFunctionCode = xTransactionInfo.ucFuncCode; - *pucException = xTransactionInfo.eException; - *pusErrorType = xTransactionInfo.ucFrameError; - } - } - return xState; -} - -#endif // MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbcrc.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbcrc.c deleted file mode 100755 index f413453..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbcrc.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbcrc.c,v 1.7 2007/02/18 23:50:27 wolti Exp $ - */ - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" -#include "mbconfig.h" - -#if (MB_MASTER_RTU_ENABLED || MB_SLAVE_RTU_ENABLED || CONFIG_MB_UTEST) - -static const UCHAR aucCRCHi[] = { - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40 -}; - -static const UCHAR aucCRCLo[] = { - 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, - 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, - 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, - 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, - 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, - 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, - 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, - 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, - 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, - 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, - 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, - 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, - 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, - 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, - 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, - 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, - 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, - 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, - 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, - 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, - 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, - 0x41, 0x81, 0x80, 0x40 -}; - -USHORT -usMBCRC16( UCHAR * pucFrame, USHORT usLen ) -{ - UCHAR ucCRCHi = 0xFF; - UCHAR ucCRCLo = 0xFF; - int iIndex; - - while( usLen-- ) - { - iIndex = ucCRCLo ^ *( pucFrame++ ); - ucCRCLo = ( UCHAR )( ucCRCHi ^ aucCRCHi[iIndex] ); - ucCRCHi = aucCRCLo[iIndex]; - } - return ( USHORT )( ucCRCHi << 8 | ucCRCLo ); -} - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbcrc.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbcrc.h deleted file mode 100755 index d74d9eb..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbcrc.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbcrc.h,v 1.5 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_CRC_H -#define _MB_CRC_H - -USHORT usMBCRC16( UCHAR * pucFrame, USHORT usLen ); - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbrtu.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbrtu.c deleted file mode 100755 index 963fe7d..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbrtu.c +++ /dev/null @@ -1,372 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbrtu.c,v 1.18 2007/09/12 10:15:56 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbrtu.h" -#include "mbframe.h" - -#include "mbcrc.h" -#include "mbport.h" - -#if MB_SLAVE_RTU_ENABLED > 0 - -/* ----------------------- Type definitions ---------------------------------*/ -typedef enum -{ - STATE_RX_INIT, /*!< Receiver is in initial state. */ - STATE_RX_IDLE, /*!< Receiver is in idle state. */ - STATE_RX_RCV, /*!< Frame is beeing received. */ - STATE_RX_ERROR /*!< If the frame is invalid. */ -} eMBRcvState; - -typedef enum -{ - STATE_TX_IDLE, /*!< Transmitter is in idle state. */ - STATE_TX_XMIT /*!< Transmitter is in transfer state. */ -} eMBSndState; - -/* ----------------------- Shared variables ---------------------------------*/ -extern volatile UCHAR ucMbSlaveBuf[]; - -/* ----------------------- Static variables ---------------------------------*/ -static volatile eMBSndState eSndState; -static volatile eMBRcvState eRcvState; - -static volatile UCHAR *pucSndBufferCur; -static volatile USHORT usSndBufferCount; - -static volatile USHORT usRcvBufferPos; -static volatile UCHAR *ucRTUBuf = ucMbSlaveBuf; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - ULONG usTimerT35_50us; - - ( void )ucSlaveAddress; - ENTER_CRITICAL_SECTION( ); - - /* Modbus RTU uses 8 Databits. */ - if( xMBPortSerialInit( ucPort, ulBaudRate, 8, eParity ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - else - { - /* If baudrate > 19200 then we should use the fixed timer values - * t35 = 1750us. Otherwise t35 must be 3.5 times the character time. - */ - if( ulBaudRate > 19200 ) - { - usTimerT35_50us = 35; /* 1800us. */ - } - else - { - /* The timer reload value for a character is given by: - * - * ChTimeValue = Ticks_per_1s / ( Baudrate / 11 ) - * = 11 * Ticks_per_1s / Baudrate - * = 220000 / Baudrate - * The reload for t3.5 is 1.5 times this value and similary - * for t3.5. - */ - usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate ); - } - if( xMBPortTimersInit( ( USHORT ) usTimerT35_50us ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - } - EXIT_CRITICAL_SECTION( ); - - return eStatus; -} - -void -eMBRTUStart( void ) -{ - ENTER_CRITICAL_SECTION( ); - /* Initially the receiver is in the state STATE_RX_INIT. we start - * the timer and if no character is received within t3.5 we change - * to STATE_RX_IDLE. This makes sure that we delay startup of the - * modbus protocol stack until the bus is free. - */ - eRcvState = STATE_RX_INIT; - vMBPortSerialEnable( TRUE, FALSE ); -#if CONFIG_FMB_TIMER_PORT_ENABLED - vMBPortTimersEnable( ); -#else - pxMBPortCBTimerExpired(); -#endif - EXIT_CRITICAL_SECTION( ); -} - -void -eMBRTUStop( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBPortSerialEnable( FALSE, FALSE ); - vMBPortTimersDisable( ); - EXIT_CRITICAL_SECTION( ); -} - -eMBErrorCode -eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR *pucMBRTUFrame = ( UCHAR* ) ucRTUBuf; - USHORT usFrameLength = usRcvBufferPos; - - if( xMBPortSerialGetRequest( &pucMBRTUFrame, &usFrameLength ) == FALSE ) - { - return MB_EIO; - } - - ENTER_CRITICAL_SECTION( ); - assert( usFrameLength < MB_SER_PDU_SIZE_MAX ); - - /* Length and CRC check */ - if( ( usFrameLength >= MB_SER_PDU_SIZE_MIN ) - && ( usMBCRC16( ( UCHAR * ) pucMBRTUFrame, usFrameLength ) == 0 ) ) - { - /* Save the address field. All frames are passed to the upper layed - * and the decision if a frame is used is done there. - */ - *pucRcvAddress = pucMBRTUFrame[MB_SER_PDU_ADDR_OFF]; - - /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus - * size of address field and CRC checksum. - */ - *pusLength = ( USHORT )( usFrameLength - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC ); - - /* Return the start of the Modbus PDU to the caller. */ - *pucFrame = ( UCHAR * ) & pucMBRTUFrame[MB_SER_PDU_PDU_OFF]; - } - else - { - eStatus = MB_EIO; - } - - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -eMBErrorCode -eMBRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - USHORT usCRC16; - - /* Check if the receiver is still in idle state. If not we where to - * slow with processing the received frame and the master sent another - * frame on the network. We have to abort sending the frame. - */ - if( eRcvState == STATE_RX_IDLE ) - { - ENTER_CRITICAL_SECTION( ); - /* First byte before the Modbus-PDU is the slave address. */ - pucSndBufferCur = ( UCHAR * ) pucFrame - 1; - usSndBufferCount = 1; - - /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ - pucSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress; - usSndBufferCount += usLength; - - /* Calculate CRC16 checksum for Modbus-Serial-Line-PDU. */ - usCRC16 = usMBCRC16( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ); - ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 & 0xFF ); - ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 >> 8 ); - - /* Activate the transmitter. */ - eSndState = STATE_TX_XMIT; - EXIT_CRITICAL_SECTION( ); - - if( xMBPortSerialSendResponse( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ) == FALSE ) - { - eStatus = MB_EIO; - } - - vMBPortSerialEnable( FALSE, TRUE ); - } - else - { - eStatus = MB_EIO; - } - return eStatus; -} - -BOOL -xMBRTUReceiveFSM( void ) -{ - BOOL xStatus = FALSE; - UCHAR ucByte; - - assert( eSndState == STATE_TX_IDLE ); - - /* Always read the character. */ - xStatus = xMBPortSerialGetByte( ( CHAR * ) & ucByte ); - - switch ( eRcvState ) - { - /* If we have received a character in the init state we have to - * wait until the frame is finished. - */ - case STATE_RX_INIT: - vMBPortTimersEnable( ); - break; - - /* In the error state we wait until all characters in the - * damaged frame are transmitted. - */ - case STATE_RX_ERROR: - vMBPortTimersEnable( ); - break; - - /* In the idle state we wait for a new character. If a character - * is received the t1.5 and t3.5 timers are started and the - * receiver is in the state STATE_RX_RCV. - */ - case STATE_RX_IDLE: - usRcvBufferPos = 0; - ucRTUBuf[usRcvBufferPos++] = ucByte; - eRcvState = STATE_RX_RCV; - - /* Enable t3.5 timers. */ - vMBPortTimersEnable( ); - break; - - /* We are currently receiving a frame. Reset the timer after - * every character received. If more than the maximum possible - * number of bytes in a modbus frame is received the frame is - * ignored. - */ - case STATE_RX_RCV: - if( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ) - { - if( xStatus ) { - ucRTUBuf[usRcvBufferPos++] = ucByte; - } - } - else - { - eRcvState = STATE_RX_ERROR; - } - vMBPortTimersEnable( ); - break; - } - - return xStatus; -} - -BOOL -xMBRTUTransmitFSM( void ) -{ - BOOL xNeedPoll = TRUE; - - assert( eRcvState == STATE_RX_IDLE ); - - switch ( eSndState ) - { - /* We should not get a transmitter event if the transmitter is in - * idle state. */ - case STATE_TX_IDLE: - break; - - case STATE_TX_XMIT: - /* check if we are finished. */ - if( usSndBufferCount != 0 ) - { - xMBPortSerialPutByte( ( CHAR )*pucSndBufferCur ); - pucSndBufferCur++; /* next byte in sendbuffer. */ - usSndBufferCount--; - } - else - { - xMBPortEventPost( EV_FRAME_TRANSMIT ); - xNeedPoll = FALSE; - eSndState = STATE_TX_IDLE; - vMBPortTimersEnable( ); - } - break; - } - - return xNeedPoll; -} - -BOOL MB_PORT_ISR_ATTR -xMBRTUTimerT35Expired( void ) -{ - BOOL xNeedPoll = FALSE; - - switch ( eRcvState ) - { - /* Timer t35 expired. Startup phase is finished. */ - case STATE_RX_INIT: - xNeedPoll = xMBPortEventPost( EV_READY ); - break; - - /* A frame was received and t35 expired. Notify the listener that - * a new frame was received. */ - case STATE_RX_RCV: - xNeedPoll = xMBPortEventPost( EV_FRAME_RECEIVED ); - break; - - /* An error occured while receiving the frame. */ - case STATE_RX_ERROR: - break; - - /* Function called in an illegal state. */ - default: - assert( ( eRcvState == STATE_RX_IDLE ) || ( eRcvState == STATE_RX_ERROR ) ); - } - - vMBPortTimersDisable( ); - eRcvState = STATE_RX_IDLE; - - return xNeedPoll; -} -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbrtu.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbrtu.h deleted file mode 100755 index 69e0f45..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbrtu.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbrtu.h,v 1.9 2006/12/07 22:10:34 wolti Exp $ - */ -#include "mbconfig.h" - -#ifndef _MB_RTU_H -#define _MB_RTU_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_SER_PDU_SIZE_MIN 4 /*!< Minimum size of a Modbus RTU frame. */ - -#if MB_SLAVE_RTU_ENABLED -eMBErrorCode eMBRTUInit( UCHAR slaveAddress, UCHAR ucPort, ULONG ulBaudRate, - eMBParity eParity ); -void eMBRTUStart( void ); -void eMBRTUStop( void ); -eMBErrorCode eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ); -eMBErrorCode eMBRTUSend( UCHAR slaveAddress, const UCHAR * pucFrame, USHORT usLength ); -BOOL xMBRTUReceiveFSM( void ); -BOOL xMBRTUTransmitFSM( void ); -BOOL xMBRTUTimerT15Expired( void ); -BOOL xMBRTUTimerT35Expired( void ); -#endif - -#if MB_MASTER_RTU_ENABLED -eMBErrorCode eMBMasterRTUInit( UCHAR ucPort, ULONG ulBaudRate,eMBParity eParity ); -void eMBMasterRTUStart( void ); -void eMBMasterRTUStop( void ); -eMBErrorCode eMBMasterRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ); -eMBErrorCode eMBMasterRTUSend( UCHAR slaveAddress, const UCHAR * pucFrame, USHORT usLength ); -BOOL xMBMasterRTUReceiveFSM( void ); -BOOL xMBMasterRTUTransmitFSM( void ); -BOOL xMBMasterRTUTimerExpired( void ); -#endif - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbrtu_m.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbrtu_m.c deleted file mode 100755 index 4b3739d..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/rtu/mbrtu_m.c +++ /dev/null @@ -1,439 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2013 China Beijing Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbrtu_m.c,v 1.60 2013/08/17 11:42:56 Armink Add Master Functions $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" -#include "stdio.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ - -#include "mb_m.h" -#include "mbrtu.h" -#include "mbframe.h" - -#include "mbcrc.h" -#include "mbport.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_RTU_SER_PDU_SIZE_MIN 4 /*!< Minimum size of a Modbus RTU frame. */ - -/* ----------------------- Type definitions ---------------------------------*/ -typedef enum -{ - STATE_M_RX_INIT, /*!< Receiver is in initial state. */ - STATE_M_RX_IDLE, /*!< Receiver is in idle state. */ - STATE_M_RX_RCV, /*!< Frame is beeing received. */ - STATE_M_RX_ERROR, /*!< If the frame is invalid. */ -} eMBMasterRcvState; - -typedef enum -{ - STATE_M_TX_IDLE, /*!< Transmitter is in idle state. */ - STATE_M_TX_XMIT, /*!< Transmitter is in transfer state. */ - STATE_M_TX_XFWR, /*!< Transmitter is in transfer finish and wait receive state. */ -} eMBMasterSndState; - -#if MB_MASTER_RTU_ENABLED > 0 -/*------------------------ Shared variables ---------------------------------*/ -extern volatile UCHAR ucMasterRcvBuf[]; -extern volatile UCHAR ucMasterSndBuf[]; - -/* ----------------------- Static variables ---------------------------------*/ -static volatile eMBMasterSndState eSndState; -static volatile eMBMasterRcvState eRcvState; - -static volatile UCHAR *pucMasterSndBufferCur; -static volatile USHORT usMasterSndBufferCount; -static volatile USHORT usMasterRcvBufferPos; - -static volatile UCHAR *ucMasterRTURcvBuf = ucMasterRcvBuf; -static volatile UCHAR *ucMasterRTUSndBuf = ucMasterSndBuf; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBMasterRTUInit(UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - ULONG usTimerT35_50us; - - ENTER_CRITICAL_SECTION( ); - - /* Modbus RTU uses 8 Databits. */ - if( xMBMasterPortSerialInit( ucPort, ulBaudRate, 8, eParity ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - else - { - /* If baudrate > 19200 then we should use the fixed timer values - * t35 = 1750us. Otherwise t35 must be 3.5 times the character time. - */ - if( ulBaudRate > 19200 ) - { - usTimerT35_50us = 35; /* 1800us. */ - } - else - { - /* The timer reload value for a character is given by: - * - * ChTimeValue = Ticks_per_1s / ( Baudrate / 11 ) - * = 11 * Ticks_per_1s / Baudrate - * = 220000 / Baudrate - * The reload for t3.5 is 1.5 times this value and similary - * for t3.5. - */ - usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate ); - } - if( xMBMasterPortTimersInit( ( USHORT ) usTimerT35_50us ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - } - EXIT_CRITICAL_SECTION( ); - - return eStatus; -} - -void -eMBMasterRTUStart( void ) -{ - ENTER_CRITICAL_SECTION( ); - /* Initially the receiver is in the state STATE_M_RX_INIT. we start - * the timer and if no character is received within t3.5 we change - * to STATE_M_RX_IDLE. This makes sure that we delay startup of the - * modbus protocol stack until the bus is free. - */ - eRcvState = STATE_M_RX_INIT; - vMBMasterPortSerialEnable( TRUE, FALSE ); - vMBMasterPortTimersT35Enable( ); - - EXIT_CRITICAL_SECTION( ); -} - -void -eMBMasterRTUStop( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBMasterPortSerialEnable( FALSE, FALSE ); - vMBMasterPortTimersDisable( ); - EXIT_CRITICAL_SECTION( ); -} - -eMBErrorCode -eMBMasterRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR *pucMBRTUFrame = ( UCHAR* ) ucMasterRTURcvBuf; - USHORT usFrameLength = usMasterRcvBufferPos; - - if( xMBMasterPortSerialGetResponse( &pucMBRTUFrame, &usFrameLength ) == FALSE ) - { - return MB_EIO; - } - - ENTER_CRITICAL_SECTION( ); - assert( usFrameLength < MB_SER_PDU_SIZE_MAX ); - assert( pucMBRTUFrame ); - - /* Length and CRC check */ - if( ( usFrameLength >= MB_RTU_SER_PDU_SIZE_MIN ) - && ( usMBCRC16( ( UCHAR * ) pucMBRTUFrame, usFrameLength ) == 0 ) ) - { - /* Save the address field. All frames are passed to the upper layer - * and the decision if a frame is used is done there. - */ - *pucRcvAddress = pucMBRTUFrame[MB_SER_PDU_ADDR_OFF]; - - /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus - * size of address field and CRC checksum. - */ - *pusLength = ( USHORT )( usFrameLength - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC ); - - /* Return the start of the Modbus PDU to the caller. */ - *pucFrame = ( UCHAR * ) & pucMBRTUFrame[MB_SER_PDU_PDU_OFF]; - } - else - { - eStatus = MB_EIO; - } - - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -eMBErrorCode -eMBMasterRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - USHORT usCRC16; - - if ( ucSlaveAddress > MB_MASTER_TOTAL_SLAVE_NUM ) return MB_EINVAL; - - /* Check if the receiver is still in idle state. If not we where to - * slow with processing the received frame and the master sent another - * frame on the network. We have to abort sending the frame. - */ - if( eRcvState == STATE_M_RX_IDLE ) - { - ENTER_CRITICAL_SECTION( ); - /* First byte before the Modbus-PDU is the slave address. */ - pucMasterSndBufferCur = ( UCHAR * ) pucFrame - 1; - usMasterSndBufferCount = 1; - - /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ - pucMasterSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress; - usMasterSndBufferCount += usLength; - - /* Calculate CRC16 checksum for Modbus-Serial-Line-PDU. */ - usCRC16 = usMBCRC16( ( UCHAR * ) pucMasterSndBufferCur, usMasterSndBufferCount ); - pucMasterSndBufferCur[usMasterSndBufferCount++] = ( UCHAR )( usCRC16 & 0xFF ); - pucMasterSndBufferCur[usMasterSndBufferCount++] = ( UCHAR )( usCRC16 >> 8 ); - EXIT_CRITICAL_SECTION( ); - - /* Activate the transmitter. */ - eSndState = STATE_M_TX_XMIT; - - if ( xMBMasterPortSerialSendRequest( ( UCHAR * ) pucMasterSndBufferCur, usMasterSndBufferCount ) == FALSE ) - { - eStatus = MB_EIO; - } - - // The place to enable RS485 driver - vMBMasterPortSerialEnable( FALSE, TRUE ); - } - else - { - eStatus = MB_EIO; - } - return eStatus; -} - -BOOL -xMBMasterRTUReceiveFSM( void ) -{ - BOOL xStatus = FALSE; - UCHAR ucByte; - - if ( ( eSndState != STATE_M_TX_IDLE ) && ( eSndState != STATE_M_TX_XFWR ) ) { - return FALSE; - } - - /* Always read the character. */ - xStatus = xMBMasterPortSerialGetByte( ( CHAR * ) & ucByte ); - - switch ( eRcvState ) - { - /* If we have received a character in the init state we have to - * wait until the frame is finished. - */ - case STATE_M_RX_INIT: - vMBMasterPortTimersT35Enable( ); - ESP_LOGD("DBG", "Start initialization phase."); - break; - - /* In the error state we wait until all characters in the - * damaged frame are transmitted. - */ - case STATE_M_RX_ERROR: - vMBMasterPortTimersT35Enable( ); - break; - - /* In the idle state we wait for a new character. If a character - * is received the t1.5 and t3.5 timers are started and the - * receiver is in the state STATE_M_RX_RCV and disable early - * the timer of respond timeout . - */ - case STATE_M_RX_IDLE: - /* In time of respond timeout,the receiver receive a frame. - * Disable timer of respond timeout and change the transmiter state to idle. - */ - vMBMasterPortTimersDisable( ); - - usMasterRcvBufferPos = 0; - if( xStatus && ucByte ) { - ucMasterRTURcvBuf[usMasterRcvBufferPos++] = ucByte; - eRcvState = STATE_M_RX_RCV; - eSndState = STATE_M_TX_IDLE; - } - - /* Enable t3.5 timers. */ -#if CONFIG_FMB_TIMER_PORT_ENABLED - vMBMasterPortTimersT35Enable( ); -#endif - break; - - /* We are currently receiving a frame. Reset the timer after - * every character received. If more than the maximum possible - * number of bytes in a modbus frame is received the frame is - * ignored. - */ - case STATE_M_RX_RCV: - if( usMasterRcvBufferPos < MB_SER_PDU_SIZE_MAX ) - { - if ( xStatus ) { - ucMasterRTURcvBuf[usMasterRcvBufferPos++] = ucByte; - } - } - else - { - eRcvState = STATE_M_RX_ERROR; - } -#if CONFIG_FMB_TIMER_PORT_ENABLED - vMBMasterPortTimersT35Enable( ); -#endif - break; - } - return xStatus; -} - -BOOL -xMBMasterRTUTransmitFSM( void ) -{ - BOOL xNeedPoll = TRUE; - BOOL xFrameIsBroadcast = FALSE; - - if ( eRcvState != STATE_M_RX_IDLE ) { - return FALSE; - } - - switch ( eSndState ) - { - /* We should not get a transmitter event if the transmitter is in - * idle state. */ - case STATE_M_TX_XFWR: - xNeedPoll = FALSE; - break; - - case STATE_M_TX_IDLE: - break; - - case STATE_M_TX_XMIT: - /* check if we are finished. */ - if( usMasterSndBufferCount != 0 ) - { - xMBMasterPortSerialPutByte( ( CHAR )*pucMasterSndBufferCur ); - pucMasterSndBufferCur++; /* next byte in sendbuffer. */ - usMasterSndBufferCount--; - } - else - { - xFrameIsBroadcast = ( ucMasterRTUSndBuf[MB_SEND_BUF_PDU_OFF - MB_SER_PDU_PDU_OFF] - == MB_ADDRESS_BROADCAST ) ? TRUE : FALSE; - vMBMasterRequestSetType( xFrameIsBroadcast ); - eSndState = STATE_M_TX_XFWR; - /* If the frame is broadcast ,master will enable timer of convert delay, - * else master will enable timer of respond timeout. */ - if ( xFrameIsBroadcast == TRUE ) - { - vMBMasterPortTimersConvertDelayEnable( ); - } - else - { - vMBMasterPortTimersRespondTimeoutEnable( ); - } - } - break; - } - - return xNeedPoll; -} - -BOOL MB_PORT_ISR_ATTR -xMBMasterRTUTimerExpired(void) -{ - BOOL xNeedPoll = FALSE; - - switch (eRcvState) - { - /* Timer t35 expired. Startup phase is finished. */ - case STATE_M_RX_INIT: - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_READY); - ESP_EARLY_LOGD("DBG", "RTU timer, init FSM state."); - break; - - /* A frame was received and t35 expired. Notify the listener that - * a new frame was received. */ - case STATE_M_RX_RCV: - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_FRAME_RECEIVED); - break; - - /* An error occured while receiving the frame. */ - case STATE_M_RX_ERROR: - vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_ERROR_PROCESS); - break; - - /* Function called in an illegal state. */ - default: - assert(eRcvState == STATE_M_RX_IDLE); - break; - } - eRcvState = STATE_M_RX_IDLE; - - switch (eSndState) - { - /* A frame was send finish and convert delay or respond timeout expired. - * If the frame is broadcast,The master will idle,and if the frame is not - * broadcast. Notify the listener process error.*/ - case STATE_M_TX_XFWR: - if ( xMBMasterRequestIsBroadcast( ) == FALSE ) { - vMBMasterSetErrorType(EV_ERROR_RESPOND_TIMEOUT); - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_ERROR_PROCESS); - } - break; - /* Function called in an illegal state. */ - default: - assert( ( eSndState == STATE_M_TX_XMIT ) || ( eSndState == STATE_M_TX_IDLE )); - break; - } - eSndState = STATE_M_TX_IDLE; - - vMBMasterPortTimersDisable( ); - /* If timer mode is convert delay, the master event then turns EV_MASTER_EXECUTE status. */ - if (xMBMasterGetCurTimerMode() == MB_TMODE_CONVERT_DELAY) { - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_EXECUTE); - } - - return xNeedPoll; -} - - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp.c deleted file mode 100755 index a24228b..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbtcp.c,v 1.3 2006/12/07 22:10:34 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbconfig.h" -#include "mbtcp.h" -#include "mbframe.h" -#include "mbport.h" - -#if MB_TCP_ENABLED - -/* ----------------------- Defines ------------------------------------------*/ - -/* ----------------------- MBAP Header --------------------------------------*/ -/* - * - * <------------------------ MODBUS TCP/IP ADU(1) -------------------------> - * <----------- MODBUS PDU (1') ----------------> - * +-----------+---------------+------------------------------------------+ - * | TID | PID | Length | UID |Code | Data | - * +-----------+---------------+------------------------------------------+ - * | | | | | - * (2) (3) (4) (5) (6) - * - * (2) ... MB_TCP_TID = 0 (Transaction Identifier - 2 Byte) - * (3) ... MB_TCP_PID = 2 (Protocol Identifier - 2 Byte) - * (4) ... MB_TCP_LEN = 4 (Number of bytes - 2 Byte) - * (5) ... MB_TCP_UID = 6 (Unit Identifier - 1 Byte) - * (6) ... MB_TCP_FUNC = 7 (Modbus Function Code) - * - * (1) ... Modbus TCP/IP Application Data Unit - * (1') ... Modbus Protocol Data Unit - */ - -#define MB_TCP_PROTOCOL_ID 0 /* 0 = Modbus Protocol */ - - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBTCPDoInit( USHORT ucTCPPort ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( xMBTCPPortInit( ucTCPPort ) == FALSE ) - { - eStatus = MB_EPORTERR; - } - return eStatus; -} - -void -eMBTCPStart( void ) -{ - ESP_LOGD(MB_PORT_TAG, "TCP Slave port enable."); - vMBTCPPortEnable( ); -} - -void -eMBTCPStop( void ) -{ - /* Make sure that no more clients are connected. */ - ESP_LOGD(MB_PORT_TAG, "TCP Slave port disable."); - vMBTCPPortDisable( ); -} - -eMBErrorCode -eMBTCPReceive( UCHAR * pucRcvAddress, UCHAR ** ppucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_EIO; - UCHAR *pucMBTCPFrame; - USHORT usLength; - USHORT usPID; - - if( xMBTCPPortGetRequest( &pucMBTCPFrame, &usLength ) != FALSE ) - { - usPID = pucMBTCPFrame[MB_TCP_PID] << 8U; - usPID |= pucMBTCPFrame[MB_TCP_PID + 1]; - - if( usPID == MB_TCP_PROTOCOL_ID ) - { - *ppucFrame = &pucMBTCPFrame[MB_TCP_FUNC]; - *pusLength = usLength - MB_TCP_FUNC; - eStatus = MB_ENOERR; - - /* The regular Modbus TCP does not use any addresses. Fake the MBAP UID in this case. - * The MBAP UID field support is used for RTU over TCP option if enabled. - */ -#if MB_TCP_UID_ENABLED - *pucRcvAddress = pucMBTCPFrame[MB_TCP_UID]; -#else - *pucRcvAddress = MB_TCP_PSEUDO_ADDRESS; -#endif - } - } - else - { - eStatus = MB_EIO; - } - return eStatus; -} - -eMBErrorCode -eMBTCPSend( UCHAR _unused, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR *pucMBTCPFrame = ( UCHAR * ) pucFrame - MB_TCP_FUNC; - USHORT usTCPLength = usLength + MB_TCP_FUNC; - - /* The MBAP header is already initialized because the caller calls this - * function with the buffer returned by the previous call. Therefore we - * only have to update the length in the header. Note that the length - * header includes the size of the Modbus PDU and the UID Byte. Therefore - * the length is usLength plus one. - */ - pucMBTCPFrame[MB_TCP_LEN] = ( usLength + 1 ) >> 8U; - pucMBTCPFrame[MB_TCP_LEN + 1] = ( usLength + 1 ) & 0xFF; - - if( xMBTCPPortSendResponse( pucMBTCPFrame, usTCPLength ) == FALSE ) - { - eStatus = MB_EIO; - } - return eStatus; -} - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp.h deleted file mode 100755 index 842ce19..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbtcp.h,v 1.2 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_TCP_H -#define _MB_TCP_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -/* ----------------------- Defines ------------------------------------------*/ - -#if MB_TCP_ENABLED - -/* ----------------------- Function prototypes ------------------------------*/ -eMBErrorCode eMBTCPDoInit( USHORT ucTCPPort ); -void eMBTCPStart( void ); -void eMBTCPStop( void ); -eMBErrorCode eMBTCPReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, - USHORT * pusLength ); -eMBErrorCode eMBTCPSend( UCHAR _unused, const UCHAR * pucFrame, - USHORT usLength ); - -#endif - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp_m.c b/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp_m.c deleted file mode 100755 index 112f437..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp_m.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbtcp.c,v 1.3 2006/12/07 22:10:34 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbconfig.h" -#include "mbtcp_m.h" -#include "mbframe.h" -#include "mbport.h" - -#if MB_MASTER_TCP_ENABLED - -/* ----------------------- Defines ------------------------------------------*/ - -/* ----------------------- MBAP Header --------------------------------------*/ -/* - * - * <------------------------ MODBUS TCP/IP ADU(1) -------------------------> - * <----------- MODBUS PDU (1') ----------------> - * +-----------+---------------+------------------------------------------+ - * | TID | PID | Length | UID |Code | Data | - * +-----------+---------------+------------------------------------------+ - * | | | | | - * (2) (3) (4) (5) (6) - * - * (2) ... MB_TCP_TID = 0 (Transaction Identifier - 2 Byte) - * (3) ... MB_TCP_PID = 2 (Protocol Identifier - 2 Byte) - * (4) ... MB_TCP_LEN = 4 (Number of bytes - 2 Byte) - * (5) ... MB_TCP_UID = 6 (Unit Identifier - 1 Byte) - * (6) ... MB_TCP_FUNC = 7 (Modbus Function Code) - * - * (1) ... Modbus TCP/IP Application Data Unit - * (1') ... Modbus Protocol Data Unit - */ - -#define MB_TCP_PROTOCOL_ID 0 /* 0 = Modbus Protocol */ - - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBMasterTCPDoInit( USHORT ucTCPPort ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( xMBMasterTCPPortInit( ucTCPPort ) == FALSE ) - { - eStatus = MB_EPORTERR; - } - return eStatus; -} - -void -eMBMasterTCPStart( void ) -{ - ESP_LOGD(MB_PORT_TAG, "TCP Master port enable."); - vMBMasterTCPPortEnable( ); -} - -void -eMBMasterTCPStop( void ) -{ - ESP_LOGD(MB_PORT_TAG, "TCP Master port disable."); - vMBMasterTCPPortDisable( ); -} - -eMBErrorCode -eMBMasterTCPReceive( UCHAR * pucRcvAddress, UCHAR ** ppucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_EIO; - UCHAR *pucMBTCPFrame; - USHORT usLength; - USHORT usPID; - - if( xMBMasterTCPPortGetRequest( &pucMBTCPFrame, &usLength ) != FALSE ) - { - usPID = pucMBTCPFrame[MB_TCP_PID] << 8U; - usPID |= pucMBTCPFrame[MB_TCP_PID + 1]; - - if( usPID == MB_TCP_PROTOCOL_ID ) - { - *ppucFrame = &pucMBTCPFrame[MB_TCP_FUNC]; - *pusLength = usLength - MB_TCP_FUNC; - eStatus = MB_ENOERR; - - /* Get MBAP UID field if its support is enabled. - * Otherwise just ignore this field. - */ -#if MB_TCP_UID_ENABLED - *pucRcvAddress = pucMBTCPFrame[MB_TCP_UID]; -#else - *pucRcvAddress = MB_TCP_PSEUDO_ADDRESS; -#endif - } - } - else - { - eStatus = MB_EIO; - } - return eStatus; -} - -eMBErrorCode -eMBMasterTCPSend( UCHAR ucAddress, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR *pucMBTCPFrame = ( UCHAR * ) pucFrame - MB_TCP_FUNC; - USHORT usTCPLength = usLength + MB_TCP_FUNC; - - /* Note that the length in the MBAP header includes the size of the Modbus PDU - * and the UID Byte. Therefore the length is usLength plus one. - */ - pucMBTCPFrame[MB_TCP_LEN] = ( usLength + 1 ) >> 8U; - pucMBTCPFrame[MB_TCP_LEN + 1] = ( usLength + 1 ) & 0xFF; - - /* Set UID field in the MBAP if it is supported. - * If the RTU over TCP is not supported, the UID = 0 or 0xFF. - */ -#if MB_TCP_UID_ENABLED - pucMBTCPFrame[MB_TCP_UID] = ucAddress; -#else - pucMBTCPFrame[MB_TCP_UID] = 0x00; -#endif - - if( xMBMasterTCPPortSendResponse( pucMBTCPFrame, usTCPLength ) == FALSE ) - { - eStatus = MB_EIO; - } - return eStatus; -} - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp_m.h b/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp_m.h deleted file mode 100755 index 68ca532..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/modbus/tcp/mbtcp_m.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbtcp.h,v 1.2 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_TCP_M_H -#define _MB_TCP_M_H - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -/* ----------------------- Defines ------------------------------------------*/ - -#if MB_MASTER_TCP_ENABLED - -/* ----------------------- Function prototypes ------------------------------*/ -eMBErrorCode eMBMasterTCPDoInit( USHORT ucTCPPort ); -void eMBMasterTCPStart( void ); -void eMBMasterTCPStop( void ); -eMBErrorCode eMBMasterTCPReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, - USHORT * pusLength ); -eMBErrorCode eMBMasterTCPSend( UCHAR ucAddress, const UCHAR * pucFrame, - USHORT usLength ); -BOOL xMBMasterTCPTimerExpired(void); - -#endif - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/port/port.c b/managed_components/espressif__esp-modbus/freemodbus/port/port.c deleted file mode 100755 index e89b50d..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/port/port.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Port - * Copyright (C) 2013 Armink - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: port.c,v 1.60 2015/02/01 9:18:05 Armink $ - */ - -/* ----------------------- System includes --------------------------------*/ - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "freertos/FreeRTOS.h" -#include "freertos/queue.h" -#include "port.h" - -/* ----------------------- Variables ----------------------------------------*/ -static _lock_t s_port_lock; -static UCHAR ucPortMode = 0; - -/* ----------------------- Start implementation -----------------------------*/ -INLINE int lock_obj(_lock_t *plock) -{ - _lock_acquire(plock); - return 1; -} - -INLINE void unlock_obj(_lock_t *plock) -{ - _lock_release(plock); -} - -INLINE void -vMBPortEnterCritical(void) -{ - _lock_acquire(&s_port_lock); -} - -INLINE void -vMBPortExitCritical(void) -{ - _lock_release(&s_port_lock); -} - -UCHAR -ucMBPortGetMode( void ) -{ - return ucPortMode; -} - -void -vMBPortSetMode( UCHAR ucMode ) -{ - ENTER_CRITICAL_SECTION(); - ucPortMode = ucMode; - EXIT_CRITICAL_SECTION(); -} - -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_SLAVE_RTU_ENABLED || MB_SLAVE_ASCII_ENABLED - -BOOL xMBPortSerialWaitEvent(QueueHandle_t xMbUartQueue, uart_event_t* pxEvent, ULONG xTimeout) -{ - BOOL xResult = (BaseType_t)xQueueReceive(xMbUartQueue, (void*)pxEvent, (TickType_t) xTimeout); - ESP_LOGD(MB_PORT_TAG, "%s, UART event: %u ", __func__, (unsigned)pxEvent->type); - return xResult; -} - -#endif - -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED - -/* - * The function is called from ASCII/RTU module to get processed data buffer. Sets the - * received buffer and its length using parameters. - */ -__attribute__ ((weak)) -BOOL xMBMasterPortSerialGetResponse( UCHAR **ppucMBSerialFrame, USHORT * usSerialLength ) -{ - ESP_LOGD(MB_PORT_TAG, " %s default", __func__); - return TRUE; -} - -/* - * The function is called from ASCII/RTU module to set processed data buffer - * to be sent in transmitter state machine. - */ -__attribute__ ((weak)) -BOOL xMBMasterPortSerialSendRequest( UCHAR *pucMBSerialFrame, USHORT usSerialLength ) -{ - ESP_LOGD(MB_PORT_TAG, "%s default", __func__); - return TRUE; -} - -#endif - -#if MB_SLAVE_RTU_ENABLED || MB_SLAVE_ASCII_ENABLED - -__attribute__ ((weak)) -BOOL xMBPortSerialGetRequest( UCHAR **ppucMBSerialFrame, USHORT * usSerialLength ) -{ - ESP_LOGD(MB_PORT_TAG, "%s default", __func__); - return TRUE; -} - -__attribute__ ((weak)) -BOOL xMBPortSerialSendResponse( UCHAR *pucMBSerialFrame, USHORT usSerialLength ) -{ - ESP_LOGD(MB_PORT_TAG, "%s default", __func__); - return TRUE; -} - -#endif - -#if MB_TCP_DEBUG - -// This function is kept to realize legacy freemodbus frame logging functionality -void -prvvMBTCPLogFrame( const CHAR * pucMsg, UCHAR * pucFrame, USHORT usFrameLen ) -{ - int i; - int res = 0; - int iBufPos = 0; - size_t iBufLeft = MB_TCP_FRAME_LOG_BUFSIZE; - static CHAR arcBuffer[MB_TCP_FRAME_LOG_BUFSIZE]; - - assert( pucFrame != NULL ); - - for ( i = 0; i < usFrameLen; i++ ) { - // Print some additional frame information. - switch ( i ) - { - case 0: - // TID = Transaction Identifier. - res = snprintf( &arcBuffer[iBufPos], iBufLeft, "| TID = " ); - break; - case 2: - // PID = Protocol Identifier. - res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | PID = " ); - break; - case 4: - // Length - res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | LEN = " ); - break; - case 6: - // UID = Unit Identifier. - res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | UID = " ); - break; - case 7: - // MB Function Code. - res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | FUNC = " ); - break; - case 8: - // MB PDU rest. - res = snprintf( &arcBuffer[iBufPos], iBufLeft, " | DATA = " ); - break; - default: - res = 0; - break; - } - if( res == -1 ) { - break; - } - else { - iBufPos += res; - iBufLeft -= res; - } - - // Print the data. - res = snprintf( &arcBuffer[iBufPos], iBufLeft, "%02X", pucFrame[i] ); - if( res == -1 ) { - break; - } else { - iBufPos += res; - iBufLeft -= res; - } - } - - if( res != -1 ) { - // Append an end of frame string. - res = snprintf( &arcBuffer[iBufPos], iBufLeft, " |" ); - if( res != -1 ) { - ESP_LOGD(pucMsg, "%s", arcBuffer); - } - } -} -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/port/port.h b/managed_components/espressif__esp-modbus/freemodbus/port/port.h deleted file mode 100755 index aee2a63..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/port/port.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2010 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Port - * Copyright (C) 2010 Christian Walter - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: port.h,v 1.1 2010/06/06 13:07:20 wolti Exp $ - */ - -#ifndef PORT_COMMON_H_ -#define PORT_COMMON_H_ - -#include "sys/lock.h" - -#include "freertos/FreeRTOS.h" -#include "freertos/queue.h" // for queue - -#include "esp_log.h" // for ESP_LOGE macro -#include "esp_timer.h" -#include "driver/uart.h" // for uart_event_t - -#if __has_include("driver/gptimer.h") -#include "driver/gptimer.h" -#else -#include "driver/timer.h" -#endif - -#include "mbconfig.h" - -#define INLINE inline __attribute__((always_inline)) -#define PR_BEGIN_EXTERN_C extern "C" { -#define PR_END_EXTERN_C } - -#define MB_PORT_TAG "MB_PORT_COMMON" - -#define MB_BAUD_RATE_DEFAULT (115200) -#define MB_QUEUE_LENGTH (CONFIG_FMB_QUEUE_LENGTH) - -#define MB_SERIAL_TASK_PRIO (CONFIG_FMB_PORT_TASK_PRIO) -#define MB_SERIAL_TASK_STACK_SIZE (CONFIG_FMB_PORT_TASK_STACK_SIZE) -#define MB_SERIAL_TOUT (3) // 3.5*8 = 28 ticks, TOUT=3 -> ~24..33 ticks - -// Set buffer size for transmission -#define MB_SERIAL_BUF_SIZE (CONFIG_FMB_SERIAL_BUF_SIZE) - -// common definitions for serial port implementations -#define MB_SERIAL_TX_TOUT_MS (2200) // maximum time for transmission of longest allowed frame buffer -#define MB_SERIAL_TX_TOUT_TICKS (pdMS_TO_TICKS(MB_SERIAL_TX_TOUT_MS)) // timeout for transmission -#define MB_SERIAL_RX_TOUT_MS (1) -#define MB_SERIAL_RX_TOUT_TICKS (pdMS_TO_TICKS(MB_SERIAL_RX_TOUT_MS)) // timeout for receive - -#define MB_SERIAL_RESP_LEN_MIN (4) - -// Common definitions for TCP port -#define MB_TCP_BUF_SIZE (256 + 7) // Must hold a complete Modbus TCP frame. -#define MB_TCP_DEFAULT_PORT (CONFIG_FMB_TCP_PORT_DEFAULT) -#define MB_TCP_STACK_SIZE (CONFIG_FMB_PORT_TASK_STACK_SIZE) -#define MB_TCP_TASK_PRIO (CONFIG_FMB_PORT_TASK_PRIO) - -// The task affinity for Modbus stack tasks -#define MB_PORT_TASK_AFFINITY (CONFIG_FMB_PORT_TASK_AFFINITY) - -#define MB_TCP_READ_TIMEOUT_MS (100) // read timeout in mS -#define MB_TCP_READ_TIMEOUT (pdMS_TO_TICKS(MB_TCP_READ_TIMEOUT_MS)) -#define MB_TCP_SEND_TIMEOUT_MS (500) // send event timeout in mS -#define MB_TCP_SEND_TIMEOUT (pdMS_TO_TICKS(MB_TCP_SEND_TIMEOUT_MS)) -#define MB_TCP_PORT_MAX_CONN (CONFIG_FMB_TCP_PORT_MAX_CONN) - -// Set the API unlock time to maximum response time -// The actual release time will be dependent on the timer time -#define MB_MAX_RESPONSE_TIME_MS (5000) - -#define MB_TCP_FRAME_LOG_BUFSIZE (256) - -#define MB_PORT_HAS_CLOSE (1) // Define to explicitly close port on destroy - -// Define number of timer reloads per 1 mS -#define MB_TIMER_TICS_PER_MS (20UL) -#define MB_TIMER_TICK_TIME_US (1000 / MB_TIMER_TICS_PER_MS) // 50uS = one discreet for timer - -#define MB_TCP_DEBUG (LOG_LOCAL_LEVEL >= ESP_LOG_DEBUG) // Enable legacy debug output in TCP module. - -#define MB_ATTR_WEAK __attribute__ ((weak)) - -#define MB_TCP_GET_FIELD(buffer, field) ((USHORT)((buffer[field] << 8U) | buffer[field + 1])) - -#define MB_PORT_CHECK(a, ret_val, str, ...) \ - if (!(a)) { \ - ESP_LOGE(MB_PORT_TAG, "%s(%u): " str, __FUNCTION__, __LINE__, ##__VA_ARGS__); \ - return ret_val; \ - } - -// Macro to check if stack shutdown event is active -#define TCP_PORT_CHECK_SHDN(sema_ptr, callback_func) do { \ - if (sema_ptr) { \ - ESP_LOGD(TAG, "Shutdown stack from %s(%d)", __func__, __LINE__); \ - callback_func(); \ - } \ -} while(0) - -int lock_obj(_lock_t *plock); -void unlock_obj(_lock_t *plock); - -#define CRITICAL_SECTION_INIT(lock) \ - do \ - { \ - _lock_init((_lock_t *)&lock); \ - } while (0) - -#define CRITICAL_SECTION_CLOSE(lock) \ - do \ - { \ - _lock_close((_lock_t *)&lock); \ - } while (0) - -#define CRITICAL_SECTION_LOCK(lock) \ - do \ - { \ - lock_obj((_lock_t *)&lock); \ - } while (0) - -#define CRITICAL_SECTION_UNLOCK(lock) \ - do \ - { \ - unlock_obj((_lock_t *)&lock); \ - } while (0) - -#define CRITICAL_SECTION(lock) for (int st = lock_obj((_lock_t *)&lock); (st > 0); unlock_obj((_lock_t *)&lock), st = -1) - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif /* __cplusplus */ - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -typedef char BOOL; - -typedef unsigned char UCHAR; -typedef char CHAR; - -typedef unsigned short USHORT; -typedef short SHORT; - -typedef unsigned long ULONG; -typedef long LONG; - -#if MB_TCP_DEBUG -typedef enum -{ - MB_LOG_DEBUG, - MB_LOG_INFO, - MB_LOG_WARN, - MB_LOG_ERROR -} eMBPortLogLevel; -#endif - -typedef enum -{ - MB_PROTO_TCP, - MB_PROTO_UDP, -} eMBPortProto; - -typedef enum { - MB_PORT_IPV4 = 0, /*!< TCP IPV4 addressing */ - MB_PORT_IPV6 = 1 /*!< TCP IPV6 addressing */ -} eMBPortIpVer; - -typedef struct { - esp_timer_handle_t xTimerIntHandle; - USHORT usT35Ticks; - BOOL xTimerState; -} xTimerContext_t; - -void vMBPortEnterCritical(void); -void vMBPortExitCritical(void); - -#define ENTER_CRITICAL_SECTION( ) { ESP_EARLY_LOGD(MB_PORT_TAG,"%s: Port enter critical.", __func__); \ - vMBPortEnterCritical(); } - -#define EXIT_CRITICAL_SECTION( ) { vMBPortExitCritical(); \ - ESP_EARLY_LOGD(MB_PORT_TAG,"%s: Port exit critical", __func__); } - -#define MB_PORT_CHECK_EVENT( event, mask ) ( event & mask ) -#define MB_PORT_CLEAR_EVENT( event, mask ) do { event &= ~mask; } while(0) - -#define MB_PORT_PARITY_GET(parity) ((parity != UART_PARITY_DISABLE) ? \ - ((parity == UART_PARITY_ODD) ? MB_PAR_ODD : MB_PAR_EVEN) : MB_PAR_NONE) - -// Legacy Modbus logging function -#if MB_TCP_DEBUG -void vMBPortLog( eMBPortLogLevel eLevel, const CHAR * szModule, - const CHAR * szFmt, ... ); -void prvvMBTCPLogFrame( const CHAR * pucMsg, UCHAR * pucFrame, USHORT usFrameLen ); -#endif - -void vMBPortSetMode( UCHAR ucMode ); -UCHAR ucMBPortGetMode( void ); - -BOOL xMBPortSerialWaitEvent(QueueHandle_t xMbUartQueue, uart_event_t* pxEvent, ULONG xTimeout); - -/** - * This is modbus master user error handling funcion. - * If it is defined in the user application, then helps to handle the errors - * and received/sent buffers to transfer as well as handle the slave exception codes. - * - * @param xTransId - the identification of the trasaction - * @param ucDestAddress destination salve address - * @param usError - the error code, see the enumeration eMBMasterErrorEventType - * @param pucRecvData current receive data pointer - * @param ucRecvLength current length of receive buffer - * @param pucSendData Send buffer data - * @param ucSendLength Send buffer length - */ -void vMBMasterErrorCBUserHandler( uint64_t xTransId, USHORT usError, UCHAR ucDestAddress, const UCHAR* pucRecvData, USHORT ucRecvLength, - const UCHAR* pucSendData, USHORT ucSendLength ) MB_ATTR_WEAK; - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif /* __cplusplus */ - -#endif /* PORT_COMMON_H_ */ diff --git a/managed_components/espressif__esp-modbus/freemodbus/port/portevent.c b/managed_components/espressif__esp-modbus/freemodbus/port/portevent.c deleted file mode 100755 index a19b809..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/port/portevent.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2010 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Port Demo Application - * Copyright (C) 2010 Christian Walter - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: portevent.c,v 1.1 2010/06/06 13:07:20 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include -#include -#include - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" -#include "port.h" -#include "mbconfig.h" -#include "port_serial_slave.h" -/* ----------------------- Variables ----------------------------------------*/ -static QueueHandle_t xQueueHdl; - -/* ----------------------- Start implementation -----------------------------*/ -BOOL -xMBPortEventInit( void ) -{ - BOOL bStatus = FALSE; - if((xQueueHdl = xQueueCreate(MB_EVENT_QUEUE_SIZE, sizeof(eMBEventType))) != NULL) - { - vQueueAddToRegistry(xQueueHdl, "MbPortEventQueue"); - bStatus = TRUE; - } - return bStatus; -} - -void -vMBPortEventClose( void ) -{ - if(xQueueHdl != NULL) - { - vQueueDelete(xQueueHdl); - xQueueHdl = NULL; - } -} - -BOOL MB_PORT_ISR_ATTR -xMBPortEventPost( eMBEventType eEvent ) -{ - BaseType_t xStatus, xHigherPriorityTaskWoken = pdFALSE; - assert(xQueueHdl != NULL); - - if( (BOOL)xPortInIsrContext() == TRUE ) - { - xStatus = xQueueSendFromISR(xQueueHdl, (const void*)&eEvent, &xHigherPriorityTaskWoken); - if ( xHigherPriorityTaskWoken ) - { - portYIELD_FROM_ISR(); - } - if (xStatus != pdTRUE) { - ESP_EARLY_LOGV(MB_PORT_TAG, "%s: Post message failure = %u.", __func__, (unsigned)xStatus); - return FALSE; - } - } - else - { - xStatus = xQueueSend(xQueueHdl, (const void*)&eEvent, MB_EVENT_QUEUE_TIMEOUT); - MB_PORT_CHECK((xStatus == pdTRUE), FALSE, "%s: Post message failure.", __func__); - } - return TRUE; -} - -BOOL -xMBPortEventGet(eMBEventType * peEvent) -{ - assert(xQueueHdl != NULL); - BOOL xEventHappened = FALSE; - - if (xQueueReceive(xQueueHdl, peEvent, portMAX_DELAY) == pdTRUE) { - xEventHappened = TRUE; - } - return xEventHappened; -} - -QueueHandle_t -xMBPortEventGetHandle(void) -{ - if(xQueueHdl != NULL) - { - return xQueueHdl; - } - return NULL; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/port/portevent_m.c b/managed_components/espressif__esp-modbus/freemodbus/port/portevent_m.c deleted file mode 100755 index ba981d2..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/port/portevent_m.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Port - * Copyright (C) 2013 Armink - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: portevent.c v 1.60 2013/08/13 15:07:05 Armink add Master Functions$ - */ - -/* ----------------------- Modbus includes ----------------------------------*/ -#include - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/event_groups.h" -#include "freertos/semphr.h" - -#include "mb_m.h" -#include "mbport.h" -#include "mbconfig.h" - -#include "port.h" -#include "mbport.h" -#include "freertos/semphr.h" - -#if MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED -/* ----------------------- Defines ------------------------------------------*/ - -// Event bit mask for eMBMasterWaitRequestFinish() -#define MB_EVENT_REQ_MASK (EventBits_t)( EV_MASTER_PROCESS_SUCCESS | \ - EV_MASTER_ERROR_RESPOND_TIMEOUT | \ - EV_MASTER_ERROR_RECEIVE_DATA | \ - EV_MASTER_ERROR_EXECUTE_FUNCTION ) - -/* ----------------------- Variables ----------------------------------------*/ -static SemaphoreHandle_t xResourceMasterHdl; -static EventGroupHandle_t xEventGroupMasterHdl; -static EventGroupHandle_t xEventGroupMasterConfirmHdl; -static QueueHandle_t xQueueMasterHdl; - -static _Atomic uint64_t xTransactionID = 0; - -/* ----------------------- Start implementation -----------------------------*/ - -BOOL -xMBMasterPortEventInit( void ) -{ - xEventGroupMasterHdl = xEventGroupCreate(); - xEventGroupMasterConfirmHdl = xEventGroupCreate(); - MB_PORT_CHECK((xEventGroupMasterHdl != NULL) && (xEventGroupMasterConfirmHdl != NULL), - FALSE, "mb stack event group creation error."); - xQueueMasterHdl = xQueueCreate(MB_EVENT_QUEUE_SIZE, sizeof(xMBMasterEventType)); - MB_PORT_CHECK(xQueueMasterHdl, FALSE, "mb stack event group creation error."); - vQueueAddToRegistry(xQueueMasterHdl, "MbMasterPortEventQueue"); - atomic_init(&xTransactionID, 0); - return TRUE; -} - -BOOL MB_PORT_ISR_ATTR -xMBMasterPortEventPost( eMBMasterEventEnum eEvent) -{ - BaseType_t xStatus, xHigherPriorityTaskWoken = pdFALSE; - assert(xQueueMasterHdl != NULL); - xMBMasterEventType xEvent; - xEvent.xPostTimestamp = esp_timer_get_time(); - - if (eEvent & EV_MASTER_TRANS_START) { - atomic_store(&(xTransactionID), xEvent.xPostTimestamp); - } - xEvent.eEvent = (eEvent & ~EV_MASTER_TRANS_START); - - if( (BOOL)xPortInIsrContext() == TRUE ) { - xStatus = xQueueSendFromISR(xQueueMasterHdl, (const void*)&xEvent, &xHigherPriorityTaskWoken); - if ( xHigherPriorityTaskWoken ) { - portYIELD_FROM_ISR(); - } - if (xStatus != pdTRUE) { - ESP_EARLY_LOGV(MB_PORT_TAG, "%s: Post message failure = %d.", __func__, xStatus); - return FALSE; - } - } else { - xStatus = xQueueSend(xQueueMasterHdl, (const void*)&xEvent, MB_EVENT_QUEUE_TIMEOUT); - MB_PORT_CHECK((xStatus == pdTRUE), FALSE, "%s: Post message failure.", __func__); - } - return TRUE; -} - -BOOL -xMBMasterPortEventGet(xMBMasterEventType *peEvent) -{ - assert(xQueueMasterHdl != NULL); - BOOL xEventHappened = FALSE; - - if (xQueueReceive(xQueueMasterHdl, peEvent, portMAX_DELAY) == pdTRUE) { - peEvent->xTransactionId = atomic_load(&xTransactionID); - // Set event bits in confirmation group (for synchronization with port task) - xEventGroupSetBits(xEventGroupMasterConfirmHdl, peEvent->eEvent); - peEvent->xGetTimestamp = esp_timer_get_time(); - xEventHappened = TRUE; - } - return xEventHappened; -} - -eMBMasterEventEnum -xMBMasterPortFsmWaitConfirmation( eMBMasterEventEnum eEventMask, ULONG ulTimeout) -{ - EventBits_t uxBits; - uxBits = xEventGroupWaitBits( xEventGroupMasterConfirmHdl, // The event group being tested. - eEventMask, // The bits within the event group to wait for. - pdFALSE, // Keep masked bits. - pdFALSE, // Don't wait for both bits, either bit will do. - ulTimeout); // Wait timeout for either bit to be set. - if (ulTimeout && uxBits) { - // Clear confirmation events that where set in the mask - xEventGroupClearBits( xEventGroupMasterConfirmHdl, (uxBits & eEventMask) ); - } - return (eMBMasterEventEnum)(uxBits & eEventMask); -} - -uint64_t xMBMasterPortGetTransactionId( ) -{ - return atomic_load(&xTransactionID); -} - -// This function is initialize the OS resource for modbus master. -void vMBMasterOsResInit( void ) -{ - xResourceMasterHdl = xSemaphoreCreateBinary(); - MB_PORT_CHECK((xResourceMasterHdl != NULL), ; , "%s: Resource create error.", __func__); -} - -/** - * This function is take Mobus Master running resource. - * Note:The resource is define by Operating System. - * - * @param lTimeOut the waiting time. - * - * @return resource take result - */ -BOOL xMBMasterRunResTake( LONG lTimeOut ) -{ - BaseType_t xStatus = pdTRUE; - xStatus = xSemaphoreTake( xResourceMasterHdl, lTimeOut ); - MB_PORT_CHECK((xStatus == pdTRUE), FALSE , "%s: Resource take failure.", __func__); - ESP_LOGD(MB_PORT_TAG,"%s:Take MB resource (%lu ticks).", __func__, lTimeOut); - return TRUE; -} - -/** - * This function is release Modbus Master running resource. - * Note:The resource is define by Operating System. If you not use OS this function can be empty. - */ -void vMBMasterRunResRelease( void ) -{ - BaseType_t xStatus = pdFALSE; - xStatus = xSemaphoreGive( xResourceMasterHdl ); - if (xStatus != pdTRUE) { - ESP_LOGD(MB_PORT_TAG,"%s: Release resource fail.", __func__); - } -} - -/** - * This is modbus master respond timeout error process callback function. - * @note There functions will block modbus master poll while execute OS waiting. - * - * @param xTransId - the identification of the trasaction - * @param ucDestAddress destination salve address - * @param pucRecvData current receive data pointer - * @param ucRecvLength current length of receive buffer - * @param pucSendData Send buffer data - * @param ucSendLength Send buffer length - * - */ -void vMBMasterErrorCBRespondTimeout(uint64_t xTransId, UCHAR ucDestAddress, const UCHAR* pucSendData, USHORT ucSendLength) -{ - (void)xEventGroupSetBits( xEventGroupMasterHdl, EV_MASTER_ERROR_RESPOND_TIMEOUT ); - ESP_LOGD(MB_PORT_TAG,"%s:Callback respond timeout.", __func__); - if (vMBMasterErrorCBUserHandler) { - vMBMasterErrorCBUserHandler( xTransId, - (USHORT)EV_ERROR_RESPOND_TIMEOUT, ucDestAddress, - NULL, 0, - pucSendData, ucSendLength ); - } -} - -/** - * This is modbus master receive data error process callback function. - * @note There functions will block modbus master poll while execute OS waiting. - * - * @param xTransId - the identification of the trasaction - * @param ucDestAddress destination salve address - * @param pucRecvData current receive data pointer - * @param ucRecvLength current length of receive buffer - * @param pucSendData Send buffer data - * @param ucSendLength Send buffer length - */ -void vMBMasterErrorCBReceiveData(uint64_t xTransId, UCHAR ucDestAddress, - const UCHAR* pucRecvData, USHORT ucRecvLength, - const UCHAR* pucSendData, USHORT ucSendLength) -{ - (void)xEventGroupSetBits( xEventGroupMasterHdl, EV_MASTER_ERROR_RECEIVE_DATA ); - ESP_LOGD(MB_PORT_TAG,"%s:Callback receive data failure.", __func__); - if (vMBMasterErrorCBUserHandler) { - vMBMasterErrorCBUserHandler( xTransId, - (USHORT)EV_ERROR_RECEIVE_DATA, ucDestAddress, - pucRecvData, ucRecvLength, - pucSendData, ucSendLength ); - } -} - -/** - * This is modbus master execute function error process callback function. - * @note There functions will block modbus master poll while execute OS waiting. - * So,for real-time of system.Do not execute too much waiting process. - * - * @param xTransId - the identification of the trasaction - * @param ucDestAddress destination salve address - * @param pucRecvData current receive data pointer - * @param ucRecvLength current length of receive buffer - * @param pucSendData Send buffer data - * @param ucSendLength Send buffer length - * - */ -void vMBMasterErrorCBExecuteFunction(uint64_t xTransId, UCHAR ucDestAddress, - const UCHAR* pucRecvData, USHORT ucRecvLength, - const UCHAR* pucSendData, USHORT ucSendLength) -{ - xEventGroupSetBits( xEventGroupMasterHdl, EV_MASTER_ERROR_EXECUTE_FUNCTION ); - ESP_LOGD(MB_PORT_TAG,"%s:Callback execute data handler failure.", __func__); - if (vMBMasterErrorCBUserHandler) { - vMBMasterErrorCBUserHandler( xTransId, - (USHORT)EV_ERROR_EXECUTE_FUNCTION, ucDestAddress, - pucRecvData, ucRecvLength, - pucSendData, ucSendLength ); - } -} - -/** - * This is modbus master request process success callback function. - * @note There functions will block modbus master poll while execute OS waiting. - * So,for real-time of system. Do not execute too much waiting process. - * - * @param xTransId - the identification of the trasaction - * @param ucDestAddress destination salve address - * @param pucRecvData current receive data pointer - * @param ucRecvLength current length of receive buffer - * @param pucSendData Send buffer data - * @param ucSendLength Send buffer length - */ -void vMBMasterCBRequestSuccess(uint64_t xTransId, UCHAR ucDestAddress, - const UCHAR* pucRecvData, USHORT ucRecvLength, - const UCHAR* pucSendData, USHORT ucSendLength) -{ - (void)xEventGroupSetBits( xEventGroupMasterHdl, EV_MASTER_PROCESS_SUCCESS ); - ESP_LOGD(MB_PORT_TAG,"%s: Callback request success.", __func__); - if (vMBMasterErrorCBUserHandler) { - vMBMasterErrorCBUserHandler( xTransId, - (USHORT)EV_ERROR_OK, ucDestAddress, - pucRecvData, ucRecvLength, - pucSendData, ucSendLength ); - } -} - -/** - * This function is wait for modbus master request finish and return result. - * Waiting result include request process success, request respond timeout, - * receive data error and execute function error.You can use the above callback function. - * @note If you are use OS, you can use OS's event mechanism. Otherwise you have to run - * much user custom delay for waiting. - * - * @return request error code - */ -eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ) { - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - eMBMasterEventEnum xRecvedEvent; - - EventBits_t uxBits = xEventGroupWaitBits( xEventGroupMasterHdl, // The event group being tested. - MB_EVENT_REQ_MASK, // The bits within the event group to wait for. - pdTRUE, // Masked bits should be cleared before returning. - pdFALSE, // Don't wait for both bits, either bit will do. - portMAX_DELAY ); // Wait forever for either bit to be set. - xRecvedEvent = (eMBMasterEventEnum)(uxBits); - if (xRecvedEvent) { - ESP_LOGD(MB_PORT_TAG,"%s: returned event = 0x%x", __func__, (int)xRecvedEvent); - if (!(xRecvedEvent & MB_EVENT_REQ_MASK)) { - // if we wait for certain event bits but get from poll subset - ESP_LOGE(MB_PORT_TAG,"%s: incorrect event set = 0x%x", __func__, (int)xRecvedEvent); - } - xEventGroupSetBits( xEventGroupMasterConfirmHdl, (xRecvedEvent & MB_EVENT_REQ_MASK) ); - if (MB_PORT_CHECK_EVENT(xRecvedEvent, EV_MASTER_PROCESS_SUCCESS)) { - eErrStatus = MB_MRE_NO_ERR; - } else if (MB_PORT_CHECK_EVENT(xRecvedEvent, EV_MASTER_ERROR_RESPOND_TIMEOUT)) { - eErrStatus = MB_MRE_TIMEDOUT; - } else if (MB_PORT_CHECK_EVENT(xRecvedEvent, EV_MASTER_ERROR_RECEIVE_DATA)) { - eErrStatus = MB_MRE_REV_DATA; - } else if (MB_PORT_CHECK_EVENT(xRecvedEvent, EV_MASTER_ERROR_EXECUTE_FUNCTION)) { - eErrStatus = MB_MRE_EXE_FUN; - } - } else { - ESP_LOGE(MB_PORT_TAG,"%s: Incorrect event or timeout xRecvedEvent = 0x%x", __func__, (int)uxBits); - // https://github.com/espressif/esp-idf/issues/5275 - // if a no event is received, that means vMBMasterPortEventClose() - // has been closed, so event group has been deleted by FreeRTOS, which - // triggers the send of 0 value to the event group to unlock this task - // waiting on it. For this patch, handles it as a time out without assert. - eErrStatus = MB_MRE_TIMEDOUT; - } - return eErrStatus; -} - -void vMBMasterPortEventClose(void) -{ - if (xEventGroupMasterHdl) { - vEventGroupDelete(xEventGroupMasterHdl); - xEventGroupMasterHdl = NULL; - } - if (xQueueMasterHdl) { - vQueueDelete(xQueueMasterHdl); - xQueueMasterHdl = NULL; - } - if (xEventGroupMasterConfirmHdl) { - vEventGroupDelete(xEventGroupMasterConfirmHdl); - xEventGroupMasterConfirmHdl = NULL; - } - if (xResourceMasterHdl) { - vSemaphoreDelete(xResourceMasterHdl); - xResourceMasterHdl = NULL; - } -} - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/port/portother.c b/managed_components/espressif__esp-modbus/freemodbus/port/portother.c deleted file mode 100755 index 180de5b..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/port/portother.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2010 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Demo Application - * Copyright (C) 2010 Christian Walter - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: portother.c,v 1.1 2010/06/06 13:07:20 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include -#include -#include - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" - -/* ----------------------- Modbus includes ----------------------------------*/ - -/* ----------------------- Variables ----------------------------------------*/ - -/* ----------------------- Start implementation -----------------------------*/ - -BOOL -bMBPortIsWithinException( void ) -{ - BOOL bIsWithinException = xPortInIsrContext(); - return bIsWithinException; -} - -void -vMBPortClose( void ) -{ - extern void vMBPortSerialClose( void ); - extern void vMBPortTimerClose( void ); - extern void vMBPortEventClose( void ); - vMBPortSerialClose( ); - vMBPortTimerClose( ); - vMBPortEventClose( ); -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/port/portother_m.c b/managed_components/espressif__esp-modbus/freemodbus/port/portother_m.c deleted file mode 100755 index fa2d421..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/port/portother_m.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Demo Application - * Copyright (c) 2006 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: portother.c,v 1.1 2010/06/06 13:07:20 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include -#include -#include -#include - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb_m.h" -#include "mbport.h" - -/* ----------------------- Modbus includes ----------------------------------*/ - -/* ----------------------- Variables ----------------------------------------*/ - -/* ----------------------- Start implementation -----------------------------*/ - -void -vMBMasterPortClose( void ) -{ - extern void vMBMasterPortSerialClose( void ); - extern void vMBMasterPortTimerClose( void ); - extern void vMBMasterPortEventClose( void ); - vMBMasterPortSerialClose( ); - vMBMasterPortTimerClose( ); - vMBMasterPortEventClose( ); -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/port/portserial.c b/managed_components/espressif__esp-modbus/freemodbus/port/portserial.c deleted file mode 100755 index 84cf3a1..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/port/portserial.c +++ /dev/null @@ -1,288 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2010 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Port - * Copyright (C) 2010 Christian Walter - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: portother.c,v 1.1 2010/06/06 13:07:20 wolti Exp $ - */ - -#include "driver/uart.h" -#include "port.h" -#include "driver/uart.h" -#include "freertos/queue.h" // for queue support -#include "soc/uart_periph.h" -#include "driver/gpio.h" -#include "esp_log.h" // for esp_log -#include "esp_err.h" // for ESP_ERROR_CHECK macro - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" -#include "sdkconfig.h" // for KConfig options -#include "port_serial_slave.h" - -// Note: This code uses mixed coding standard from legacy IDF code and used freemodbus stack - -// A queue to handle UART event. -static QueueHandle_t xMbUartQueue; -static TaskHandle_t xMbTaskHandle; -static const CHAR *TAG = "MB_SERIAL"; - -// The UART hardware port number -static UCHAR ucUartNumber = UART_NUM_MAX - 1; - -static BOOL bRxStateEnabled = FALSE; // Receiver enabled flag -static BOOL bTxStateEnabled = FALSE; // Transmitter enabled flag - -void vMBPortSerialEnable(BOOL bRxEnable, BOOL bTxEnable) -{ - // This function can be called from xMBRTUTransmitFSM() of different task - if (bTxEnable) { - bTxStateEnabled = TRUE; - } else { - bTxStateEnabled = FALSE; - } - if (bRxEnable) { - //uart_enable_rx_intr(ucUartNumber); - bRxStateEnabled = TRUE; - vTaskResume(xMbTaskHandle); // Resume receiver task - } else { - vTaskSuspend(xMbTaskHandle); // Block receiver task - bRxStateEnabled = FALSE; - } -} - -static USHORT usMBPortSerialRxPoll(size_t xEventSize) -{ - BOOL xReadStatus = TRUE; - USHORT usCnt = 0; - - if (bRxStateEnabled) { - // Get received packet into Rx buffer - while(xReadStatus && (usCnt++ <= xEventSize)) { - // Call the Modbus stack callback function and let it fill the buffers. - xReadStatus = pxMBFrameCBByteReceived(); // callback to execute receive FSM - } - uart_flush_input(ucUartNumber); - // Send event EV_FRAME_RECEIVED to allow stack process packet -#if !CONFIG_FMB_TIMER_PORT_ENABLED - pxMBPortCBTimerExpired(); -#endif - ESP_LOGD(TAG, "RX: %u bytes\n", (unsigned)usCnt); - } - return usCnt; -} - -BOOL xMBPortSerialTxPoll(void) -{ - USHORT usCount = 0; - BOOL bNeedPoll = TRUE; - - if( bTxStateEnabled ) { - // Continue while all response bytes put in buffer or out of buffer - while((bNeedPoll) && (usCount++ < MB_SERIAL_BUF_SIZE)) { - // Calls the modbus stack callback function to let it fill the UART transmit buffer. - bNeedPoll = pxMBFrameCBTransmitterEmpty( ); // callback to transmit FSM - } - ESP_LOGD(TAG, "MB_TX_buffer send: (%u) bytes\n", (unsigned)usCount); - // Waits while UART sending the packet - esp_err_t xTxStatus = uart_wait_tx_done(ucUartNumber, MB_SERIAL_TX_TOUT_TICKS); - vMBPortSerialEnable(TRUE, FALSE); - MB_PORT_CHECK((xTxStatus == ESP_OK), FALSE, "mb serial sent buffer failure."); - return TRUE; - } - return FALSE; -} - -static void vUartTask(void *pvParameters) -{ - uart_event_t xEvent; - USHORT usResult = 0; - for(;;) { - if (xMBPortSerialWaitEvent(xMbUartQueue, (void*)&xEvent, portMAX_DELAY)) { - ESP_LOGD(TAG, "MB_uart[%u] event:", (unsigned)ucUartNumber); - switch(xEvent.type) { - //Event of UART receving data - case UART_DATA: - ESP_LOGD(TAG,"Data event, length: %u", (unsigned)xEvent.size); - // This flag set in the event means that no more - // data received during configured timeout and UART TOUT feature is triggered - if (xEvent.timeout_flag) { - // Get buffered data length - ESP_ERROR_CHECK(uart_get_buffered_data_len(ucUartNumber, &xEvent.size)); - // Read received data and send it to modbus stack - usResult = usMBPortSerialRxPoll(xEvent.size); - ESP_LOGD(TAG,"Timeout occured, processed: %u bytes", (unsigned)usResult); - } - break; - //Event of HW FIFO overflow detected - case UART_FIFO_OVF: - ESP_LOGD(TAG, "hw fifo overflow"); - xQueueReset(xMbUartQueue); - break; - //Event of UART ring buffer full - case UART_BUFFER_FULL: - ESP_LOGD(TAG, "ring buffer full"); - xQueueReset(xMbUartQueue); - uart_flush_input(ucUartNumber); - break; - //Event of UART RX break detected - case UART_BREAK: - ESP_LOGD(TAG, "uart rx break"); - break; - //Event of UART parity check error - case UART_PARITY_ERR: - ESP_LOGD(TAG, "uart parity error"); - break; - //Event of UART frame error - case UART_FRAME_ERR: - ESP_LOGD(TAG, "uart frame error"); - break; - default: - ESP_LOGD(TAG, "uart event type: %u", (unsigned)xEvent.type); - break; - } - } - } - vTaskDelete(NULL); -} - -BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, - UCHAR ucDataBits, eMBParity eParity) -{ - esp_err_t xErr = ESP_OK; - // Set communication port number - ucUartNumber = ucPORT; - // Configure serial communication parameters - UCHAR ucParity = UART_PARITY_DISABLE; - UCHAR ucData = UART_DATA_8_BITS; - switch(eParity){ - case MB_PAR_NONE: - ucParity = UART_PARITY_DISABLE; - break; - case MB_PAR_ODD: - ucParity = UART_PARITY_ODD; - break; - case MB_PAR_EVEN: - ucParity = UART_PARITY_EVEN; - break; - default: - ESP_LOGE(TAG, "Incorrect parity option: %u", (unsigned)eParity); - return FALSE; - } - switch(ucDataBits){ - case 5: - ucData = UART_DATA_5_BITS; - break; - case 6: - ucData = UART_DATA_6_BITS; - break; - case 7: - ucData = UART_DATA_7_BITS; - break; - case 8: - ucData = UART_DATA_8_BITS; - break; - default: - ucData = UART_DATA_8_BITS; - break; - } - uart_config_t xUartConfig = { - .baud_rate = ulBaudRate, - .data_bits = ucData, - .parity = ucParity, - .stop_bits = UART_STOP_BITS_1, - .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, - .rx_flow_ctrl_thresh = 2, -#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)) - .source_clk = UART_SCLK_DEFAULT, -#else - .source_clk = UART_SCLK_APB, -#endif - }; - // Set UART config - xErr = uart_param_config(ucUartNumber, &xUartConfig); - MB_PORT_CHECK((xErr == ESP_OK), - FALSE, "mb config failure, uart_param_config() returned (0x%x).", (int)xErr); - // Install UART driver, and get the queue. - xErr = uart_driver_install(ucUartNumber, MB_SERIAL_BUF_SIZE, MB_SERIAL_BUF_SIZE, - MB_QUEUE_LENGTH, &xMbUartQueue, MB_PORT_SERIAL_ISR_FLAG); - MB_PORT_CHECK((xErr == ESP_OK), FALSE, - "mb serial driver failure, uart_driver_install() returned (0x%x).", (int)xErr); -#if !CONFIG_FMB_TIMER_PORT_ENABLED - // Set timeout for TOUT interrupt (T3.5 modbus time) - xErr = uart_set_rx_timeout(ucUartNumber, MB_SERIAL_TOUT); - MB_PORT_CHECK((xErr == ESP_OK), FALSE, - "mb serial set rx timeout failure, uart_set_rx_timeout() returned (0x%x).", (int)xErr); -#endif - - // Set always timeout flag to trigger timeout interrupt even after rx fifo full - uart_set_always_rx_timeout(ucUartNumber, true); - - // Create a task to handle UART events - BaseType_t xStatus = xTaskCreatePinnedToCore(vUartTask, "uart_queue_task", - MB_SERIAL_TASK_STACK_SIZE, - NULL, MB_SERIAL_TASK_PRIO, - &xMbTaskHandle, MB_PORT_TASK_AFFINITY); - if (xStatus != pdPASS) { - vTaskDelete(xMbTaskHandle); - // Force exit from function with failure - MB_PORT_CHECK(FALSE, FALSE, - "mb stack serial task creation error. xTaskCreate() returned (0x%x).", - (int)xStatus); - } else { - vTaskSuspend(xMbTaskHandle); // Suspend serial task while stack is not started - } - return TRUE; -} - -void vMBPortSerialClose(void) -{ - (void)vTaskSuspend(xMbTaskHandle); - (void)vTaskDelete(xMbTaskHandle); - ESP_ERROR_CHECK(uart_driver_delete(ucUartNumber)); -} - -BOOL xMBPortSerialPutByte(CHAR ucByte) -{ - // Send one byte to UART transmission buffer - // This function is called by Modbus stack - UCHAR ucLength = uart_write_bytes(ucUartNumber, &ucByte, 1); - return (ucLength == 1); -} - -// Get one byte from intermediate RX buffer -BOOL xMBPortSerialGetByte(CHAR* pucByte) -{ - assert(pucByte != NULL); - USHORT usLength = uart_read_bytes(ucUartNumber, (uint8_t*)pucByte, 1, MB_SERIAL_RX_TOUT_TICKS); - return (usLength == 1); -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/port/portserial_m.c b/managed_components/espressif__esp-modbus/freemodbus/port/portserial_m.c deleted file mode 100755 index c037c00..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/port/portserial_m.c +++ /dev/null @@ -1,371 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Port - * Copyright (C) 2013 Armink - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: portserial.c,v 1.60 2013/08/13 15:07:05 Armink add Master Functions $ - */ - -#include -#include "driver/uart.h" -#include "soc/dport_access.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/queue.h" -#include "esp_log.h" -#include "sdkconfig.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "port.h" -#include "mbport.h" -#include "mb_m.h" -#include "mbrtu.h" -#include "mbconfig.h" -#include "port_serial_master.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_SERIAL_RX_SEMA_TOUT_MS (1000) -#define MB_SERIAL_RX_SEMA_TOUT (pdMS_TO_TICKS(MB_SERIAL_RX_SEMA_TOUT_MS)) -#define MB_SERIAL_RX_FLUSH_RETRY (2) - -/* ----------------------- Static variables ---------------------------------*/ -static const CHAR *TAG = "MB_MASTER_SERIAL"; - -// A queue to handle UART event. -static QueueHandle_t xMbUartQueue; -static TaskHandle_t xMbTaskHandle; - -// The UART hardware port number -static UCHAR ucUartNumber = UART_NUM_MAX - 1; - -static BOOL bRxStateEnabled = FALSE; // Receiver enabled flag -static BOOL bTxStateEnabled = FALSE; // Transmitter enabled flag - -static SemaphoreHandle_t xMasterSemaRxHandle; // Rx blocking semaphore handle - -static BOOL xMBMasterPortRxSemaInit( void ) -{ - xMasterSemaRxHandle = xSemaphoreCreateBinary(); - MB_PORT_CHECK((xMasterSemaRxHandle != NULL), FALSE , "%s: RX semaphore create failure.", __func__); - return TRUE; -} - -static void vMBMasterPortRxSemaClose( void ) -{ - if (xMasterSemaRxHandle) { - vSemaphoreDelete(xMasterSemaRxHandle); - xMasterSemaRxHandle = NULL; - } -} - -static BOOL xMBMasterPortRxSemaTake( LONG lTimeOut ) -{ - BaseType_t xStatus = pdTRUE; - xStatus = xSemaphoreTake(xMasterSemaRxHandle, lTimeOut ); - MB_PORT_CHECK((xStatus == pdTRUE), FALSE , "%s: RX semaphore take failure.", __func__); - ESP_LOGV(MB_PORT_TAG,"%s:Take RX semaphore (%" PRIu64 " ticks).", __func__, (uint64_t)lTimeOut); - return TRUE; -} - -static void vMBMasterRxSemaRelease( void ) -{ - BaseType_t xStatus = pdFALSE; - xStatus = xSemaphoreGive(xMasterSemaRxHandle); - if (xStatus != pdTRUE) { - ESP_LOGD(MB_PORT_TAG,"%s:RX semaphore is free.", __func__); - } -} - -static BOOL vMBMasterRxSemaIsBusy( void ) -{ - BaseType_t xStatus = pdFALSE; - xStatus = (uxSemaphoreGetCount(xMasterSemaRxHandle) == 0) ? TRUE : FALSE; - return xStatus; -} - -void vMBMasterRxFlush( void ) -{ - size_t xSize = 1; - esp_err_t xErr = ESP_OK; - for (int xCount = 0; (xCount < MB_SERIAL_RX_FLUSH_RETRY) && xSize; xCount++) { - xErr = uart_get_buffered_data_len(ucUartNumber, &xSize); - MB_PORT_CHECK((xErr == ESP_OK), ; , "mb flush serial fail, error = 0x%x.", (int)xErr); - BaseType_t xStatus = xQueueReset(xMbUartQueue); - if (xStatus) { - xErr = uart_flush_input(ucUartNumber); - MB_PORT_CHECK((xErr == ESP_OK), ; , "mb flush serial fail, error = 0x%x.", (int)xErr); - } - } -} - -void vMBMasterPortSerialEnable(BOOL bRxEnable, BOOL bTxEnable) -{ - // This function can be called from xMBRTUTransmitFSM() of different task - if (bTxEnable) { - vMBMasterRxFlush(); - bTxStateEnabled = TRUE; - } else { - bTxStateEnabled = FALSE; - } - if (bRxEnable) { - bRxStateEnabled = TRUE; - vMBMasterRxSemaRelease(); - vTaskResume(xMbTaskHandle); // Resume receiver task - } else { - vTaskSuspend(xMbTaskHandle); // Block receiver task - bRxStateEnabled = FALSE; - } -} - -static USHORT usMBMasterPortSerialRxPoll(size_t xEventSize) -{ - BOOL xStatus = TRUE; - USHORT usCnt = 0; - - xStatus = xMBMasterPortRxSemaTake(MB_SERIAL_RX_SEMA_TOUT); - if (xStatus) { - while(xStatus && (usCnt++ <= xEventSize)) { - // Call the Modbus stack callback function and let it fill the stack buffers. - xStatus = pxMBMasterFrameCBByteReceived(); // callback to receive FSM - } - // The buffer is transferred into Modbus stack and is not needed here any more - uart_flush_input(ucUartNumber); - ESP_LOGD(TAG, "Received data: %u(bytes in buffer)", (unsigned)usCnt); -#if !CONFIG_FMB_TIMER_PORT_ENABLED - vMBMasterSetCurTimerMode(MB_TMODE_T35); - xStatus = pxMBMasterPortCBTimerExpired(); - if (!xStatus) { - xMBMasterPortEventPost(EV_MASTER_FRAME_RECEIVED); - ESP_LOGD(TAG, "Send additional RX ready event."); - } -#endif - } else { - ESP_LOGE(TAG, "%s: bRxState disabled but junk data (%u bytes) received. ", - __func__, (unsigned)xEventSize); - } - return usCnt; -} - -BOOL xMBMasterPortSerialTxPoll(void) -{ - USHORT usCount = 0; - BOOL bNeedPoll = TRUE; - - if( bTxStateEnabled ) { - // Continue while all response bytes put in buffer or out of buffer - while(bNeedPoll && (usCount++ < MB_SERIAL_BUF_SIZE)) { - // Calls the modbus stack callback function to let it fill the UART transmit buffer. - bNeedPoll = pxMBMasterFrameCBTransmitterEmpty( ); // callback to transmit FSM - } - ESP_LOGD(TAG, "MB_TX_buffer sent: (%u) bytes.", (unsigned)(usCount - 1)); - // Waits while UART sending the packet - esp_err_t xTxStatus = uart_wait_tx_done(ucUartNumber, MB_SERIAL_TX_TOUT_TICKS); - vMBMasterPortSerialEnable(TRUE, FALSE); - MB_PORT_CHECK((xTxStatus == ESP_OK), FALSE, "mb serial sent buffer failure."); - return TRUE; - } - return FALSE; -} - -// UART receive event task -static void vUartTask(void* pvParameters) -{ - uart_event_t xEvent; - USHORT usResult = 0; - for(;;) { - if (xMBPortSerialWaitEvent(xMbUartQueue, (void*)&xEvent, portMAX_DELAY)) { - ESP_LOGD(TAG, "MB_uart[%u] event:", (unsigned)ucUartNumber); - switch(xEvent.type) { - //Event of UART receiving data - case UART_DATA: - ESP_LOGD(TAG,"Data event, len: %u.", (unsigned)xEvent.size); - // This flag set in the event means that no more - // data received during configured timeout and UART TOUT feature is triggered - if (xEvent.timeout_flag) { - // Response is received but previous packet processing is pending - // Do not wait completion of processing and just discard received data as incorrect - if (vMBMasterRxSemaIsBusy()) { - vMBMasterRxFlush(); - break; - } - // Get buffered data length - ESP_ERROR_CHECK(uart_get_buffered_data_len(ucUartNumber, &xEvent.size)); - // Read received data and send it to modbus stack - usResult = usMBMasterPortSerialRxPoll(xEvent.size); - ESP_LOGD(TAG,"Timeout occured, processed: %u bytes", (unsigned)usResult); - } - break; - //Event of HW FIFO overflow detected - case UART_FIFO_OVF: - ESP_LOGD(TAG, "hw fifo overflow."); - xQueueReset(xMbUartQueue); - break; - //Event of UART ring buffer full - case UART_BUFFER_FULL: - ESP_LOGD(TAG, "ring buffer full."); - xQueueReset(xMbUartQueue); - uart_flush_input(ucUartNumber); - break; - //Event of UART RX break detected - case UART_BREAK: - ESP_LOGD(TAG, "uart rx break."); - break; - //Event of UART parity check error - case UART_PARITY_ERR: - ESP_LOGD(TAG, "uart parity error."); - xQueueReset(xMbUartQueue); - uart_flush_input(ucUartNumber); - break; - //Event of UART frame error - case UART_FRAME_ERR: - ESP_LOGD(TAG, "uart frame error."); - xQueueReset(xMbUartQueue); - uart_flush_input(ucUartNumber); - break; - default: - ESP_LOGD(TAG, "uart event type: %u.", (unsigned)xEvent.type); - break; - } - } - } - vTaskDelete(NULL); -} - -/* ----------------------- Start implementation -----------------------------*/ -BOOL xMBMasterPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity ) -{ - esp_err_t xErr = ESP_OK; - // Set communication port number - ucUartNumber = ucPORT; - // Configure serial communication parameters - UCHAR ucParity = UART_PARITY_DISABLE; - UCHAR ucData = UART_DATA_8_BITS; - switch(eParity){ - case MB_PAR_NONE: - ucParity = UART_PARITY_DISABLE; - break; - case MB_PAR_ODD: - ucParity = UART_PARITY_ODD; - break; - case MB_PAR_EVEN: - ucParity = UART_PARITY_EVEN; - break; - default: - ESP_LOGE(TAG, "Incorrect parity option: %u", (unsigned)eParity); - return FALSE; - } - switch(ucDataBits){ - case 5: - ucData = UART_DATA_5_BITS; - break; - case 6: - ucData = UART_DATA_6_BITS; - break; - case 7: - ucData = UART_DATA_7_BITS; - break; - case 8: - ucData = UART_DATA_8_BITS; - break; - default: - ucData = UART_DATA_8_BITS; - break; - } - uart_config_t xUartConfig = { - .baud_rate = ulBaudRate, - .data_bits = ucData, - .parity = ucParity, - .stop_bits = UART_STOP_BITS_1, - .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, - .rx_flow_ctrl_thresh = 2, -#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)) - .source_clk = UART_SCLK_DEFAULT, -#else - .source_clk = UART_SCLK_APB, -#endif - }; - // Set UART config - xErr = uart_param_config(ucUartNumber, &xUartConfig); - MB_PORT_CHECK((xErr == ESP_OK), - FALSE, "mb config failure, uart_param_config() returned (0x%x).", (int)xErr); - // Install UART driver, and get the queue. - xErr = uart_driver_install(ucUartNumber, MB_SERIAL_BUF_SIZE, MB_SERIAL_BUF_SIZE, - MB_QUEUE_LENGTH, &xMbUartQueue, MB_PORT_SERIAL_ISR_FLAG); - MB_PORT_CHECK((xErr == ESP_OK), FALSE, - "mb serial driver failure, uart_driver_install() returned (0x%x).", (int)xErr); - // Set timeout for TOUT interrupt (T3.5 modbus time) - xErr = uart_set_rx_timeout(ucUartNumber, MB_SERIAL_TOUT); - MB_PORT_CHECK((xErr == ESP_OK), FALSE, - "mb serial set rx timeout failure, uart_set_rx_timeout() returned (0x%x).", (int)xErr); - - // Set always timeout flag to trigger timeout interrupt even after rx fifo full - uart_set_always_rx_timeout(ucUartNumber, true); - MB_PORT_CHECK((xMBMasterPortRxSemaInit()), FALSE, - "mb serial RX semaphore create fail."); - // Create a task to handle UART events - BaseType_t xStatus = xTaskCreatePinnedToCore(vUartTask, "uart_queue_task", - MB_SERIAL_TASK_STACK_SIZE, - NULL, MB_SERIAL_TASK_PRIO, - &xMbTaskHandle, MB_PORT_TASK_AFFINITY); - if (xStatus != pdPASS) { - vTaskDelete(xMbTaskHandle); - // Force exit from function with failure - MB_PORT_CHECK(FALSE, FALSE, - "mb stack serial task creation error. xTaskCreate() returned (0x%x).", (int)xStatus); - } else { - vTaskSuspend(xMbTaskHandle); // Suspend serial task while stack is not started - } - ESP_LOGD(MB_PORT_TAG,"%s Init serial.", __func__); - return TRUE; -} - -void vMBMasterPortSerialClose(void) -{ - vMBMasterPortRxSemaClose(); - (void)vTaskDelete(xMbTaskHandle); - ESP_ERROR_CHECK(uart_driver_delete(ucUartNumber)); -} - -BOOL xMBMasterPortSerialPutByte(CHAR ucByte) -{ - // Send one byte to UART transmission buffer - // This function is called by Modbus stack - UCHAR ucLength = uart_write_bytes(ucUartNumber, &ucByte, 1); - return (ucLength == 1); -} - -// Get one byte from intermediate RX buffer -BOOL xMBMasterPortSerialGetByte(CHAR* pucByte) -{ - assert(pucByte != NULL); - USHORT usLength = uart_read_bytes(ucUartNumber, (uint8_t*)pucByte, 1, MB_SERIAL_RX_TOUT_TICKS); - return (usLength == 1); -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/port/porttimer.c b/managed_components/espressif__esp-modbus/freemodbus/port/porttimer.c deleted file mode 100755 index e0215cb..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/port/porttimer.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2010 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Port Demo Application - * Copyright (C) 2010 Christian Walter - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: portother.c,v 1.1 2010/06/06 13:07:20 wolti Exp $ - */ -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" -#include "sdkconfig.h" - -#if CONFIG_FMB_TIMER_PORT_ENABLED - -static const char *TAG = "MBS_TIMER"; - -static xTimerContext_t* pxTimerContext = NULL; - -/* ----------------------- Start implementation -----------------------------*/ -static void IRAM_ATTR vTimerAlarmCBHandler(void *param) -{ - pxMBPortCBTimerExpired(); // Timer expired callback function - pxTimerContext->xTimerState = TRUE; - ESP_EARLY_LOGD(TAG, "Slave timeout triggered."); -} -#endif - -BOOL xMBPortTimersInit(USHORT usTimeOut50us) -{ -#if CONFIG_FMB_TIMER_PORT_ENABLED - MB_PORT_CHECK((usTimeOut50us > 0), FALSE, - "Modbus timeout discreet is incorrect."); - MB_PORT_CHECK(!pxTimerContext, FALSE, - "Modbus timer is already created."); - pxTimerContext = calloc(1, sizeof(xTimerContext_t)); - if (!pxTimerContext) { - return FALSE; - } - pxTimerContext->xTimerIntHandle = NULL; - // Save timer reload value for Modbus T35 period - pxTimerContext->usT35Ticks = usTimeOut50us; - esp_timer_create_args_t xTimerConf = { - .callback = vTimerAlarmCBHandler, - .arg = NULL, -#if (MB_TIMER_SUPPORTS_ISR_DISPATCH_METHOD && CONFIG_FMB_TIMER_USE_ISR_DISPATCH_METHOD) - .dispatch_method = ESP_TIMER_ISR, -#else - .dispatch_method = ESP_TIMER_TASK, -#endif - .name = "MBS_T35timer" - }; - // Create Modbus timer - esp_err_t xErr = esp_timer_create(&xTimerConf, &(pxTimerContext->xTimerIntHandle)); - if (xErr) { - return FALSE; - } -#endif - return TRUE; -} - -void vMBPortTimersEnable(void) -{ -#if CONFIG_FMB_TIMER_PORT_ENABLED - MB_PORT_CHECK((pxTimerContext && pxTimerContext->xTimerIntHandle), ; , - "timer is not initialized."); - uint64_t xToutUs = (pxTimerContext->usT35Ticks * MB_TIMER_TICK_TIME_US); - esp_timer_stop(pxTimerContext->xTimerIntHandle); - esp_timer_start_once(pxTimerContext->xTimerIntHandle, xToutUs); - pxTimerContext->xTimerState = FALSE; -#endif -} - -void MB_PORT_ISR_ATTR -vMBPortTimersDisable(void) -{ -#if CONFIG_FMB_TIMER_PORT_ENABLED - // Disable timer alarm - esp_timer_stop(pxTimerContext->xTimerIntHandle); -#endif -} - -void vMBPortTimerClose(void) -{ -#if CONFIG_FMB_TIMER_PORT_ENABLED - // Delete active timer - if (pxTimerContext) { - if (pxTimerContext->xTimerIntHandle) { - esp_timer_stop(pxTimerContext->xTimerIntHandle); - esp_timer_delete(pxTimerContext->xTimerIntHandle); - } - free(pxTimerContext); - pxTimerContext = NULL; - } -#endif -} - -void vMBPortTimersDelay(USHORT usTimeOutMS) -{ - vTaskDelay(usTimeOutMS / portTICK_PERIOD_MS); -} \ No newline at end of file diff --git a/managed_components/espressif__esp-modbus/freemodbus/port/porttimer_m.c b/managed_components/espressif__esp-modbus/freemodbus/port/porttimer_m.c deleted file mode 100755 index 9071efc..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/port/porttimer_m.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Armink - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Port - * Copyright (C) 2013 Armink - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: porttimer_m.c,v 1.60 2013/08/13 15:07:05 Armink add Master Functions$ - */ - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb_m.h" -#include "mbport.h" -#include "sdkconfig.h" - -static const char *TAG = "MBM_TIMER"; - -/* ----------------------- Variables ----------------------------------------*/ -static xTimerContext_t* pxTimerContext = NULL; - -/* ----------------------- Start implementation -----------------------------*/ -static void IRAM_ATTR vTimerAlarmCBHandler(void *param) -{ - pxMBMasterPortCBTimerExpired(); // Timer expired callback function - pxTimerContext->xTimerState = TRUE; - ESP_EARLY_LOGD(TAG, "Timer mode: (%u) triggered", (unsigned)xMBMasterGetCurTimerMode()); -} - -BOOL xMBMasterPortTimersInit(USHORT usTimeOut50us) -{ - MB_PORT_CHECK((usTimeOut50us > 0), FALSE, - "Modbus timeout discreet is incorrect."); - MB_PORT_CHECK(!pxTimerContext, FALSE, - "Modbus timer is already created."); - pxTimerContext = calloc(1, sizeof(xTimerContext_t)); - if (!pxTimerContext) { - return FALSE; - } - pxTimerContext->xTimerIntHandle = NULL; - // Save timer reload value for Modbus T35 period - pxTimerContext->usT35Ticks = usTimeOut50us; - esp_timer_create_args_t xTimerConf = { - .callback = vTimerAlarmCBHandler, - .arg = NULL, -#if (MB_TIMER_SUPPORTS_ISR_DISPATCH_METHOD && CONFIG_FMB_TIMER_USE_ISR_DISPATCH_METHOD) - .dispatch_method = ESP_TIMER_ISR, -#else - .dispatch_method = ESP_TIMER_TASK, -#endif - .name = "MBM_T35timer" - }; - // Create Modbus timer - esp_err_t xErr = esp_timer_create(&xTimerConf, &(pxTimerContext->xTimerIntHandle)); - if (xErr) { - return FALSE; - } - return TRUE; -} - -// Set timer alarm value -static BOOL xMBMasterPortTimersEnable(uint64_t xToutUs) -{ - MB_PORT_CHECK(pxTimerContext && (pxTimerContext->xTimerIntHandle), FALSE, - "timer is not initialized."); - MB_PORT_CHECK((xToutUs > 0), FALSE, - "incorrect tick value for timer = (0x%llu).", xToutUs); - esp_timer_stop(pxTimerContext->xTimerIntHandle); - esp_timer_start_once(pxTimerContext->xTimerIntHandle, xToutUs); - pxTimerContext->xTimerState = FALSE; - return TRUE; -} - -void vMBMasterPortTimersT35Enable(void) -{ - uint64_t xToutUs = (pxTimerContext->usT35Ticks * MB_TIMER_TICK_TIME_US); - - // Set current timer mode, don't change it. - vMBMasterSetCurTimerMode(MB_TMODE_T35); - // Set timer alarm - (void)xMBMasterPortTimersEnable(xToutUs); -} - -void vMBMasterPortTimersConvertDelayEnable(void) -{ - // Covert time in milliseconds into ticks - uint64_t xToutUs = (MB_MASTER_DELAY_MS_CONVERT * 1000); - - // Set current timer mode - vMBMasterSetCurTimerMode(MB_TMODE_CONVERT_DELAY); - ESP_LOGD(MB_PORT_TAG,"%s Convert delay enable.", __func__); - (void)xMBMasterPortTimersEnable(xToutUs); -} - -void vMBMasterPortTimersRespondTimeoutEnable(void) -{ - uint64_t xToutUs = (MB_MASTER_TIMEOUT_MS_RESPOND * 1000); - - vMBMasterSetCurTimerMode(MB_TMODE_RESPOND_TIMEOUT); - ESP_LOGD(MB_PORT_TAG,"%s Respond enable timeout.", __func__); - (void)xMBMasterPortTimersEnable(xToutUs); -} - -void MB_PORT_ISR_ATTR -vMBMasterPortTimersDisable() -{ - // Disable timer alarm - esp_timer_stop(pxTimerContext->xTimerIntHandle); -} - -void vMBMasterPortTimerClose(void) -{ - // Delete active timer - if (pxTimerContext) { - if (pxTimerContext->xTimerIntHandle) { - esp_timer_stop(pxTimerContext->xTimerIntHandle); - esp_timer_delete(pxTimerContext->xTimerIntHandle); - } - free(pxTimerContext); - pxTimerContext = NULL; - } -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/serial_master/modbus_controller/mbc_serial_master.c b/managed_components/espressif__esp-modbus/freemodbus/serial_master/modbus_controller/mbc_serial_master.c deleted file mode 100755 index 307dca2..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/serial_master/modbus_controller/mbc_serial_master.c +++ /dev/null @@ -1,735 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -// mbc_serial_master.c -// Serial master implementation of the Modbus controller - -#include // for calculation of time stamp in milliseconds -#include "esp_log.h" // for log_write -#include // for memcpy -#include "freertos/FreeRTOS.h" // for task creation and queue access -#include "freertos/task.h" // for task api access -#include "freertos/event_groups.h" // for event groups -#include "freertos/queue.h" // for queue api access -#include "mb_m.h" // for modbus stack master types definition -#include "port.h" // for port callback functions -#include "mbutils.h" // for mbutils functions definition for stack callback -#include "sdkconfig.h" // for KConfig values -#include "esp_modbus_common.h" // for common types -#include "esp_modbus_master.h" // for public master types -#include "mbc_master.h" // for private master types -#include "mbc_serial_master.h" // for serial master create function and types - -// The Modbus Transmit Poll function defined in port -extern BOOL xMBMasterPortSerialTxPoll(void); - -/*-----------------------Master mode use these variables----------------------*/ -// Actual wait time depends on the response timer -#define MB_SERIAL_API_RESP_TICS (pdMS_TO_TICKS(MB_MAX_RESPONSE_TIME_MS)) - -static mb_master_interface_t* mbm_interface_ptr = NULL; -static const char *TAG = "MB_CONTROLLER_MASTER"; - -// Modbus event processing task -static void modbus_master_task(void *pvParameters) -{ - // The interface must be initialized before start of state machine - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - // Main Modbus stack processing cycle - for (;;) { - // Wait for poll events - BaseType_t status = xEventGroupWaitBits(mbm_opts->mbm_event_group, - (BaseType_t)(MB_EVENT_STACK_STARTED), - pdFALSE, // do not clear bits - pdFALSE, - portMAX_DELAY); - // Check if stack started then poll for data - if (status & MB_EVENT_STACK_STARTED) { - (void)eMBMasterPoll(); // Allow stack to process data - // Send response buffer if ready to be sent - BOOL xSentState = xMBMasterPortSerialTxPoll(); - if (xSentState) { - // Let state machine know that request frame was transmitted out - (void)xMBMasterPortEventPost(EV_MASTER_FRAME_SENT); - } - } - } -} - -// Setup Modbus controller parameters -static esp_err_t mbc_serial_master_setup(void* comm_info) -{ - MB_MASTER_CHECK((mbm_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface uninitialized."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - - const mb_master_comm_info_t* comm_info_ptr = (mb_master_comm_info_t*)comm_info; - // Check communication options - MB_MASTER_CHECK(((comm_info_ptr->mode == MB_MODE_RTU) || (comm_info_ptr->mode == MB_MODE_ASCII)), - ESP_ERR_INVALID_ARG, "mb incorrect mode = (%u).", (unsigned)comm_info_ptr->mode); - MB_MASTER_CHECK((comm_info_ptr->port <= UART_NUM_MAX), ESP_ERR_INVALID_ARG, - "mb wrong port to set = (%u).", (unsigned)comm_info_ptr->port); - MB_MASTER_CHECK((comm_info_ptr->parity <= UART_PARITY_ODD), ESP_ERR_INVALID_ARG, - "mb wrong parity option = (%u).", (unsigned)comm_info_ptr->parity); - // Save the communication options - mbm_opts->mbm_comm = *(mb_communication_info_t*)comm_info_ptr; - return ESP_OK; -} - -// Modbus controller stack start function -static esp_err_t mbc_serial_master_start(void) -{ - MB_MASTER_CHECK((mbm_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface uninitialized."); - eMBErrorCode status = MB_EIO; - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - const mb_communication_info_t* comm_info = (mb_communication_info_t*)&mbm_opts->mbm_comm; - - // Initialize Modbus stack using mbcontroller parameters - status = eMBMasterSerialInit((eMBMode)comm_info->mode, (UCHAR)comm_info->port, - (ULONG)comm_info->baudrate, - MB_PORT_PARITY_GET(comm_info->parity)); - - MB_MASTER_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb stack initialization failure, eMBInit() returns (0x%x).", (int)status); - status = eMBMasterEnable(); - MB_MASTER_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb stack set slave ID failure, eMBMasterEnable() returned (0x%x).", (int)status); - // Set the mbcontroller start flag - EventBits_t flag = xEventGroupSetBits(mbm_opts->mbm_event_group, - (EventBits_t)MB_EVENT_STACK_STARTED); - MB_MASTER_CHECK((flag & MB_EVENT_STACK_STARTED), - ESP_ERR_INVALID_STATE, "mb stack start event set error."); - return ESP_OK; -} - -// Modbus controller destroy function -static esp_err_t mbc_serial_master_destroy(void) -{ - MB_MASTER_CHECK((mbm_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface uninitialized."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - eMBErrorCode mb_error = MB_ENOERR; - // Stop polling by clearing correspondent bit in the event group - EventBits_t flag = xEventGroupClearBits(mbm_opts->mbm_event_group, - (EventBits_t)MB_EVENT_STACK_STARTED); - MB_MASTER_CHECK((flag & MB_EVENT_STACK_STARTED), - ESP_ERR_INVALID_STATE, "mb stack stop event failure."); - // Desable and then destroy the Modbus stack - mb_error = eMBMasterDisable(); - MB_MASTER_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE, "mb stack disable failure."); - (void)vTaskDelete(mbm_opts->mbm_task_handle); - (void)vEventGroupDelete(mbm_opts->mbm_event_group); - mb_error = eMBMasterClose(); - MB_MASTER_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb stack close failure returned (0x%x).", (int)mb_error); - free(mbm_interface_ptr); // free the memory allocated for options - vMBPortSetMode((UCHAR)MB_PORT_INACTIVE); - mbm_interface_ptr = NULL; - return ESP_OK; -} - -// Set Modbus parameter description table -static esp_err_t mbc_serial_master_set_descriptor(const mb_parameter_descriptor_t* descriptor, const uint16_t num_elements) -{ - MB_MASTER_CHECK((descriptor != NULL), - ESP_ERR_INVALID_ARG, "mb incorrect descriptor."); - MB_MASTER_CHECK((num_elements >= 1), - ESP_ERR_INVALID_ARG, "mb table size is incorrect."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - const mb_parameter_descriptor_t *reg_ptr = descriptor; - // Go through all items in the table to check all Modbus registers - for (uint16_t counter = 0; counter < (num_elements); counter++, reg_ptr++) - { - // Below is the code to check consistency of the table format and required fields. - MB_MASTER_CHECK((reg_ptr->cid == counter), - ESP_ERR_INVALID_ARG, "mb descriptor cid field is incorrect."); - MB_MASTER_CHECK((reg_ptr->param_key != NULL), - ESP_ERR_INVALID_ARG, "mb descriptor param key is incorrect."); - MB_MASTER_CHECK((reg_ptr->mb_size > 0), - ESP_ERR_INVALID_ARG, "mb descriptor param size is incorrect."); - } - mbm_opts->mbm_param_descriptor_table = descriptor; - mbm_opts->mbm_param_descriptor_size = num_elements; - return ESP_OK; -} - -// Send custom Modbus request defined as mb_param_request_t structure -static esp_err_t mbc_serial_master_send_request(mb_param_request_t* request, void* data_ptr) -{ - MB_MASTER_CHECK((mbm_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface uninitialized."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_CHECK((request != NULL), - ESP_ERR_INVALID_ARG, "mb request structure."); - MB_MASTER_CHECK((data_ptr != NULL), - ESP_ERR_INVALID_ARG, "mb incorrect data pointer."); - - eMBMasterReqErrCode mb_error = MB_MRE_MASTER_BUSY; - esp_err_t error = ESP_FAIL; - - if (xMBMasterRunResTake(MB_SERIAL_API_RESP_TICS)) { - - uint8_t mb_slave_addr = request->slave_addr; - uint8_t mb_command = request->command; - uint16_t mb_offset = request->reg_start; - uint16_t mb_size = request->reg_size; - - // Set the buffer for callback function processing of received data - mbm_opts->mbm_reg_buffer_ptr = (uint8_t*)data_ptr; - mbm_opts->mbm_reg_buffer_size = mb_size; - - vMBMasterRunResRelease(); - - // Calls appropriate request function to send request and waits response - switch(mb_command) - { - case MB_FUNC_READ_COILS: - mb_error = eMBMasterReqReadCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size , (LONG)MB_SERIAL_API_RESP_TICS ); - break; - case MB_FUNC_WRITE_SINGLE_COIL: - mb_error = eMBMasterReqWriteCoil((UCHAR)mb_slave_addr, (USHORT)mb_offset, - *(USHORT*)data_ptr, (LONG)MB_SERIAL_API_RESP_TICS ); - break; - case MB_FUNC_WRITE_MULTIPLE_COILS: - mb_error = eMBMasterReqWriteMultipleCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (UCHAR*)data_ptr, (LONG)MB_SERIAL_API_RESP_TICS); - break; - case MB_FUNC_READ_DISCRETE_INPUTS: - mb_error = eMBMasterReqReadDiscreteInputs((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_SERIAL_API_RESP_TICS ); - break; - case MB_FUNC_READ_HOLDING_REGISTER: - mb_error = eMBMasterReqReadHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_SERIAL_API_RESP_TICS ); - break; - case MB_FUNC_WRITE_REGISTER: - mb_error = eMBMasterReqWriteHoldingRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset, - *(USHORT*)data_ptr, (LONG)MB_SERIAL_API_RESP_TICS ); - break; - - case MB_FUNC_WRITE_MULTIPLE_REGISTERS: - mb_error = eMBMasterReqWriteMultipleHoldingRegister( (UCHAR)mb_slave_addr, - (USHORT)mb_offset, (USHORT)mb_size, - (USHORT*)data_ptr, (LONG)MB_SERIAL_API_RESP_TICS ); - break; - case MB_FUNC_READWRITE_MULTIPLE_REGISTERS: - mb_error = eMBMasterReqReadWriteMultipleHoldingRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (USHORT*)data_ptr, - (USHORT)mb_offset, (USHORT)mb_size, - (LONG)MB_SERIAL_API_RESP_TICS ); - break; - case MB_FUNC_READ_INPUT_REGISTER: - mb_error = eMBMasterReqReadInputRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG) MB_SERIAL_API_RESP_TICS ); - break; - default: - ESP_LOGE(TAG, "%s: Incorrect function in request (%u) ", __FUNCTION__, (unsigned)mb_command); - mb_error = MB_MRE_NO_REG; - break; - } - } - - // Propagate the Modbus errors to higher level - switch(mb_error) - { - case MB_MRE_NO_ERR: - error = ESP_OK; - break; - - case MB_MRE_NO_REG: - error = ESP_ERR_NOT_SUPPORTED; // Invalid register request - break; - - case MB_MRE_TIMEDOUT: - error = ESP_ERR_TIMEOUT; // Slave did not send response - break; - - case MB_MRE_EXE_FUN: - case MB_MRE_REV_DATA: - error = ESP_ERR_INVALID_RESPONSE; // Invalid response from slave - break; - - case MB_MRE_MASTER_BUSY: - error = ESP_ERR_INVALID_STATE; // Master is busy (previous request is pending) - break; - - default: - ESP_LOGE(TAG, "%s: Incorrect return code (%x) ", __FUNCTION__, (int)mb_error); - error = ESP_FAIL; - break; - } - - return error; -} - -static esp_err_t mbc_serial_master_get_cid_info(uint16_t cid, const mb_parameter_descriptor_t** param_buffer) -{ - MB_MASTER_CHECK((mbm_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface uninitialized."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - - MB_MASTER_CHECK((param_buffer != NULL), - ESP_ERR_INVALID_ARG, "mb incorrect data buffer pointer."); - MB_MASTER_CHECK((mbm_opts->mbm_param_descriptor_table != NULL), - ESP_ERR_INVALID_ARG, "mb incorrect descriptor table or not set."); - MB_MASTER_CHECK((cid < mbm_opts->mbm_param_descriptor_size), - ESP_ERR_NOT_FOUND, "mb incorrect cid of characteristic."); - - // It is assumed that characteristics cid increased in the table - const mb_parameter_descriptor_t* reg_info = &mbm_opts->mbm_param_descriptor_table[cid]; - - MB_MASTER_CHECK((reg_info->param_key != NULL), - ESP_ERR_INVALID_ARG, "mb incorrect characteristic key."); - *param_buffer = reg_info; - return ESP_OK; -} - -// Helper function to get modbus command for each type of Modbus register area -static uint8_t mbc_serial_master_get_command(mb_param_type_t param_type, mb_param_mode_t mode) -{ - uint8_t command = 0; - switch(param_type) - { // - case MB_PARAM_HOLDING: - command = (mode == MB_PARAM_WRITE) ? - MB_FUNC_WRITE_MULTIPLE_REGISTERS : - MB_FUNC_READ_HOLDING_REGISTER; - break; - case MB_PARAM_INPUT: - command = MB_FUNC_READ_INPUT_REGISTER; - break; - case MB_PARAM_COIL: - command = (mode == MB_PARAM_WRITE) ? - MB_FUNC_WRITE_MULTIPLE_COILS : - MB_FUNC_READ_COILS; - break; - case MB_PARAM_DISCRETE: - if (mode != MB_PARAM_WRITE) { - command = MB_FUNC_READ_DISCRETE_INPUTS; - } else { - ESP_LOGE(TAG, "%s: Incorrect mode (%u)", __FUNCTION__, (unsigned)mode); - } - break; - default: - ESP_LOGE(TAG, "%s: Incorrect param type (%u)", __FUNCTION__, (unsigned)param_type); - break; - } - return command; -} - -// Helper to search parameter by name in the parameter description table -// and fills Modbus request fields accordingly -static esp_err_t mbc_serial_master_set_request(char* name, mb_param_mode_t mode, - mb_param_request_t* request, - mb_parameter_descriptor_t* reg_data) -{ - MB_MASTER_CHECK((mbm_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Master interface uninitialized."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - esp_err_t error = ESP_ERR_NOT_FOUND; - MB_MASTER_CHECK((name != NULL), - ESP_ERR_INVALID_ARG, "mb incorrect parameter name."); - MB_MASTER_CHECK((request != NULL), - ESP_ERR_INVALID_ARG, "mb incorrect request parameter."); - MB_MASTER_CHECK((mode <= MB_PARAM_WRITE), - ESP_ERR_INVALID_ARG, "mb incorrect mode."); - MB_MASTER_ASSERT(mbm_opts->mbm_param_descriptor_table != NULL); - const mb_parameter_descriptor_t* reg_ptr = mbm_opts->mbm_param_descriptor_table; - for (uint16_t counter = 0; counter < (mbm_opts->mbm_param_descriptor_size); counter++, reg_ptr++) - { - // Check the cid of the parameter is equal to record number in the table - // Check the length of name and parameter key strings from table - size_t param_key_len = strlen((const char*)reg_ptr->param_key); - if (param_key_len != strlen((const char*)name)) { - continue; // The length of strings is different then check next record in the table - } - // Compare the name of parameter with parameter key from table - int comp_result = memcmp((const void*)name, (const void*)reg_ptr->param_key, (size_t)param_key_len); - if (comp_result == 0) { - // Returns an error in case of broadcast read request - if (!reg_ptr->mb_slave_addr && (mode == MB_PARAM_READ)) { - error = ESP_ERR_INVALID_ARG; - break; - } - // The correct line is found in the table and reg_ptr points to the found parameter description - request->slave_addr = reg_ptr->mb_slave_addr; - request->reg_start = reg_ptr->mb_reg_start; - request->reg_size = reg_ptr->mb_size; - request->command = mbc_serial_master_get_command(reg_ptr->mb_param_type, mode); - MB_MASTER_CHECK((request->command > 0), ESP_ERR_INVALID_ARG, - "mb incorrect command or parameter type."); - if (reg_data != NULL) { - *reg_data = *reg_ptr; // Set the cid registered parameter data - } - error = ESP_OK; - break; - } - } - return error; -} - -static esp_err_t mbc_serial_master_get_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t *type) -{ - MB_MASTER_CHECK((name != NULL), ESP_ERR_INVALID_ARG, "mb incorrect descriptor."); - MB_MASTER_CHECK((type != NULL), ESP_ERR_INVALID_ARG, "type pointer is incorrect."); - MB_MASTER_CHECK((value != NULL), ESP_ERR_INVALID_ARG, "value pointer is incorrect."); - esp_err_t error = ESP_ERR_INVALID_RESPONSE; - mb_param_request_t request ; - mb_parameter_descriptor_t reg_info = { 0 }; - uint8_t* pdata = NULL; - - error = mbc_serial_master_set_request(name, MB_PARAM_READ, &request, ®_info); - if ((error == ESP_OK) && (cid == reg_info.cid)) { - MB_MASTER_CHECK(((reg_info.mb_size << 1) >= reg_info.param_size), - MB_EILLSTATE, - "Incorrect characteristic data."); - // alloc buffer to store parameter data - pdata = calloc(1, (reg_info.mb_size << 1)); - if (!pdata) { - return ESP_ERR_INVALID_STATE; - } - error = mbc_serial_master_send_request(&request, pdata); - if (error == ESP_OK) { - // If data pointer is NULL then we don't need to set value (it is still in the cache of cid) - if (value != NULL) { - error = mbc_master_set_param_data((void*)value, (void*)pdata, - reg_info.param_type, reg_info.param_size); - if (error != ESP_OK) { - ESP_LOGE(TAG, "fail to set parameter data."); - error = ESP_ERR_INVALID_STATE; - } else { - ESP_LOGD(TAG, "%s: Good response for get cid(%u) = %s", - __FUNCTION__, (unsigned)reg_info.cid, (char*)esp_err_to_name(error)); - } - } - } else { - ESP_LOGD(TAG, "%s: Bad response to get cid(%u) = %s", - __FUNCTION__, (unsigned)reg_info.cid, (char*)esp_err_to_name(error)); - } - free(pdata); - // Set the type of parameter found in the table - *type = reg_info.param_type; - } else { - ESP_LOGE(TAG, "%s: The requested cid(%u) is not configured correctly. Check data dictionary for correctness.", - __FUNCTION__, (unsigned)cid); - error = ESP_ERR_INVALID_ARG; - } - return error; -} - -// Set parameter value for characteristic selected by name and cid -static esp_err_t mbc_serial_master_set_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t *type) -{ - MB_MASTER_CHECK((name != NULL), ESP_ERR_INVALID_ARG, "mb incorrect descriptor."); - MB_MASTER_CHECK((value != NULL), ESP_ERR_INVALID_ARG, "value pointer is incorrect."); - MB_MASTER_CHECK((type != NULL), ESP_ERR_INVALID_ARG, "type pointer is incorrect."); - - esp_err_t error = ESP_ERR_INVALID_RESPONSE; - mb_param_request_t request ; - mb_parameter_descriptor_t reg_info = { 0 }; - uint8_t* pdata = NULL; - - error = mbc_serial_master_set_request(name, MB_PARAM_WRITE, &request, ®_info); - if ((error == ESP_OK) && (cid == reg_info.cid)) { - MB_MASTER_CHECK(((reg_info.mb_size << 1) >= reg_info.param_size), - MB_EILLSTATE, - "Incorrect characteristic data."); - pdata = calloc(1, (reg_info.mb_size << 1)); // alloc parameter buffer - if (!pdata) { - return ESP_ERR_INVALID_STATE; - } - // Transfer value of characteristic into parameter buffer - error = mbc_master_set_param_data((void*)pdata, (void*)value, - reg_info.param_type, reg_info.param_size); - if (error != ESP_OK) { - ESP_LOGE(TAG, "fail to set parameter data."); - free(pdata); - return ESP_ERR_INVALID_STATE; - } - // Send request to write characteristic data - error = mbc_serial_master_send_request(&request, pdata); - if (error == ESP_OK) { - ESP_LOGD(TAG, "%s: Good response for set cid(%u) = %s", - __FUNCTION__, (unsigned)reg_info.cid, (char*)esp_err_to_name(error)); - } else { - ESP_LOGD(TAG, "%s: Bad response to set cid(%u) = %s", - __FUNCTION__, (unsigned)reg_info.cid, (char*)esp_err_to_name(error)); - } - // Set the type of parameter found in the table - *type = reg_info.param_type; - free(pdata); - } else { - ESP_LOGE(TAG, "%s: The requested cid(%u) is not configured correctly. Check data dictionary for correctness.", - __FUNCTION__, (unsigned)cid); - error = ESP_ERR_INVALID_ARG; - } - return error; -} - -/* ----------------------- Callback functions for Modbus stack ---------------------------------*/ -// These are executed by modbus stack to read appropriate type of registers. - -/** - * Modbus master input register callback function. - * - * @param pucRegBuffer input register buffer - * @param usAddress input register address - * @param usNRegs input register number - * - * @return result - */ -// Callback function for reading of MB Input Registers -eMBErrorCode eMBRegInputCBSerialMaster(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs) -{ - MB_MASTER_CHECK((mbm_interface_ptr != NULL), - MB_EILLSTATE, - "Master interface uninitialized."); - MB_MASTER_CHECK((pucRegBuffer != NULL), MB_EINVAL, - "Master stack processing error."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - // Number of input registers to be transferred - USHORT usRegInputNregs = (USHORT)mbm_opts->mbm_reg_buffer_size; - UCHAR* pucInputBuffer = (UCHAR*)mbm_opts->mbm_reg_buffer_ptr; // Get instance address - USHORT usRegs = usNRegs; - eMBErrorCode eStatus = MB_ENOERR; - // If input or configuration parameters are incorrect then return an error to stack layer - if ((pucInputBuffer != NULL) - && (usNRegs >= 1) - && (usRegInputNregs == usRegs)) { - while (usRegs > 0) { - _XFER_2_RD(pucInputBuffer, pucRegBuffer); - usRegs -= 1; - } - } else { - eStatus = MB_ENOREG; - } - return eStatus; -} - -/** - * Modbus master holding register callback function. - * - * @param pucRegBuffer holding register buffer - * @param usAddress holding register address - * @param usNRegs holding register number - * @param eMode read or write - * - * @return result - */ -// Callback function for reading of MB Holding Registers -// Executed by stack when request to read/write holding registers is received -eMBErrorCode eMBRegHoldingCBSerialMaster(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode) -{ - MB_MASTER_CHECK((mbm_interface_ptr != NULL), - MB_EILLSTATE, - "Master interface uninitialized."); - MB_MASTER_CHECK((pucRegBuffer != NULL), MB_EINVAL, - "Master stack processing error."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - USHORT usRegHoldingNregs = (USHORT)mbm_opts->mbm_reg_buffer_size; - UCHAR* pucHoldingBuffer = (UCHAR*)mbm_opts->mbm_reg_buffer_ptr; - eMBErrorCode eStatus = MB_ENOERR; - USHORT usRegs = usNRegs; - // Check input and configuration parameters for correctness - if ((pucHoldingBuffer != NULL) - && (usRegHoldingNregs == usNRegs) - && (usNRegs >= 1)) { - switch (eMode) { - case MB_REG_WRITE: - while (usRegs > 0) { - _XFER_2_RD(pucRegBuffer, pucHoldingBuffer); - usRegs -= 1; - }; - break; - case MB_REG_READ: - while (usRegs > 0) { - _XFER_2_WR(pucHoldingBuffer, pucRegBuffer); - pucHoldingBuffer += 2; - usRegs -= 1; - }; - break; - } - } else { - eStatus = MB_ENOREG; - } - return eStatus; -} - -/** - * Modbus master coils callback function. - * - * @param pucRegBuffer coils buffer - * @param usAddress coils address - * @param usNCoils coils number - * @param eMode read or write - * - * @return result - */ -// Callback function for reading of MB Coils Registers -eMBErrorCode eMBRegCoilsCBSerialMaster(UCHAR* pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode) -{ - MB_MASTER_CHECK((mbm_interface_ptr != NULL), - MB_EILLSTATE, "Master interface uninitialized."); - MB_MASTER_CHECK((pucRegBuffer != NULL), - MB_EINVAL, "Master stack processing error."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - USHORT usRegCoilNregs = (USHORT)mbm_opts->mbm_reg_buffer_size; - UCHAR* pucRegCoilsBuf = (UCHAR*)mbm_opts->mbm_reg_buffer_ptr; - eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex; - USHORT usCoils = usNCoils; - usAddress--; // The address is already + 1 - if ((usRegCoilNregs >= 1) - && (pucRegCoilsBuf != NULL) - && (usNCoils == usRegCoilNregs)) { - iRegIndex = (usAddress % 8); - switch (eMode) { - case MB_REG_WRITE: - while (usCoils > 0) { - UCHAR ucResult = xMBUtilGetBits(pucRegCoilsBuf, iRegIndex - (usAddress % 8), 1); - xMBUtilSetBits(pucRegBuffer, iRegIndex - (usAddress % 8) , 1, ucResult); - iRegIndex++; - usCoils--; - } - break; - case MB_REG_READ: - while (usCoils > 0) { - UCHAR ucResult = xMBUtilGetBits(pucRegBuffer, iRegIndex - (usAddress % 8), 1); - xMBUtilSetBits(pucRegCoilsBuf, iRegIndex - (usAddress % 8), 1, ucResult); - iRegIndex++; - usCoils--; - } - break; - } // switch ( eMode ) - } else { - // If the configuration or input parameters are incorrect then return error to stack - eStatus = MB_ENOREG; - } - return eStatus; -} - -/** - * Modbus master discrete callback function. - * - * @param pucRegBuffer discrete buffer - * @param usAddress discrete address - * @param usNDiscrete discrete number - * - * @return result - */ -// Callback function for reading of MB Discrete Input Registers -eMBErrorCode eMBRegDiscreteCBSerialMaster(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNDiscrete) -{ - MB_MASTER_CHECK((mbm_interface_ptr != NULL), - MB_EILLSTATE, "Master interface uninitialized."); - MB_MASTER_CHECK((pucRegBuffer != NULL), - MB_EINVAL, "Master stack processing error."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - USHORT usRegDiscreteNregs = (USHORT)mbm_opts->mbm_reg_buffer_size; - UCHAR* pucRegDiscreteBuf = (UCHAR*)mbm_opts->mbm_reg_buffer_ptr; - eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegBitIndex, iNReg; - UCHAR* pucDiscreteInputBuf; - iNReg = usNDiscrete / 8 + 1; - pucDiscreteInputBuf = (UCHAR*) pucRegDiscreteBuf; - // It is already plus one in Modbus function method. - usAddress--; - if ((usRegDiscreteNregs >= 1) - && (pucRegDiscreteBuf != NULL) - && (usNDiscrete >= 1)) { - iRegBitIndex = (USHORT)(usAddress) % 8; // Get bit index - while (iNReg > 1) - { - xMBUtilSetBits(pucDiscreteInputBuf++, iRegBitIndex - (usAddress % 8), 8, *pucRegBuffer++); - iNReg--; - } - // last discrete - usNDiscrete = usNDiscrete % 8; - // xMBUtilSetBits has bug when ucNBits is zero - if (usNDiscrete != 0) - { - xMBUtilSetBits(pucDiscreteInputBuf, iRegBitIndex - (usAddress % 8), usNDiscrete, *pucRegBuffer++); - } - } else { - eStatus = MB_ENOREG; - } - return eStatus; -} - -// Initialization of resources for Modbus serial master controller -esp_err_t mbc_serial_master_create(void** handler) -{ - // Allocate space for master interface structure - if (mbm_interface_ptr == NULL) { - mbm_interface_ptr = malloc(sizeof(mb_master_interface_t)); - } - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - - // Initialize interface properties - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - mbm_opts->port_type = MB_PORT_SERIAL_MASTER; - - vMBPortSetMode((UCHAR)MB_PORT_SERIAL_MASTER); - - mbm_opts->mbm_comm.mode = MB_MODE_RTU; - mbm_opts->mbm_comm.port = MB_UART_PORT; - mbm_opts->mbm_comm.baudrate = MB_DEVICE_SPEED; - mbm_opts->mbm_comm.parity = MB_PARITY_NONE; - - // Initialization of active context of the modbus controller - BaseType_t status = 0; - // Parameter change notification queue - mbm_opts->mbm_event_group = xEventGroupCreate(); - MB_MASTER_CHECK((mbm_opts->mbm_event_group != NULL), - ESP_ERR_NO_MEM, "mb event group error."); - // Create modbus controller task - status = xTaskCreatePinnedToCore((void*)&modbus_master_task, - "modbus_matask", - MB_CONTROLLER_STACK_SIZE, - NULL, // No parameters - MB_CONTROLLER_PRIORITY, - &mbm_opts->mbm_task_handle, - MB_PORT_TASK_AFFINITY); - if (status != pdPASS) { - vTaskDelete(mbm_opts->mbm_task_handle); - MB_MASTER_CHECK((status == pdPASS), ESP_ERR_NO_MEM, - "mb controller task creation error, xTaskCreate() returns (0x%x).", (int)status); - } - MB_MASTER_ASSERT(mbm_opts->mbm_task_handle != NULL); // The task is created but handle is incorrect - - // Initialize public interface methods of the interface - mbm_interface_ptr->init = mbc_serial_master_create; - mbm_interface_ptr->destroy = mbc_serial_master_destroy; - mbm_interface_ptr->setup = mbc_serial_master_setup; - mbm_interface_ptr->start = mbc_serial_master_start; - mbm_interface_ptr->get_cid_info = mbc_serial_master_get_cid_info; - mbm_interface_ptr->get_parameter = mbc_serial_master_get_parameter; - mbm_interface_ptr->send_request = mbc_serial_master_send_request; - mbm_interface_ptr->set_descriptor = mbc_serial_master_set_descriptor; - mbm_interface_ptr->set_parameter = mbc_serial_master_set_parameter; - - mbm_interface_ptr->master_reg_cb_discrete = eMBRegDiscreteCBSerialMaster; - mbm_interface_ptr->master_reg_cb_input = eMBRegInputCBSerialMaster; - mbm_interface_ptr->master_reg_cb_holding = eMBRegHoldingCBSerialMaster; - mbm_interface_ptr->master_reg_cb_coils = eMBRegCoilsCBSerialMaster; - - *handler = mbm_interface_ptr; - - return ESP_OK; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/serial_master/modbus_controller/mbc_serial_master.h b/managed_components/espressif__esp-modbus/freemodbus/serial_master/modbus_controller/mbc_serial_master.h deleted file mode 100755 index 28aec53..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/serial_master/modbus_controller/mbc_serial_master.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -// mbc_serial_master.h Modbus controller serial master implementation header file - -#ifndef _MODBUS_SERIAL_CONTROLLER_MASTER -#define _MODBUS_SERIAL_CONTROLLER_MASTER - -#include // for standard int types definition -#include // for NULL and std defines -#include "soc/soc.h" // for BITN definitions -#include "esp_err.h" // for esp_err_t -#include "esp_modbus_common.h" // for common defines - -/** - * @brief Initialize Modbus controller and stack - * - * @param[out] handler handler(pointer) to master data structure - * @return - * - ESP_OK Success - * - ESP_ERR_NO_MEM Parameter error - */ -esp_err_t mbc_serial_master_create(void** handler); - -#endif // _MODBUS_SERIAL_CONTROLLER_MASTER diff --git a/managed_components/espressif__esp-modbus/freemodbus/serial_master/port/port_serial_master.h b/managed_components/espressif__esp-modbus/freemodbus/serial_master/port/port_serial_master.h deleted file mode 100755 index e389b81..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/serial_master/port/port_serial_master.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2010 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Port Demo Application - * Copyright (C) 2010 Christian Walter - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: portother.c,v 1.1 2010/06/06 13:07:20 wolti Exp $ - */ -#ifndef _PORT_SERIAL_MASTER_H -#define _PORT_SERIAL_MASTER_H - -/* ----------------------- Platform includes --------------------------------*/ -#include "driver/uart.h" -#include "esp_log.h" // for ESP_LOGE macro -#include "mb_m.h" -#include "port.h" - -/* ----------------------- Defines ------------------------------------------*/ -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif /* __cplusplus */ - -void vMBPortSetMode( UCHAR ucMode ); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif /* __cplusplus */ - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c b/managed_components/espressif__esp-modbus/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c deleted file mode 100755 index 6b8104d..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ -// mbc_serial_slave.c -// Implementation of the Modbus controller serial slave - -#include // for calculation of time stamp in milliseconds -#include "esp_log.h" // for log_write -#include "mb.h" // for mb types definition -#include "mbutils.h" // for mbutils functions definition for stack callback -#include "sdkconfig.h" // for KConfig values -#include "esp_modbus_common.h" // for common defines -#include "esp_modbus_slave.h" // for public slave interface types -#include "mbc_slave.h" // for private slave interface types -#include "mbc_serial_slave.h" // for serial slave implementation definitions -#include "port_serial_slave.h" - -// Shared pointer to interface structure -static mb_slave_interface_t* mbs_interface_ptr = NULL; -static const char *TAG = "MB_CONTROLLER_SLAVE"; - -// Modbus task function -static void modbus_slave_task(void *pvParameters) -{ - // Modbus interface must be initialized before start - MB_SLAVE_ASSERT(mbs_interface_ptr != NULL); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - - MB_SLAVE_ASSERT(mbs_opts != NULL); - // Main Modbus stack processing cycle - for (;;) { - BaseType_t status = xEventGroupWaitBits(mbs_opts->mbs_event_group, - (BaseType_t)(MB_EVENT_STACK_STARTED), - pdFALSE, // do not clear bits - pdFALSE, - portMAX_DELAY); - // Check if stack started then poll for data - if (status & MB_EVENT_STACK_STARTED) { - (void)eMBPoll(); // allow stack to process data - // Send response buffer - BOOL xSentState = xMBPortSerialTxPoll(); - if (xSentState) { - (void)xMBPortEventPost( EV_FRAME_SENT ); - } - } - } -} - -// Setup Modbus controller parameters -static esp_err_t mbc_serial_slave_setup(void* comm_info) -{ - MB_SLAVE_CHECK((mbs_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - MB_SLAVE_CHECK((comm_info != NULL), ESP_ERR_INVALID_ARG, - "mb wrong communication settings."); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - mb_slave_comm_info_t* comm_settings = (mb_slave_comm_info_t*)comm_info; - MB_SLAVE_CHECK(((comm_settings->mode == MB_MODE_RTU) || (comm_settings->mode == MB_MODE_ASCII)), - ESP_ERR_INVALID_ARG, "mb incorrect mode = (%u).", - (unsigned)comm_settings->mode); - MB_SLAVE_CHECK((comm_settings->slave_addr <= MB_ADDRESS_MAX), - ESP_ERR_INVALID_ARG, "mb wrong slave address = (%u).", (unsigned)comm_settings->slave_addr); - MB_SLAVE_CHECK((comm_settings->port < UART_NUM_MAX), ESP_ERR_INVALID_ARG, - "mb wrong port to set = (%u).", (unsigned)comm_settings->port); - MB_SLAVE_CHECK((comm_settings->parity <= UART_PARITY_ODD), ESP_ERR_INVALID_ARG, - "mb wrong parity option = (%u).", (unsigned)comm_settings->parity); - - // Set communication options of the controller - mbs_opts->mbs_comm = *(mb_communication_info_t*)comm_settings; - return ESP_OK; -} - -// Start Modbus controller start function -static esp_err_t mbc_serial_slave_start(void) -{ - MB_SLAVE_CHECK((mbs_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - eMBErrorCode status = MB_EIO; - const mb_communication_info_t* comm_info = (mb_communication_info_t*)&mbs_opts->mbs_comm; - - // Initialize Modbus stack using mbcontroller parameters - status = eMBInit((eMBMode)comm_info->mode, - (UCHAR)comm_info->slave_addr, - (UCHAR)comm_info->port, - (ULONG)comm_info->baudrate, - MB_PORT_PARITY_GET(comm_info->parity)); - - MB_SLAVE_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb stack initialization failure, eMBInit() returns (0x%x).", (int)status); - status = eMBEnable(); - MB_SLAVE_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb stack set slave ID failure, eMBEnable() returned (0x%x).", (int)status); - // Set the mbcontroller start flag - EventBits_t flag = xEventGroupSetBits(mbs_opts->mbs_event_group, - (EventBits_t)MB_EVENT_STACK_STARTED); - MB_SLAVE_CHECK((flag & MB_EVENT_STACK_STARTED), - ESP_ERR_INVALID_STATE, "mb stack start event set error."); - return ESP_OK; -} - -// Blocking function to get event on parameter group change for application task -static mb_event_group_t mbc_serial_slave_check_event(mb_event_group_t group) -{ - MB_SLAVE_CHECK((mbs_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - MB_SLAVE_ASSERT(mbs_opts->mbs_event_group != NULL); - BaseType_t status = xEventGroupWaitBits(mbs_opts->mbs_event_group, (BaseType_t)group, - pdTRUE , pdFALSE, portMAX_DELAY); - return (mb_event_group_t)status; -} - -// Function to get notification about parameter change from application task -static esp_err_t mbc_serial_slave_get_param_info(mb_param_info_t* reg_info, uint32_t timeout) -{ - MB_SLAVE_CHECK((mbs_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - esp_err_t err = ESP_ERR_TIMEOUT; - MB_SLAVE_CHECK((mbs_opts->mbs_notification_queue_handle != NULL), - ESP_ERR_INVALID_ARG, "mb queue handle is invalid."); - MB_SLAVE_CHECK((reg_info != NULL), ESP_ERR_INVALID_ARG, "mb register information is invalid."); - BaseType_t status = xQueueReceive(mbs_opts->mbs_notification_queue_handle, - reg_info, pdMS_TO_TICKS(timeout)); - if (status == pdTRUE) { - err = ESP_OK; - } - return err; -} - -/* ----------------------- Callback functions for Modbus stack ---------------------------------*/ -// These are executed by modbus stack to read appropriate type of registers. - -// This is required to suppress warning when register start address is zero -#pragma GCC diagnostic ignored "-Wtype-limits" - -// Modbus controller destroy function -static esp_err_t mbc_serial_slave_destroy(void) -{ - MB_SLAVE_CHECK((mbs_interface_ptr != NULL), - ESP_ERR_INVALID_STATE, - "Slave interface is not correctly initialized."); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - eMBErrorCode mb_error = MB_ENOERR; - // Stop polling by clearing correspondent bit in the event group - EventBits_t flag = xEventGroupClearBits(mbs_opts->mbs_event_group, - (EventBits_t)MB_EVENT_STACK_STARTED); - MB_SLAVE_CHECK((flag & MB_EVENT_STACK_STARTED), - ESP_ERR_INVALID_STATE, "mb stack stop event failure."); - // Disable and then destroy the Modbus stack - mb_error = eMBDisable(); - MB_SLAVE_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE, "mb stack disable failure."); - (void)vTaskDelete(mbs_opts->mbs_task_handle); - (void)vQueueDelete(mbs_opts->mbs_notification_queue_handle); - (void)vEventGroupDelete(mbs_opts->mbs_event_group); - mb_error = eMBClose(); - MB_SLAVE_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb stack close failure returned (0x%x).", (int)mb_error); - mbs_interface_ptr = NULL; - vMBPortSetMode((UCHAR)MB_PORT_INACTIVE); - return ESP_OK; -} - -// Initialization of Modbus controller -esp_err_t mbc_serial_slave_create(void** handler) -{ - // Allocate space for options - if (mbs_interface_ptr == NULL) { - mbs_interface_ptr = malloc(sizeof(mb_slave_interface_t)); - } - MB_SLAVE_ASSERT(mbs_interface_ptr != NULL); - - vMBPortSetMode((UCHAR)MB_PORT_SERIAL_SLAVE); - - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - mbs_opts->port_type = MB_PORT_SERIAL_SLAVE; // set interface port type - - // Set default values of communication options - mbs_opts->mbs_comm.mode = MB_MODE_RTU; - mbs_opts->mbs_comm.slave_addr = MB_DEVICE_ADDRESS; - mbs_opts->mbs_comm.port = MB_UART_PORT; - mbs_opts->mbs_comm.baudrate = MB_DEVICE_SPEED; - mbs_opts->mbs_comm.parity = MB_PARITY_NONE; - - // Initialization of active context of the Modbus controller - BaseType_t status = 0; - // Parameter change notification queue - mbs_opts->mbs_event_group = xEventGroupCreate(); - MB_SLAVE_CHECK((mbs_opts->mbs_event_group != NULL), - ESP_ERR_NO_MEM, "mb event group error."); - // Parameter change notification queue - mbs_opts->mbs_notification_queue_handle = xQueueCreate( - MB_CONTROLLER_NOTIFY_QUEUE_SIZE, - sizeof(mb_param_info_t)); - MB_SLAVE_CHECK((mbs_opts->mbs_notification_queue_handle != NULL), - ESP_ERR_NO_MEM, "mb notify queue creation error."); - // Create Modbus controller task - status = xTaskCreatePinnedToCore((void*)&modbus_slave_task, - "modbus_slave_task", - MB_CONTROLLER_STACK_SIZE, - NULL, - MB_CONTROLLER_PRIORITY, - &mbs_opts->mbs_task_handle, - MB_PORT_TASK_AFFINITY); - if (status != pdPASS) { - vTaskDelete(mbs_opts->mbs_task_handle); - MB_SLAVE_CHECK((status == pdPASS), ESP_ERR_NO_MEM, - "mb controller task creation error, xTaskCreate() returns (0x%x).", (int)status); - } - MB_SLAVE_ASSERT(mbs_opts->mbs_task_handle != NULL); // The task is created but handle is incorrect - - // Initialize interface function pointers - mbs_interface_ptr->check_event = mbc_serial_slave_check_event; - mbs_interface_ptr->destroy = mbc_serial_slave_destroy; - mbs_interface_ptr->get_param_info = mbc_serial_slave_get_param_info; - mbs_interface_ptr->init = mbc_serial_slave_create; - mbs_interface_ptr->set_descriptor = NULL; // Use common set descriptor function - mbs_interface_ptr->setup = mbc_serial_slave_setup; - mbs_interface_ptr->start = mbc_serial_slave_start; - - // Initialize stack callback function pointers - mbs_interface_ptr->slave_reg_cb_discrete = NULL; // implemented in common layer - mbs_interface_ptr->slave_reg_cb_input = NULL; - mbs_interface_ptr->slave_reg_cb_holding = NULL; - mbs_interface_ptr->slave_reg_cb_coils = NULL; - - *handler = (void*)mbs_interface_ptr; - - return ESP_OK; -} diff --git a/managed_components/espressif__esp-modbus/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.h b/managed_components/espressif__esp-modbus/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.h deleted file mode 100755 index 9a515ba..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -// mbc_serial_slave.h Modbus controller serial slave implementation header file - -#ifndef _MODBUS_SERIAL_CONTROLLER_SLAVE -#define _MODBUS_SERIAL_CONTROLLER_SLAVE - -#include // for standard int types definition -#include // for NULL and std defines -#include "esp_modbus_common.h" // for common defines - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_CONTROLLER_NOTIFY_QUEUE_SIZE (CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE) // Number of messages in parameter notification queue -#define MB_CONTROLLER_NOTIFY_TIMEOUT (pdMS_TO_TICKS(CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT)) // notification timeout - -/* - * @brief Initialize Modbus controller and stack - * - * @param[out] handler handler(pointer) to master data structure - * @return - * - ESP_OK Success - * - ESP_ERR_NO_MEM Parameter error - */ -esp_err_t mbc_serial_slave_create(void** handler); - -#endif // _MODBUS_SERIAL_CONTROLLER_SLAVE diff --git a/managed_components/espressif__esp-modbus/freemodbus/serial_slave/port/port_serial_slave.h b/managed_components/espressif__esp-modbus/freemodbus/serial_slave/port/port_serial_slave.h deleted file mode 100755 index 880876c..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/serial_slave/port/port_serial_slave.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2010 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 Port Demo Application - * Copyright (C) 2010 Christian Walter - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: portother.c,v 1.1 2010/06/06 13:07:20 wolti Exp $ - */ -#ifndef _PORT_SERIAL_SLAVE_H -#define _PORT_SERIAL_SLAVE_H - -/* ----------------------- Platform includes --------------------------------*/ - -#include "driver/uart.h" -#include "esp_log.h" -#include "port.h" - -/* ----------------------- Defines ------------------------------------------*/ -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif /* __cplusplus */ - -BOOL xMBPortSerialTxPoll( void ); - -void vMBPortSetMode( UCHAR ucMode ); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif /* __cplusplus */ - -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c b/managed_components/espressif__esp-modbus/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c deleted file mode 100755 index ce385e1..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c +++ /dev/null @@ -1,785 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -// mbc_tcp_master.c -// TCP master implementation of the Modbus controller - -#include // for calculation of time stamp in milliseconds -#include "esp_log.h" // for log_write -#include // for memcpy -#include // for list -#include "freertos/FreeRTOS.h" // for task creation and queue access -#include "freertos/task.h" // for task api access -#include "freertos/event_groups.h" // for event groups -#include "freertos/queue.h" // for queue api access -#include "mb_m.h" // for modbus stack master types definition -#include "port.h" // for port callback functions and defines -#include "mbutils.h" // for mbutils functions definition for stack callback -#include "sdkconfig.h" // for KConfig values -#include "esp_modbus_common.h" // for common types -#include "esp_modbus_master.h" // for public master types -#include "mbc_master.h" // for private master types -#include "mbc_tcp_master.h" // for tcp master create function and types -#include "port_tcp_master.h" // for tcp master port defines and types - -#if MB_MASTER_TCP_ENABLED - -/*-----------------------Master mode use these variables----------------------*/ - -#define MB_TCP_CONNECTION_TOUT (pdMS_TO_TICKS(CONFIG_FMB_TCP_CONNECTION_TOUT_SEC * 1000)) - -// Actual wait time depends on the response timer -#define MB_TCP_API_RESP_TICS (pdMS_TO_TICKS(MB_MAX_RESPONSE_TIME_MS)) - -static mb_master_interface_t* mbm_interface_ptr = NULL; -static const char *TAG = "MB_CONTROLLER_MASTER"; - -// Searches the slave address in the address info list and returns address info if found, else NULL -static mb_slave_addr_entry_t* mbc_tcp_master_find_slave_addr(uint8_t slave_addr) -{ - mb_slave_addr_entry_t* it; - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - - if (LIST_EMPTY(&mbm_opts->mbm_slave_list)) { - return NULL; - } - LIST_FOREACH(it, &mbm_opts->mbm_slave_list, entries) { - if (slave_addr == it->slave_addr) { - return it; - } - } - return NULL; -} - -static esp_err_t mbc_tcp_master_add_slave(uint16_t index, uint8_t slave_addr, const char* ip_addr) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - // Initialize interface properties - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - - mb_slave_addr_entry_t* new_slave_entry = (mb_slave_addr_entry_t*) heap_caps_malloc(sizeof(mb_slave_addr_entry_t), - MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); - MB_MASTER_CHECK((new_slave_entry != NULL), ESP_ERR_NO_MEM, "mb can not allocate memory for slave entry."); - new_slave_entry->index = index; - new_slave_entry->ip_address = ip_addr; - new_slave_entry->slave_addr = slave_addr; - new_slave_entry->p_data = NULL; - LIST_INSERT_HEAD(&mbm_opts->mbm_slave_list, new_slave_entry, entries); - MB_MASTER_CHECK((mbm_opts->mbm_slave_list_count < (MB_TCP_PORT_MAX_CONN - 1)), - ESP_ERR_INVALID_STATE, "mb max number of slaves < %d.", MB_TCP_PORT_MAX_CONN); - mbm_opts->mbm_slave_list_count++; - return ESP_OK; -} - -static void mbc_tcp_master_free_slave_list(void) -{ - mb_slave_addr_entry_t* it; - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - - // Initialize interface properties - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - - while ((it = LIST_FIRST(&mbm_opts->mbm_slave_list))) { - LIST_REMOVE(it, entries); - mbm_opts->mbm_slave_list_count--; - free(it); - } -} - -// Modbus event processing task -static void modbus_tcp_master_task(void *pvParameters) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_ASSERT(mbm_opts != NULL); - - // Main Modbus stack processing cycle - for (;;) { - // Wait for poll events - BaseType_t status = xEventGroupWaitBits(mbm_opts->mbm_event_group, - (BaseType_t)(MB_EVENT_STACK_STARTED), - pdFALSE, // do not clear bits - pdFALSE, - portMAX_DELAY); - // Check if stack started then poll for data - if (status & MB_EVENT_STACK_STARTED) { - (void)eMBMasterPoll(); // Allow stack to process data - } - } -} - -// Setup Modbus controller parameters -static esp_err_t mbc_tcp_master_setup(void* comm_info) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_CHECK((mbm_opts != NULL), ESP_ERR_INVALID_ARG, "mb incorrect options pointer."); - - const mb_communication_info_t* comm_info_ptr = (mb_communication_info_t*)comm_info; - // Check communication options - MB_MASTER_CHECK((comm_info_ptr->ip_mode == MB_MODE_TCP), - ESP_ERR_INVALID_ARG, "mb incorrect mode = (%u).", (unsigned)comm_info_ptr->ip_mode); - MB_MASTER_CHECK((comm_info_ptr->ip_addr != NULL), - ESP_ERR_INVALID_ARG, "mb wrong slave ip address table."); - MB_MASTER_CHECK(((comm_info_ptr->ip_addr_type == MB_IPV4) || (comm_info_ptr->ip_addr_type == MB_IPV6)), - ESP_ERR_INVALID_ARG, "mb incorrect addr type = (%u).", (unsigned)comm_info_ptr->ip_addr_type); - MB_MASTER_CHECK((comm_info_ptr->ip_netif_ptr != NULL), - ESP_ERR_INVALID_ARG, "mb incorrect iface address."); - // Save the communication options - mbm_opts->mbm_comm = *(mb_communication_info_t*)comm_info_ptr; - return ESP_OK; -} - -// Modbus controller stack start function -static esp_err_t mbc_tcp_master_start(void) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - eMBErrorCode status = MB_EIO; - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_CHECK((mbm_opts != NULL), ESP_ERR_INVALID_ARG, "mb incorrect options pointer."); - const mb_communication_info_t* comm_info = (mb_communication_info_t*)&mbm_opts->mbm_comm; - - // Initialize Modbus stack using mbcontroller parameters - status = eMBMasterTCPInit((USHORT)comm_info->ip_port); - MB_MASTER_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb stack initialization failure, eMBMasterInit() returns (0x%x).", status); - - MB_MASTER_CHECK((mbm_opts->mbm_param_descriptor_size >= 1), ESP_ERR_INVALID_ARG, "mb table size is incorrect."); - - bool result = false; - const char** comm_ip_table = (const char**)comm_info->ip_addr; - MB_MASTER_CHECK((comm_ip_table != NULL), ESP_ERR_INVALID_ARG, "mb ip table address is incorrect."); - - eMBPortProto proto = (comm_info->ip_mode == MB_MODE_TCP) ? MB_PROTO_TCP : MB_PROTO_UDP; - eMBPortIpVer ip_ver = (comm_info->ip_addr_type == MB_IPV4) ? MB_PORT_IPV4 : MB_PORT_IPV6; - vMBTCPPortMasterSetNetOpt(comm_info->ip_netif_ptr, ip_ver, proto); - - status = eMBMasterEnable(); - MB_MASTER_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb stack enable failure, eMBMasterEnable() returned (0x%x).", (int)status); - - // Add slave IP address for each slave to initialize connection - mb_slave_addr_entry_t *p_slave_info; - - LIST_FOREACH(p_slave_info, &mbm_opts->mbm_slave_list, entries) { - result = (BOOL)xMBTCPPortMasterAddSlaveIp(p_slave_info->index, p_slave_info->ip_address, p_slave_info->slave_addr); - MB_MASTER_CHECK(result, ESP_ERR_INVALID_STATE, "mb stack add slave IP failed: %s.", *comm_ip_table); - } - - // Add end of list condition - (void)xMBTCPPortMasterAddSlaveIp(0xFF, NULL, 0xFF); - - // Wait for connection done event - bool start = (bool)xMBTCPPortMasterWaitEvent(mbm_opts->mbm_event_group, - (EventBits_t)MB_EVENT_STACK_STARTED, MB_TCP_CONNECTION_TOUT); - MB_MASTER_CHECK((start), ESP_ERR_INVALID_STATE, - "mb stack could not connect to slaves for %d seconds.", - CONFIG_FMB_TCP_CONNECTION_TOUT_SEC); - return ESP_OK; -} - -static esp_err_t mbc_tcp_master_destroy(void) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_CHECK((mbm_opts != NULL), ESP_ERR_INVALID_ARG, "mb incorrect options pointer."); - eMBErrorCode mb_error = MB_ENOERR; - - // Stop polling by clearing correspondent bit in the event group - xEventGroupClearBits(mbm_opts->mbm_event_group, - (EventBits_t)MB_EVENT_STACK_STARTED); - - // Disable and then destroy the Modbus port - mb_error = eMBMasterDisable(); - MB_MASTER_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE, "mb stack disable failure."); - - (void)vTaskDelete(mbm_opts->mbm_task_handle); - mbm_opts->mbm_task_handle = NULL; - - mb_error = eMBMasterClose(); - MB_MASTER_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb stack close failure returned (0x%x).", (int)mb_error); - - (void)vEventGroupDelete(mbm_opts->mbm_event_group); - mbm_opts->mbm_event_group = NULL; - mbc_tcp_master_free_slave_list(); - free(mbm_interface_ptr); // free the memory allocated for options - vMBPortSetMode((UCHAR)MB_PORT_INACTIVE); - mbm_interface_ptr = NULL; - return ESP_OK; -} - -// Set Modbus parameter description table -static esp_err_t mbc_tcp_master_set_descriptor(const mb_parameter_descriptor_t* descriptor, const uint16_t num_elements) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - MB_MASTER_CHECK((descriptor != NULL), ESP_ERR_INVALID_ARG, "mb incorrect descriptor."); - MB_MASTER_CHECK((num_elements >= 1), ESP_ERR_INVALID_ARG, "mb table size is incorrect."); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_CHECK((mbm_opts != NULL), ESP_ERR_INVALID_ARG, "mb options."); - - const char** comm_ip_table = (const char**)mbm_opts->mbm_comm.ip_addr; - MB_MASTER_CHECK((comm_ip_table != NULL), ESP_ERR_INVALID_ARG, "mb ip table address is incorrect."); - - const mb_parameter_descriptor_t *reg_ptr = descriptor; - uint16_t slave_cnt = 0; - mb_slave_addr_entry_t* p_slave = NULL; - - // Go through all items in the table to check all Modbus registers - for (int idx = 0; idx < (num_elements); idx++, reg_ptr++) - { - // Below is the code to check consistency of the table format and required fields. - MB_MASTER_CHECK((reg_ptr->cid == idx), ESP_ERR_INVALID_ARG, "mb descriptor cid field is incorrect."); - MB_MASTER_CHECK((reg_ptr->param_key != NULL), ESP_ERR_INVALID_ARG, "mb descriptor param key is incorrect."); - MB_MASTER_CHECK((reg_ptr->mb_size > 0), ESP_ERR_INVALID_ARG, "mb descriptor param size is incorrect."); - // Is the slave already in the list? - p_slave = mbc_tcp_master_find_slave_addr(reg_ptr->mb_slave_addr); - // Add it to slave list if not there. - if (!p_slave) { - // Is the IP address correctly defined for the slave? - MB_MASTER_CHECK((comm_ip_table[slave_cnt]), ESP_ERR_INVALID_STATE, "mb missing IP address for cid #%u.", (unsigned)reg_ptr->cid); - // Add slave to the list - MB_MASTER_ASSERT(mbc_tcp_master_add_slave(idx, reg_ptr->mb_slave_addr, comm_ip_table[slave_cnt++]) == ESP_OK); - } - } - mbm_opts->mbm_param_descriptor_table = descriptor; - mbm_opts->mbm_param_descriptor_size = num_elements; - return ESP_OK; -} - -// Send custom Modbus request defined as mb_param_request_t structure -static esp_err_t mbc_tcp_master_send_request(mb_param_request_t* request, void* data_ptr) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_CHECK((request != NULL), ESP_ERR_INVALID_ARG, "mb request structure."); - MB_MASTER_CHECK((data_ptr != NULL), ESP_ERR_INVALID_ARG, "mb incorrect data pointer."); - - eMBMasterReqErrCode mb_error = MB_MRE_MASTER_BUSY; - esp_err_t error = ESP_FAIL; - - if (xMBMasterRunResTake(MB_TCP_API_RESP_TICS)) { - - uint8_t mb_slave_addr = request->slave_addr; - uint8_t mb_command = request->command; - uint16_t mb_offset = request->reg_start; - uint16_t mb_size = request->reg_size; - - // Set the buffer for callback function processing of received data - mbm_opts->mbm_reg_buffer_ptr = (uint8_t*)data_ptr; - mbm_opts->mbm_reg_buffer_size = mb_size; - - vMBMasterRunResRelease(); - - // Calls appropriate request function to send request and waits response - switch(mb_command) - { - case MB_FUNC_READ_COILS: - mb_error = eMBMasterReqReadCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_TCP_API_RESP_TICS); - break; - case MB_FUNC_WRITE_SINGLE_COIL: - mb_error = eMBMasterReqWriteCoil((UCHAR)mb_slave_addr, (USHORT)mb_offset, - *(USHORT *)data_ptr, (LONG)MB_TCP_API_RESP_TICS); - break; - case MB_FUNC_WRITE_MULTIPLE_COILS: - mb_error = eMBMasterReqWriteMultipleCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (UCHAR *)data_ptr, - (LONG)MB_TCP_API_RESP_TICS); - break; - case MB_FUNC_READ_DISCRETE_INPUTS: - mb_error = eMBMasterReqReadDiscreteInputs((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_TCP_API_RESP_TICS); - break; - case MB_FUNC_READ_HOLDING_REGISTER: - mb_error = eMBMasterReqReadHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_TCP_API_RESP_TICS); - break; - case MB_FUNC_WRITE_REGISTER: - mb_error = eMBMasterReqWriteHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, - *(USHORT *)data_ptr, (LONG)MB_TCP_API_RESP_TICS); - break; - - case MB_FUNC_WRITE_MULTIPLE_REGISTERS: - mb_error = eMBMasterReqWriteMultipleHoldingRegister((UCHAR)mb_slave_addr, - (USHORT)mb_offset, (USHORT)mb_size, - (USHORT *)data_ptr, (LONG)MB_TCP_API_RESP_TICS); - break; - case MB_FUNC_READWRITE_MULTIPLE_REGISTERS: - mb_error = eMBMasterReqReadWriteMultipleHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (USHORT *)data_ptr, - (USHORT)mb_offset, (USHORT)mb_size, - (LONG)MB_TCP_API_RESP_TICS); - break; - case MB_FUNC_READ_INPUT_REGISTER: - mb_error = eMBMasterReqReadInputRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset, - (USHORT)mb_size, (LONG)MB_TCP_API_RESP_TICS); - break; - default: - ESP_LOGE(TAG, "%s: Incorrect function in request (%u) ", __FUNCTION__, (unsigned)mb_command); - mb_error = MB_MRE_NO_REG; - break; - } - } - - // Propagate the Modbus errors to higher level - switch(mb_error) - { - case MB_MRE_NO_ERR: - error = ESP_OK; - break; - - case MB_MRE_NO_REG: - error = ESP_ERR_NOT_SUPPORTED; // Invalid register request - break; - - case MB_MRE_TIMEDOUT: - error = ESP_ERR_TIMEOUT; // Slave did not send response - break; - - case MB_MRE_EXE_FUN: - case MB_MRE_REV_DATA: - error = ESP_ERR_INVALID_RESPONSE; // Invalid response from slave - break; - - case MB_MRE_MASTER_BUSY: - error = ESP_ERR_INVALID_STATE; // Master is busy (previous request is pending) - break; - - default: - ESP_LOGE(TAG, "%s: Incorrect return code (0x%x) ", __FUNCTION__, (unsigned)mb_error); - error = ESP_FAIL; - break; - } - - return error; -} - -static esp_err_t mbc_tcp_master_get_cid_info(uint16_t cid, const mb_parameter_descriptor_t** param_buffer) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - - MB_MASTER_CHECK((param_buffer != NULL), ESP_ERR_INVALID_ARG, "mb incorrect data buffer pointer."); - MB_MASTER_CHECK((mbm_opts->mbm_param_descriptor_table != NULL), ESP_ERR_INVALID_ARG, "mb incorrect descriptor table or not set."); - MB_MASTER_CHECK((cid < mbm_opts->mbm_param_descriptor_size), ESP_ERR_NOT_FOUND, "mb incorrect cid of characteristic."); - - // It is assumed that characteristics cid increased in the table - const mb_parameter_descriptor_t* reg_info = &mbm_opts->mbm_param_descriptor_table[cid]; - - MB_MASTER_CHECK((reg_info->param_key != NULL), ESP_ERR_INVALID_ARG, "mb incorrect characteristic key."); - *param_buffer = reg_info; - return ESP_OK; -} - -// Helper function to get modbus command for each type of Modbus register area -static uint8_t mbc_tcp_master_get_command(mb_param_type_t param_type, mb_param_mode_t mode) -{ - uint8_t command = 0; - switch(param_type) - { // - case MB_PARAM_HOLDING: - command = (mode == MB_PARAM_WRITE) ? MB_FUNC_WRITE_MULTIPLE_REGISTERS : MB_FUNC_READ_HOLDING_REGISTER; - break; - case MB_PARAM_INPUT: - command = MB_FUNC_READ_INPUT_REGISTER; - break; - case MB_PARAM_COIL: - command = (mode == MB_PARAM_WRITE) ? MB_FUNC_WRITE_MULTIPLE_COILS : MB_FUNC_READ_COILS; - break; - case MB_PARAM_DISCRETE: - if (mode != MB_PARAM_WRITE) { - command = MB_FUNC_READ_DISCRETE_INPUTS; - } else { - ESP_LOGE(TAG, "%s: Incorrect mode (%u)", __FUNCTION__, (unsigned)mode); - } - break; - default: - ESP_LOGE(TAG, "%s: Incorrect param type (%u)", __FUNCTION__, (unsigned)param_type); - break; - } - return command; -} - -// Helper to search parameter by name in the parameter description table and fills Modbus request fields accordingly -static esp_err_t mbc_tcp_master_set_request(char* name, mb_param_mode_t mode, mb_param_request_t* request, - mb_parameter_descriptor_t* reg_data) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - esp_err_t error = ESP_ERR_NOT_FOUND; - MB_MASTER_CHECK((name != NULL), ESP_ERR_INVALID_ARG, "mb incorrect parameter name."); - MB_MASTER_CHECK((request != NULL), ESP_ERR_INVALID_ARG, "mb incorrect request parameter."); - MB_MASTER_CHECK((mode <= MB_PARAM_WRITE), ESP_ERR_INVALID_ARG, "mb incorrect mode."); - MB_MASTER_ASSERT(mbm_opts->mbm_param_descriptor_table != NULL); - const mb_parameter_descriptor_t* reg_ptr = mbm_opts->mbm_param_descriptor_table; - for (uint16_t counter = 0; counter < (mbm_opts->mbm_param_descriptor_size); counter++, reg_ptr++) - { - // Check the cid of the parameter is equal to record number in the table - // Check the length of name and parameter key strings from table - size_t param_key_len = strlen((const char*)reg_ptr->param_key); - if (param_key_len != strlen((const char*)name)) { - continue; // The length of strings is different then check next record in the table - } - // Compare the name of parameter with parameter key from table - int comp_result = memcmp((const void*)name, (const void*)reg_ptr->param_key, (size_t)param_key_len); - if (comp_result == 0) { - // The correct line is found in the table and reg_ptr points to the found parameter description - request->slave_addr = reg_ptr->mb_slave_addr; - request->reg_start = reg_ptr->mb_reg_start; - request->reg_size = reg_ptr->mb_size; - request->command = mbc_tcp_master_get_command(reg_ptr->mb_param_type, mode); - MB_MASTER_CHECK((request->command > 0), ESP_ERR_INVALID_ARG, "mb incorrect command or parameter type."); - if (reg_data != NULL) { - *reg_data = *reg_ptr; // Set the cid registered parameter data - } - error = ESP_OK; - break; - } - } - return error; -} - -// Get parameter data for corresponding characteristic -static esp_err_t mbc_tcp_master_get_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t *type) -{ - MB_MASTER_CHECK((name != NULL), ESP_ERR_INVALID_ARG, "mb incorrect descriptor."); - MB_MASTER_CHECK((type != NULL), ESP_ERR_INVALID_ARG, "type pointer is incorrect."); - MB_MASTER_CHECK((value != NULL), ESP_ERR_INVALID_ARG, "value pointer is incorrect."); - esp_err_t error = ESP_ERR_INVALID_RESPONSE; - mb_param_request_t request ; - mb_parameter_descriptor_t reg_info = { 0 }; - uint8_t* pdata = NULL; - - error = mbc_tcp_master_set_request(name, MB_PARAM_READ, &request, ®_info); - if ((error == ESP_OK) && (cid == reg_info.cid)) { - // alloc buffer to store parameter data - pdata = calloc(1, (reg_info.mb_size << 1)); - if (!pdata) { - return ESP_ERR_INVALID_STATE; - } - error = mbc_tcp_master_send_request(&request, pdata); - if (error == ESP_OK) { - // If data pointer is NULL then we don't need to set value (it is still in the cache of cid) - if (value != NULL) { - error = mbc_master_set_param_data((void*)value, (void*)pdata, - reg_info.param_type, reg_info.param_size); - if (error != ESP_OK) { - ESP_LOGE(TAG, "fail to set parameter data."); - error = ESP_ERR_INVALID_STATE; - } else { - ESP_LOGD(TAG, "%s: Good response for get cid(%u) = %s", - __FUNCTION__, (unsigned)reg_info.cid, (char*)esp_err_to_name(error)); - } - } - } else { - ESP_LOGD(TAG, "%s: Bad response to get cid(%u) = %s", - __FUNCTION__, (unsigned)reg_info.cid, (char*)esp_err_to_name(error)); - } - free(pdata); - // Set the type of parameter found in the table - *type = reg_info.param_type; - } else { - ESP_LOGE(TAG, "%s: The cid(%u) not found in the data dictionary.", __FUNCTION__, reg_info.cid); - error = ESP_ERR_INVALID_ARG; - } - return error; -} - -// Set parameter value for characteristic selected by name and cid -static esp_err_t mbc_tcp_master_set_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t *type) -{ - MB_MASTER_CHECK((name != NULL), ESP_ERR_INVALID_ARG, "mb incorrect descriptor."); - MB_MASTER_CHECK((value != NULL), ESP_ERR_INVALID_ARG, "value pointer is incorrect."); - MB_MASTER_CHECK((type != NULL), ESP_ERR_INVALID_ARG, "type pointer is incorrect."); - - esp_err_t error = ESP_ERR_INVALID_RESPONSE; - mb_param_request_t request ; - mb_parameter_descriptor_t reg_info = { 0 }; - uint8_t* pdata = NULL; - - error = mbc_tcp_master_set_request(name, MB_PARAM_WRITE, &request, ®_info); - if ((error == ESP_OK) && (cid == reg_info.cid)) { - pdata = calloc(1, (reg_info.mb_size << 1)); // alloc parameter buffer - if (!pdata) { - return ESP_ERR_INVALID_STATE; - } - // Transfer value of characteristic into parameter buffer - error = mbc_master_set_param_data((void*)pdata, (void*)value, - reg_info.param_type, reg_info.param_size); - if (error != ESP_OK) { - ESP_LOGE(TAG, "fail to set parameter data."); - free(pdata); - return ESP_ERR_INVALID_STATE; - } - // Send request to write characteristic data - error = mbc_tcp_master_send_request(&request, pdata); - if (error == ESP_OK) { - ESP_LOGD(TAG, "%s: Good response for set cid(%u) = %s", - __FUNCTION__, (unsigned)reg_info.cid, (char*)esp_err_to_name(error)); - } else { - ESP_LOGD(TAG, "%s: Bad response to set cid(%u) = %s", - __FUNCTION__, (unsigned)reg_info.cid, (char*)esp_err_to_name(error)); - } - free(pdata); - // Set the type of parameter found in the table - *type = reg_info.param_type; - } else { - ESP_LOGE(TAG, "%s: The requested cid(%u) not found in the data dictionary.", - __FUNCTION__, (unsigned)reg_info.cid); - error = ESP_ERR_INVALID_ARG; - } - return error; -} - -/* ----------------------- Callback functions for Modbus stack ---------------------------------*/ -// These are executed by modbus stack to read appropriate type of registers. - -/** - * Modbus master input register callback function. - * - * @param pucRegBuffer input register buffer - * @param usAddress input register address - * @param usNRegs input register number - * - * @return result - */ -// Callback function for reading of MB Input Registers -eMBErrorCode eMBRegInputCBTcpMaster(UCHAR* pucRegBuffer, USHORT usAddress, USHORT usNRegs) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_ASSERT(pucRegBuffer != NULL); - USHORT usRegInputNregs = (USHORT)mbm_opts->mbm_reg_buffer_size; // Number of input registers to be transferred - UCHAR* pucInputBuffer = (UCHAR*)mbm_opts->mbm_reg_buffer_ptr; // Get instance address - USHORT usRegs = usNRegs; - eMBErrorCode eStatus = MB_ENOERR; - // If input or configuration parameters are incorrect then return an error to stack layer - if ((pucInputBuffer != NULL) - && (usNRegs >= 1) - && (usRegInputNregs == usRegs)) { - while (usRegs > 0) { - _XFER_2_RD(pucInputBuffer, pucRegBuffer); - usRegs -= 1; - } - } else { - eStatus = MB_ENOREG; - } - return eStatus; -} - -/** - * Modbus master holding register callback function. - * - * @param pucRegBuffer holding register buffer - * @param usAddress holding register address - * @param usNRegs holding register number - * @param eMode read or write - * - * @return result - */ -// Callback function for reading of MB Holding Registers -// Executed by stack when request to read/write holding registers is received -eMBErrorCode eMBRegHoldingCBTcpMaster(UCHAR *pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t *mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_ASSERT(pucRegBuffer != NULL); - USHORT usRegHoldingNregs = (USHORT)mbm_opts->mbm_reg_buffer_size; - UCHAR *pucHoldingBuffer = (UCHAR *)mbm_opts->mbm_reg_buffer_ptr; - eMBErrorCode eStatus = MB_ENOERR; - USHORT usRegs = usNRegs; - // Check input and configuration parameters for correctness - if ((pucHoldingBuffer != NULL) && (usRegHoldingNregs == usNRegs) && (usNRegs >= 1)) - { - switch (eMode) - { - case MB_REG_WRITE: - while (usRegs > 0) - { - _XFER_2_RD(pucRegBuffer, pucHoldingBuffer); - usRegs -= 1; - }; - break; - case MB_REG_READ: - while (usRegs > 0) - { - _XFER_2_WR(pucHoldingBuffer, pucRegBuffer); - pucHoldingBuffer += 2; - usRegs -= 1; - }; - break; - } - } - else - { - eStatus = MB_ENOREG; - } - return eStatus; -} - -/** - * Modbus master coils callback function. - * - * @param pucRegBuffer coils buffer - * @param usAddress coils address - * @param usNCoils coils number - * @param eMode read or write - * - * @return result - */ -// Callback function for reading of MB Coils Registers -eMBErrorCode eMBRegCoilsCBTcpMaster(UCHAR *pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_ASSERT(NULL != pucRegBuffer); - USHORT usRegCoilNregs = (USHORT)mbm_opts->mbm_reg_buffer_size; - UCHAR* pucRegCoilsBuf = (UCHAR*)mbm_opts->mbm_reg_buffer_ptr; - eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex; - USHORT usCoils = usNCoils; - usAddress--; // The address is already + 1 - if ((usRegCoilNregs >= 1) - && (pucRegCoilsBuf != NULL) - && (usNCoils == usRegCoilNregs)) { - iRegIndex = (usAddress % 8); - switch (eMode) { - case MB_REG_WRITE: - while (usCoils > 0) { - UCHAR ucResult = xMBUtilGetBits(pucRegCoilsBuf, iRegIndex - (usAddress % 8), 1); - xMBUtilSetBits(pucRegBuffer, iRegIndex - (usAddress % 8) , 1, ucResult); - iRegIndex++; - usCoils--; - } - break; - case MB_REG_READ: - while (usCoils > 0) { - UCHAR ucResult = xMBUtilGetBits(pucRegBuffer, iRegIndex - (usAddress % 8), 1); - xMBUtilSetBits(pucRegCoilsBuf, iRegIndex - (usAddress % 8), 1, ucResult); - iRegIndex++; - usCoils--; - } - break; - } // switch ( eMode ) - } else { - // If the configuration or input parameters are incorrect then return error to stack - eStatus = MB_ENOREG; - } - return eStatus; -} - -/** - * Modbus master discrete callback function. - * - * @param pucRegBuffer discrete buffer - * @param usAddress discrete address - * @param usNDiscrete discrete number - * - * @return result - */ -// Callback function for reading of MB Discrete Input Registers -eMBErrorCode eMBRegDiscreteCBTcpMaster(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNDiscrete) -{ - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - MB_MASTER_ASSERT(pucRegBuffer != NULL); - USHORT usRegDiscreteNregs = (USHORT)mbm_opts->mbm_reg_buffer_size; - UCHAR* pucRegDiscreteBuf = (UCHAR*)mbm_opts->mbm_reg_buffer_ptr; - eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegBitIndex, iNReg; - UCHAR* pucDiscreteInputBuf; - iNReg = usNDiscrete / 8 + 1; - pucDiscreteInputBuf = (UCHAR*) pucRegDiscreteBuf; - // It is already plus one in Modbus function method. - usAddress--; - if ((usRegDiscreteNregs >= 1) - && (pucRegDiscreteBuf != NULL) - && (usNDiscrete >= 1)) { - iRegBitIndex = (USHORT)(usAddress) % 8; // Get bit index - while (iNReg > 1) - { - xMBUtilSetBits(pucDiscreteInputBuf++, iRegBitIndex - (usAddress % 8), 8, *pucRegBuffer++); - iNReg--; - } - // last discrete - usNDiscrete = usNDiscrete % 8; - // xMBUtilSetBits has bug when ucNBits is zero - if (usNDiscrete != 0) - { - xMBUtilSetBits(pucDiscreteInputBuf, iRegBitIndex - (usAddress % 8), usNDiscrete, *pucRegBuffer++); - } - } else { - eStatus = MB_ENOREG; - } - return eStatus; -} - -// Initialization of resources for Modbus TCP master controller -esp_err_t mbc_tcp_master_create(void** handler) -{ - // Allocate space for master interface structure - if (mbm_interface_ptr == NULL) { - mbm_interface_ptr = malloc(sizeof(mb_master_interface_t)); - } - MB_MASTER_ASSERT(mbm_interface_ptr != NULL); - - // Initialize interface properties - mb_master_options_t* mbm_opts = &mbm_interface_ptr->opts; - mbm_opts->port_type = MB_PORT_TCP_MASTER; - - vMBPortSetMode((UCHAR)MB_PORT_TCP_MASTER); - - mbm_opts->mbm_comm.ip_mode = MB_MODE_TCP; - mbm_opts->mbm_comm.ip_port = MB_TCP_DEFAULT_PORT; - - // Initialization of active context of the modbus controller - BaseType_t status = 0; - // Parameter change notification queue - mbm_opts->mbm_event_group = xEventGroupCreate(); - MB_MASTER_CHECK((mbm_opts->mbm_event_group != NULL), ESP_ERR_NO_MEM, "mb event group error."); - // Create modbus controller task - status = xTaskCreate((void*)&modbus_tcp_master_task, - "modbus_tcp_master_task", - MB_CONTROLLER_STACK_SIZE, - NULL, // No parameters - MB_CONTROLLER_PRIORITY, - &mbm_opts->mbm_task_handle); - if (status != pdPASS) { - vTaskDelete(mbm_opts->mbm_task_handle); - MB_MASTER_CHECK((status == pdPASS), ESP_ERR_NO_MEM, - "mb controller task creation error, xTaskCreate() returns (%u).", (unsigned)status); - } - MB_MASTER_ASSERT(mbm_opts->mbm_task_handle != NULL); // The task is created but handle is incorrect - - LIST_INIT(&mbm_opts->mbm_slave_list); // Init slave address list - mbm_opts->mbm_slave_list_count = 0; - - // Initialize public interface methods of the interface - mbm_interface_ptr->init = mbc_tcp_master_create; - mbm_interface_ptr->destroy = mbc_tcp_master_destroy; - mbm_interface_ptr->setup = mbc_tcp_master_setup; - mbm_interface_ptr->start = mbc_tcp_master_start; - mbm_interface_ptr->get_cid_info = mbc_tcp_master_get_cid_info; - mbm_interface_ptr->get_parameter = mbc_tcp_master_get_parameter; - mbm_interface_ptr->send_request = mbc_tcp_master_send_request; - mbm_interface_ptr->set_descriptor = mbc_tcp_master_set_descriptor; - mbm_interface_ptr->set_parameter = mbc_tcp_master_set_parameter; - - mbm_interface_ptr->master_reg_cb_discrete = eMBRegDiscreteCBTcpMaster; - mbm_interface_ptr->master_reg_cb_input = eMBRegInputCBTcpMaster; - mbm_interface_ptr->master_reg_cb_holding = eMBRegHoldingCBTcpMaster; - mbm_interface_ptr->master_reg_cb_coils = eMBRegCoilsCBTcpMaster; - - *handler = mbm_interface_ptr; - - return ESP_OK; -} - -#endif //#if MB_MASTER_TCP_ENABLED diff --git a/managed_components/espressif__esp-modbus/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.h b/managed_components/espressif__esp-modbus/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.h deleted file mode 100755 index b0731df..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -// mbc_tcp_master.h Modbus controller TCP master implementation header file - -#ifndef _MODBUS_TCP_CONTROLLER_MASTER -#define _MODBUS_TCP_CONTROLLER_MASTER - -#include // for standard int types definition -#include // for NULL and std defines -#include "esp_modbus_common.h" // for common defines - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_INST_MIN_SIZE (2) // The minimal size of Modbus registers area in bytes -#define MB_INST_MAX_SIZE (CONFIG_MB_INST_MAX_SIZE) // The maximum size of Modbus area in bytes - -#define MB_CONTROLLER_NOTIFY_QUEUE_SIZE (CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE) // Number of messages in parameter notification queue -#define MB_CONTROLLER_NOTIFY_TIMEOUT (pdMS_TO_TICKS(CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT)) // notification timeout - -/** - * @brief Create Modbus Master controller and stack for TCP port - * - * @param[out] handler handler(pointer) to master data structure - * @return - * - ESP_OK Success - * - ESP_ERR_NO_MEM Parameter error - */ -esp_err_t mbc_tcp_master_create(void** handler); - -#endif // _MODBUS_TCP_CONTROLLER_SLAVE diff --git a/managed_components/espressif__esp-modbus/freemodbus/tcp_master/port/port_tcp_master.c b/managed_components/espressif__esp-modbus/freemodbus/tcp_master/port/port_tcp_master.c deleted file mode 100755 index ff8930d..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/tcp_master/port/port_tcp_master.c +++ /dev/null @@ -1,1035 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 TCP Port - * Copyright (C) 2006 Christian Walter - * Parts of crt0.S Copyright (c) 1995, 1996, 1998 Cygnus Support - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: port.c,v 1.2 2006/09/04 14:39:20 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include -#include -#include "esp_err.h" -#include "esp_timer.h" - -/* ----------------------- lwIP includes ------------------------------------*/ -#include "lwip/err.h" -#include "lwip/sockets.h" -#include "lwip/netdb.h" -#include "esp_netif.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb_m.h" -#include "port.h" -#include "mbport.h" -#include "mbframe.h" -#include "port_tcp_master.h" - -#if MB_MASTER_TCP_ENABLED - -/* ----------------------- Defines -----------------------------------------*/ -#define MB_TCP_CONNECTION_TIMEOUT_MS ( 20 ) // Connection timeout in mS -#define MB_TCP_RECONNECT_TIMEOUT ( 5000000 ) // Connection timeout in uS - -#define MB_EVENT_REQ_DONE_MASK ( EV_MASTER_PROCESS_SUCCESS | \ - EV_MASTER_ERROR_RESPOND_TIMEOUT | \ - EV_MASTER_ERROR_RECEIVE_DATA | \ - EV_MASTER_ERROR_EXECUTE_FUNCTION ) - -#define MB_EVENT_REQ_ERR_MASK ( EV_MASTER_PROCESS_SUCCESS ) - -#define MB_EVENT_WAIT_TOUT_MS ( 3000 ) -#define MB_SHDN_WAIT_TOUT_MS ( 5000 ) - -#define MB_TCP_READ_TICK_MS ( 1 ) -#define MB_TCP_READ_BUF_RETRY_CNT ( 4 ) -#define MB_SLAVE_FMT(fmt) "Slave #%d, Socket(#%d)(%s)"fmt - -/* ----------------------- Types & Prototypes --------------------------------*/ -void vMBPortEventClose(void); - -/* ----------------------- Static variables ---------------------------------*/ -static const char *TAG = "MB_TCP_MASTER_PORT"; -static MbPortConfig_t xMbPortConfig; -static EventGroupHandle_t xMasterEventHandle = NULL; -static SemaphoreHandle_t xShutdownSema = NULL; -static EventBits_t xMasterEvent = 0; - -/* ----------------------- Static functions ---------------------------------*/ -static void vMBTCPPortMasterTask(void *pvParameters); - -/* ----------------------- Begin implementation -----------------------------*/ - -// Waits for stack start event to start Modbus event processing -BOOL xMBTCPPortMasterWaitEvent(EventGroupHandle_t xEventHandle, EventBits_t xEvent, USHORT usTimeout) -{ - xMasterEventHandle = xEventHandle; - xMasterEvent = xEvent; - BaseType_t status = xEventGroupWaitBits(xMasterEventHandle, - (BaseType_t)(xEvent), - pdFALSE, // do not clear start bit - pdFALSE, - usTimeout); - return (BOOL)(status & xEvent); -} - -BOOL -xMBMasterTCPPortInit( USHORT usTCPPort ) -{ - BOOL bOkay = FALSE; - - xMbPortConfig.pxMbSlaveInfo = calloc(MB_TCP_PORT_MAX_CONN, sizeof(MbSlaveInfo_t*)); - if (!xMbPortConfig.pxMbSlaveInfo) { - ESP_LOGE(TAG, "TCP slave info alloc failure."); - return FALSE; - } - for(int idx = 0; idx < MB_TCP_PORT_MAX_CONN; xMbPortConfig.pxMbSlaveInfo[idx] = NULL, idx++); - - xMbPortConfig.xConnectQueue = NULL; - xMbPortConfig.usPort = usTCPPort; - xMbPortConfig.usMbSlaveInfoCount = 0; - xMbPortConfig.ucCurSlaveIndex = 1; - xMbPortConfig.pxMbSlaveCurrInfo = NULL; - - xMbPortConfig.xConnectQueue = xQueueCreate(2, sizeof(MbSlaveAddrInfo_t)); - if (xMbPortConfig.xConnectQueue == 0) - { - // Queue was not created and must not be used. - ESP_LOGE(TAG, "TCP master queue creation failure."); - return FALSE; - } - - // Create task for packet processing - BaseType_t xErr = xTaskCreatePinnedToCore(vMBTCPPortMasterTask, - "mbm_port_tcp_task", - MB_TCP_STACK_SIZE, - NULL, - MB_TCP_TASK_PRIO, - &xMbPortConfig.xMbTcpTaskHandle, - MB_PORT_TASK_AFFINITY); - if (xErr != pdTRUE) - { - ESP_LOGE(TAG, "TCP master task creation failure."); - (void)vTaskDelete(xMbPortConfig.xMbTcpTaskHandle); - } else { - ESP_LOGI(TAG, "TCP master stack initialized."); - bOkay = TRUE; - } - return bOkay; -} - -static MbSlaveInfo_t *vMBTCPPortMasterFindSlaveInfo(UCHAR ucSlaveAddr) -{ - int xIndex; - BOOL xFound = false; - for (xIndex = 0; xIndex < xMbPortConfig.usMbSlaveInfoCount; xIndex++) { - if (xMbPortConfig.pxMbSlaveInfo[xIndex]->ucSlaveAddr == ucSlaveAddr) { - xMbPortConfig.pxMbSlaveCurrInfo = xMbPortConfig.pxMbSlaveInfo[xIndex]; - xFound = TRUE; - xMbPortConfig.ucCurSlaveIndex = xIndex; - } - } - if (!xFound) { - xMbPortConfig.pxMbSlaveCurrInfo = NULL; - ESP_LOGE(TAG, "Slave info for short address %u not found.", ucSlaveAddr); - } - return xMbPortConfig.pxMbSlaveCurrInfo; -} - -static MbSlaveInfo_t *vMBTCPPortMasterGetCurrInfo(void) -{ - if (!xMbPortConfig.pxMbSlaveCurrInfo) { - ESP_LOGE(TAG, "Incorrect current slave info."); - } - return xMbPortConfig.pxMbSlaveCurrInfo; -} - -// Start Modbus event state machine -static void vMBTCPPortMasterStartPoll(void) -{ - if (xMasterEventHandle) { - // Set the mbcontroller start flag - EventBits_t xFlags = xEventGroupSetBits(xMasterEventHandle, - (EventBits_t)xMasterEvent); - if (!(xFlags & xMasterEvent)) { - ESP_LOGE(TAG, "Fail to start TCP stack."); - } - } else { - ESP_LOGE(TAG, "Fail to start polling. Incorrect event handle..."); - } -} - -// Stop Modbus event state machine -static void vMBTCPPortMasterStopPoll(void) -{ - if (xMasterEventHandle) { - // Set the mbcontroller start flag - EventBits_t xFlags = xEventGroupClearBits(xMasterEventHandle, - (EventBits_t)xMasterEvent); - if (!(xFlags & xMasterEvent)) { - ESP_LOGE(TAG, "Fail to stop polling."); - } - } else { - ESP_LOGE(TAG, "Fail to stop polling. Incorrect event handle..."); - } -} - -// The helper function to get time stamp in microseconds -static int64_t xMBTCPGetTimeStamp(void) -{ - int64_t xTimeStamp = esp_timer_get_time(); - return xTimeStamp; -} - -static void vMBTCPPortMasterMStoTimeVal(USHORT usTimeoutMs, struct timeval *tv) -{ - tv->tv_sec = usTimeoutMs / 1000; - tv->tv_usec = (usTimeoutMs - (tv->tv_sec * 1000)) * 1000; -} - -static BOOL xMBTCPPortMasterCloseConnection(MbSlaveInfo_t *pxInfo) -{ - if (!pxInfo) { - return FALSE; - } - if (pxInfo->xSockId == -1) { - ESP_LOGE(TAG, "Wrong socket info or disconnected socket: %d, skip.", (int)pxInfo->xSockId); - return FALSE; - } - if (shutdown(pxInfo->xSockId, SHUT_RDWR) == -1) { - ESP_LOGV(TAG, "Shutdown failed sock %d, errno=%u", (int)pxInfo->xSockId, (unsigned)errno); - } - close(pxInfo->xSockId); - pxInfo->xSockId = -1; - return TRUE; -} - -static void xMBTCPPortMasterShutdown(void) -{ - xSemaphoreGive(xShutdownSema); - - for (USHORT ucCnt = 0; ucCnt < MB_TCP_PORT_MAX_CONN; ucCnt++) { - MbSlaveInfo_t* pxInfo = xMbPortConfig.pxMbSlaveInfo[ucCnt]; - if (pxInfo) { - xMBTCPPortMasterCloseConnection(pxInfo); - if (pxInfo->pucRcvBuf) { - free(pxInfo->pucRcvBuf); - } - free(pxInfo); - xMbPortConfig.pxMbSlaveInfo[ucCnt] = NULL; - } - } - free(xMbPortConfig.pxMbSlaveInfo); - vTaskDelete(NULL); - xMbPortConfig.xMbTcpTaskHandle = NULL; -} - -void vMBTCPPortMasterSetNetOpt(void *pvNetIf, eMBPortIpVer xIpVersion, eMBPortProto xProto) -{ - xMbPortConfig.pvNetIface = pvNetIf; - xMbPortConfig.eMbProto = xProto; - xMbPortConfig.eMbIpVer = xIpVersion; -} - -// Function returns time left for response processing according to response timeout -static int64_t xMBTCPPortMasterGetRespTimeLeft(MbSlaveInfo_t *pxInfo) -{ - if (!pxInfo) { - return 0; - } - int64_t xTimeStamp = xMBTCPGetTimeStamp() - pxInfo->xSendTimeStamp; - return (xTimeStamp > (1000 * MB_MASTER_TIMEOUT_MS_RESPOND)) ? 0 : - (MB_MASTER_TIMEOUT_MS_RESPOND - (xTimeStamp / 1000) - 1); -} - -// Wait socket ready to read state -static int vMBTCPPortMasterRxCheck(int xSd, fd_set *pxFdSet, int xTimeMs) -{ - fd_set xReadSet = *pxFdSet; - fd_set xErrorSet = *pxFdSet; - int xRes = 0; - struct timeval xTimeout; - - vMBTCPPortMasterMStoTimeVal(xTimeMs, &xTimeout); - xRes = select(xSd + 1, &xReadSet, NULL, &xErrorSet, &xTimeout); - if (xRes == 0) { - // No respond from slave during timeout - xRes = ERR_TIMEOUT; - } else if ((xRes < 0) || FD_ISSET(xSd, &xErrorSet)) { - xRes = -1; - } - - *pxFdSet = xReadSet; - return xRes; -} - -static int xMBTCPPortMasterGetBuf(MbSlaveInfo_t *pxInfo, UCHAR *pucDstBuf, USHORT usLength, uint16_t xTimeMs) -{ - int xLength = 0; - UCHAR *pucBuf = pucDstBuf; - USHORT usBytesLeft = usLength; - struct timeval xTime; - - MB_PORT_CHECK((pxInfo && pxInfo->xSockId > -1), -1, "Try to read incorrect socket = #%d.", (int)pxInfo->xSockId); - - // Set receive timeout for socket <= slave respond time - xTime.tv_sec = xTimeMs / 1000; - xTime.tv_usec = (xTimeMs % 1000) * 1000; - setsockopt(pxInfo->xSockId, SOL_SOCKET, SO_RCVTIMEO, &xTime, sizeof(xTime)); - - // Receive data from connected client - while (usBytesLeft > 0) { - TCP_PORT_CHECK_SHDN(xShutdownSema, xMBTCPPortMasterShutdown); - xLength = recv(pxInfo->xSockId, pucBuf, usBytesLeft, 0); - if (xLength < 0) { - if (errno == EAGAIN) { - // Read timeout occurred, check the timeout and return - } else if (errno == ENOTCONN) { - // Socket connection closed - ESP_LOGE(TAG, "Socket(#%d)(%s) connection closed.", - (int)pxInfo->xSockId, pxInfo->pcIpAddr); - return ERR_CONN; - } else { - // Other error occurred during receiving - ESP_LOGE(TAG, "Socket(#%d)(%s) receive error, length=%u, errno=%u", - (int)pxInfo->xSockId, pxInfo->pcIpAddr, (unsigned)xLength, (unsigned)errno); - return -1; - } - } else if (xLength) { - pucBuf += xLength; - usBytesLeft -= xLength; - } - if (xMBTCPPortMasterGetRespTimeLeft(pxInfo) == 0) { - return ERR_TIMEOUT; - } - } - return usLength; -} - -static int vMBTCPPortMasterReadPacket(MbSlaveInfo_t *pxInfo) -{ - int xLength = 0; - int xRet = 0; - USHORT usTidRcv = 0; - - // Receive data from connected client - if (pxInfo) { - MB_PORT_CHECK((pxInfo->xSockId > 0), -1, "Try to read incorrect socket = #%d.", pxInfo->xSockId); - // Read packet header - xRet = xMBTCPPortMasterGetBuf(pxInfo, &pxInfo->pucRcvBuf[0], - MB_TCP_UID, xMBTCPPortMasterGetRespTimeLeft(pxInfo)); - if (xRet < 0) { - pxInfo->xRcvErr = xRet; - return xRet; - } else if (xRet != MB_TCP_UID) { - ESP_LOGD(TAG, "Socket (#%d)(%s), Fail to read modbus header. ret=%d", - (int)pxInfo->xSockId, pxInfo->pcIpAddr, (int)xRet); - pxInfo->xRcvErr = ERR_VAL; - return ERR_VAL; - } - // If we have received the MBAP header we can analyze it and calculate - // the number of bytes left to complete the current request. - xLength = (int)MB_TCP_GET_FIELD(pxInfo->pucRcvBuf, MB_TCP_LEN); - xRet = xMBTCPPortMasterGetBuf(pxInfo, &pxInfo->pucRcvBuf[MB_TCP_UID], - xLength, xMBTCPPortMasterGetRespTimeLeft(pxInfo)); - if (xRet < 0) { - pxInfo->xRcvErr = xRet; - return xRet; - } else if (xRet != xLength) { - // Received incorrect or fragmented packet. - ESP_LOGD(TAG, "Socket(#%d)(%s) incorrect packet, length=%u, TID=0x%02x, errno=%u(%s)", - (int)pxInfo->xSockId, pxInfo->pcIpAddr, (int)pxInfo->usRcvPos, - (int)usTidRcv, (unsigned)errno, strerror(errno)); - pxInfo->xRcvErr = ERR_VAL; - return ERR_VAL; - } - usTidRcv = MB_TCP_GET_FIELD(pxInfo->pucRcvBuf, MB_TCP_TID); - - // Check transaction identifier field in the incoming packet. - if ((pxInfo->usTidCnt - 1) != usTidRcv) { - ESP_LOGD(TAG, "Socket (#%d)(%s), incorrect TID(0x%02x)!=(0x%02x) received, discard data.", - (int)pxInfo->xSockId, pxInfo->pcIpAddr, (int)usTidRcv, (int)(pxInfo->usTidCnt - 1)); - pxInfo->xRcvErr = ERR_BUF; - return ERR_BUF; - } - pxInfo->usRcvPos += xRet + MB_TCP_UID; - ESP_LOGD(TAG, "Socket(#%d)(%s) get data, length=%u, TID=0x%02x, errno=%u(%s)", - (int)pxInfo->xSockId, pxInfo->pcIpAddr, (unsigned)pxInfo->usRcvPos, - (unsigned)usTidRcv, (unsigned)errno, strerror(errno)); - pxInfo->xRcvErr = ERR_OK; - return pxInfo->usRcvPos; - } - return -1; -} - -static err_t xMBTCPPortMasterSetNonBlocking(MbSlaveInfo_t *pxInfo) -{ - if (!pxInfo) { - return ERR_CONN; - } - // Set non blocking attribute for socket - ULONG ulFlags = fcntl(pxInfo->xSockId, F_GETFL); - if (fcntl(pxInfo->xSockId, F_SETFL, ulFlags | O_NONBLOCK) == -1) { - ESP_LOGE(TAG, "Socket(#%d)(%s), fcntl() call error=%u", - (int)pxInfo->xSockId, pxInfo->pcIpAddr, (unsigned)errno); - return ERR_WOULDBLOCK; - } - return ERR_OK; -} - -static void vMBTCPPortSetKeepAlive(MbSlaveInfo_t *pxInfo) -{ - int optval = 1; - setsockopt(pxInfo->xSockId, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)); -} - -// Check connection for timeout helper -static err_t xMBTCPPortMasterCheckAlive(MbSlaveInfo_t *pxInfo, ULONG xTimeoutMs) -{ - fd_set xWriteSet; - fd_set xErrorSet; - err_t xErr = -1; - struct timeval xTimeVal; - - if (pxInfo && pxInfo->xSockId != -1) { - FD_ZERO(&xWriteSet); - FD_ZERO(&xErrorSet); - FD_SET(pxInfo->xSockId, &xWriteSet); - FD_SET(pxInfo->xSockId, &xErrorSet); - vMBTCPPortMasterMStoTimeVal(xTimeoutMs, &xTimeVal); - // Check if the socket is writable - xErr = select(pxInfo->xSockId + 1, NULL, &xWriteSet, &xErrorSet, &xTimeVal); - if ((xErr < 0) || FD_ISSET(pxInfo->xSockId, &xErrorSet)) { - if (errno == EINPROGRESS) { - xErr = ERR_INPROGRESS; - } else { - ESP_LOGV(TAG, MB_SLAVE_FMT(" connection, select write err(errno) = 0x%x(%u)."), - (int)pxInfo->xIndex, (int)pxInfo->xSockId, pxInfo->pcIpAddr, (int)xErr, (unsigned)errno); - xErr = ERR_CONN; - } - } else if (xErr == 0) { - ESP_LOGV(TAG, "Socket(#%d)(%s), connection timeout occurred, err(errno) = 0x%x(%u).", - (int)pxInfo->xSockId, pxInfo->pcIpAddr, (int)xErr, (unsigned)errno); - return ERR_INPROGRESS; - } else { - int xOptErr = 0; - ULONG ulOptLen = sizeof(xOptErr); - // Check socket error - xErr = getsockopt(pxInfo->xSockId, SOL_SOCKET, SO_ERROR, (void*)&xOptErr, (socklen_t*)&ulOptLen); - if (xOptErr != 0) { - ESP_LOGD(TAG, "Socket(#%d)(%s), sock error occurred (%u).", - (int)pxInfo->xSockId, pxInfo->pcIpAddr, (unsigned)xOptErr); - return ERR_CONN; - } - ESP_LOGV(TAG, "Socket(#%d)(%s), is alive.", - (int)pxInfo->xSockId, pxInfo->pcIpAddr); - return ERR_OK; - } - } else { - xErr = ERR_CONN; - } - return xErr; -} - -// Resolve host name and/or fill the IP address structure -static BOOL xMBTCPPortMasterCheckHost(const CHAR *pcHostStr, ip_addr_t *pxHostAddr) -{ - MB_PORT_CHECK((pcHostStr), FALSE, "Wrong host name or IP."); - CHAR cStr[45]; - CHAR *pcStr = &cStr[0]; - ip_addr_t xTargetAddr; - struct addrinfo xHint; - struct addrinfo *pxAddrList; - memset(&xHint, 0, sizeof(xHint)); - // Do name resolution for both protocols - xHint.ai_family = AF_UNSPEC; - xHint.ai_flags = AI_ADDRCONFIG; // get IPV6 address if supported, otherwise IPV4 - memset(&xTargetAddr, 0, sizeof(xTargetAddr)); - - // convert domain name to IP address - // Todo: check EAI_FAIL error when resolve host name - int xRet = getaddrinfo(pcHostStr, NULL, &xHint, &pxAddrList); - - if (xRet != 0) { - ESP_LOGE(TAG, "Incorrect host name or IP: %s", pcHostStr); - return FALSE; - } - if (pxAddrList->ai_family == AF_INET) { - struct in_addr addr4 = ((struct sockaddr_in *) (pxAddrList->ai_addr))->sin_addr; - inet_addr_to_ip4addr(ip_2_ip4(&xTargetAddr), &addr4); - pcStr = ip4addr_ntoa_r(ip_2_ip4(&xTargetAddr), cStr, sizeof(cStr)); - } -#if CONFIG_LWIP_IPV6 - else { - struct in6_addr addr6 = ((struct sockaddr_in6 *) (pxAddrList->ai_addr))->sin6_addr; - inet6_addr_to_ip6addr(ip_2_ip6(&xTargetAddr), &addr6); - pcStr = ip6addr_ntoa_r(ip_2_ip6(&xTargetAddr), cStr, sizeof(cStr)); - } -#endif - if (pxHostAddr) { - *pxHostAddr = xTargetAddr; - } - ESP_LOGI(TAG, "Host IP: [%s]", pcStr); - freeaddrinfo(pxAddrList); - return TRUE; -} - -BOOL xMBTCPPortMasterAddSlaveIp(const USHORT usIndex, const CHAR *pcIpStr, UCHAR ucSlaveAddress) -{ - BOOL xRes = FALSE; - MbSlaveAddrInfo_t xSlaveAddrInfo = {0}; - MB_PORT_CHECK(xMbPortConfig.xConnectQueue != NULL, FALSE, "Wrong slave IP address to add."); - if (pcIpStr && (usIndex != 0xFF)) { - xRes = xMBTCPPortMasterCheckHost(pcIpStr, NULL); - } - if (xRes || !pcIpStr) { - xSlaveAddrInfo.pcIPAddr = pcIpStr; - xSlaveAddrInfo.usIndex = usIndex; - xSlaveAddrInfo.ucSlaveAddr = ucSlaveAddress; - BaseType_t xStatus = xQueueSend(xMbPortConfig.xConnectQueue, (void *)&xSlaveAddrInfo, 100); - MB_PORT_CHECK((xStatus == pdTRUE), FALSE, "FAIL to add slave IP address: [%s].", pcIpStr); - } - return xRes; -} - -// Unblocking connect function -static err_t xMBTCPPortMasterConnect(MbSlaveInfo_t *pxInfo) -{ - if (!pxInfo) { - return ERR_CONN; - } - - err_t xErr = ERR_OK; - CHAR cStr[128]; - CHAR *pcStr = NULL; - ip_addr_t xTargetAddr; - struct addrinfo xHint; - struct addrinfo *pxAddrList; - struct addrinfo *pxCurAddr; - - memset(&xHint, 0, sizeof(xHint)); - // Do name resolution for both protocols - // xHint.ai_family = AF_UNSPEC; Todo: Find a reason why AF_UNSPEC does not work - xHint.ai_flags = AI_ADDRCONFIG; // get IPV6 address if supported, otherwise IPV4 - xHint.ai_family = (xMbPortConfig.eMbIpVer == MB_PORT_IPV4) ? AF_INET : AF_INET6; - xHint.ai_socktype = (pxInfo->xMbProto == MB_PROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM; - xHint.ai_protocol = (pxInfo->xMbProto == MB_PROTO_UDP) ? IPPROTO_UDP : IPPROTO_TCP; - memset(&xTargetAddr, 0, sizeof(xTargetAddr)); - - if (asprintf(&pcStr, "%u", xMbPortConfig.usPort) == -1) { - abort(); - } - - // convert domain name to IP address - int xRet = getaddrinfo(pxInfo->pcIpAddr, pcStr, &xHint, &pxAddrList); - free(pcStr); - if (xRet != 0) { - ESP_LOGE(TAG, "Cannot resolve host: %s", pxInfo->pcIpAddr); - return ERR_CONN; - } - - for (pxCurAddr = pxAddrList; pxCurAddr != NULL; pxCurAddr = pxCurAddr->ai_next) { - if (pxCurAddr->ai_family == AF_INET) { - struct in_addr addr4 = ((struct sockaddr_in *) (pxCurAddr->ai_addr))->sin_addr; - inet_addr_to_ip4addr(ip_2_ip4(&xTargetAddr), &addr4); - pcStr = ip4addr_ntoa_r(ip_2_ip4(&xTargetAddr), cStr, sizeof(cStr)); - } -#if CONFIG_LWIP_IPV6 - else if (pxCurAddr->ai_family == AF_INET6) { - struct in6_addr addr6 = ((struct sockaddr_in6 *) (pxCurAddr->ai_addr))->sin6_addr; - inet6_addr_to_ip6addr(ip_2_ip6(&xTargetAddr), &addr6); - pcStr = ip6addr_ntoa_r(ip_2_ip6(&xTargetAddr), cStr, sizeof(cStr)); - // Set scope id to fix routing issues with local address - ((struct sockaddr_in6 *)(pxCurAddr->ai_addr))->sin6_scope_id = - esp_netif_get_netif_impl_index(xMbPortConfig.pvNetIface); - } -#endif - if (pxInfo->xSockId <= 0) { - pxInfo->xSockId = socket(pxCurAddr->ai_family, pxCurAddr->ai_socktype, pxCurAddr->ai_protocol); - if (pxInfo->xSockId < 0) { - ESP_LOGE(TAG, "Unable to create socket: #%d, errno %u", (int)pxInfo->xSockId, (unsigned)errno); - xErr = ERR_IF; - continue; - } - } else { - ESP_LOGV(TAG, "Socket (#%d)(%s) created.", (int)pxInfo->xSockId, cStr); - } - - // Set non blocking attribute for socket - xMBTCPPortMasterSetNonBlocking(pxInfo); - - // Can return EINPROGRESS as an error which means - // that connection is in progress and should be checked later - xErr = connect(pxInfo->xSockId, (struct sockaddr*)pxCurAddr->ai_addr, pxCurAddr->ai_addrlen); - if ((xErr < 0) && (errno == EINPROGRESS || errno == EALREADY)) { - // The unblocking connect is pending (check status later) or already connected - ESP_LOGV(TAG, "Socket(#%d)(%s) connection is pending, errno %u (%s).", - (int)pxInfo->xSockId, cStr, (unsigned)errno, strerror(errno)); - - // Set keep alive flag in socket options - vMBTCPPortSetKeepAlive(pxInfo); - xErr = xMBTCPPortMasterCheckAlive(pxInfo, MB_TCP_CONNECTION_TIMEOUT_MS); - continue; - } else if ((xErr < 0) && (errno == EISCONN)) { - // Socket already connected - xErr = ERR_OK; - continue; - } else if (xErr != ERR_OK) { - // Other error occurred during connection - ESP_LOGV(TAG, MB_SLAVE_FMT(" unable to connect, error=0x%x, errno %u (%s)"), - (int)pxInfo->xIndex, (int)pxInfo->xSockId, cStr, (int)xErr, (unsigned)errno, strerror(errno)); - xMBTCPPortMasterCloseConnection(pxInfo); - xErr = ERR_CONN; - } else { - ESP_LOGI(TAG, MB_SLAVE_FMT(", successfully connected."), - (int)pxInfo->xIndex, (int)pxInfo->xSockId, cStr); - continue; - } - } - freeaddrinfo(pxAddrList); - return xErr; -} - -// Find the first slave info whose descriptor is set in xFdSet -static MbSlaveInfo_t *xMBTCPPortMasterGetSlaveReady(fd_set *pxFdSet) -{ - MbSlaveInfo_t *pxInfo = NULL; - - // Slave connection loop - for (int xIndex = 0; (xIndex < MB_TCP_PORT_MAX_CONN); xIndex++) { - pxInfo = xMbPortConfig.pxMbSlaveInfo[xIndex]; - if (pxInfo) { - // Is this response for current processing slave - if (FD_ISSET(pxInfo->xSockId, pxFdSet)) { - FD_CLR(pxInfo->xSockId, pxFdSet); - return pxInfo; - } - } - } - return (MbSlaveInfo_t *)NULL; -} - -static int xMBTCPPortMasterCheckConnState(fd_set *pxFdSet) -{ - fd_set xConnSetCheck = *pxFdSet; - MbSlaveInfo_t *pxInfo = NULL; - int64_t xTime = 0; - int xErr = 0; - int xCount = 0; - do { - xTime = xMBTCPGetTimeStamp(); - pxInfo = xMBTCPPortMasterGetSlaveReady(&xConnSetCheck); - if (pxInfo) { - xErr = xMBTCPPortMasterCheckAlive(pxInfo, 0); - if ((xErr < 0) && (((xTime - pxInfo->xRecvTimeStamp) > MB_TCP_RECONNECT_TIMEOUT) || - ((xTime - pxInfo->xSendTimeStamp) > MB_TCP_RECONNECT_TIMEOUT))) { - ESP_LOGI(TAG, MB_SLAVE_FMT(", slave is down, off_time[r][w](us) = [%" PRIu64 "][%" PRIu64 "]."), - (int)pxInfo->xIndex, - (int)pxInfo->xSockId, - pxInfo->pcIpAddr, - (int64_t)(xTime - pxInfo->xRecvTimeStamp), - (int64_t)(xTime - pxInfo->xSendTimeStamp)); - xCount++; - } - } - } while (pxInfo && (xCount < MB_TCP_PORT_MAX_CONN)); - return xCount; -} - -static void xMBTCPPortMasterFsmSetError(eMBMasterErrorEventType xErrType, eMBMasterEventEnum xPostEvent) -{ - vMBMasterPortTimersDisable(); - vMBMasterSetErrorType(xErrType); - xMBMasterPortEventPost(xPostEvent); -} - -static void vMBTCPPortMasterTask(void *pvParameters) -{ - MbSlaveInfo_t *pxInfo; - MbSlaveInfo_t *pxCurrInfo; - - fd_set xConnSet; - fd_set xReadSet; - int xMaxSd = 0; - err_t xErr = ERR_ABRT; - USHORT usSlaveConnCnt = 0; - int64_t xTime = 0; - - // Register each slave in the connection info structure - while (1) { - MbSlaveAddrInfo_t xSlaveAddrInfo = { 0 }; - BaseType_t xStatus = xQueueReceive(xMbPortConfig.xConnectQueue, (void*)&xSlaveAddrInfo, pdMS_TO_TICKS(MB_EVENT_WAIT_TOUT_MS)); - TCP_PORT_CHECK_SHDN(xShutdownSema, xMBTCPPortMasterShutdown); - if (xStatus != pdTRUE) { - ESP_LOGE(TAG, "Fail to register slave IP."); - } else { - if (xSlaveAddrInfo.pcIPAddr == NULL && xMbPortConfig.usMbSlaveInfoCount && xSlaveAddrInfo.usIndex == 0xFF) { - // Init start timeout that allows to initialize the main FSM - xMBMasterPortEventPost(EV_MASTER_READY); - break; - } - if (xMbPortConfig.usMbSlaveInfoCount > MB_TCP_PORT_MAX_CONN) { - ESP_LOGE(TAG, "Exceeds maximum connections limit=%u.", (unsigned)MB_TCP_PORT_MAX_CONN); - break; - } - pxInfo = calloc(1, sizeof(MbSlaveInfo_t)); - if (!pxInfo) { - ESP_LOGE(TAG, "Slave(#%u), info structure allocation fail.", - (unsigned)xMbPortConfig.usMbSlaveInfoCount); - free(pxInfo); - break; - } - pxInfo->pucRcvBuf = calloc(MB_TCP_BUF_SIZE, sizeof(UCHAR)); - if (!pxInfo->pucRcvBuf) { - ESP_LOGE(TAG, "Slave(#%u), receive buffer allocation fail.", - (unsigned)xMbPortConfig.usMbSlaveInfoCount); - free(pxInfo->pucRcvBuf); - break; - } - pxInfo->usRcvPos = 0; - pxInfo->pcIpAddr = xSlaveAddrInfo.pcIPAddr; - pxInfo->xSockId = -1; - pxInfo->xError = -1; - pxInfo->xRecvTimeStamp = xMBTCPGetTimeStamp(); - pxInfo->xSendTimeStamp = xMBTCPGetTimeStamp(); - pxInfo->xMbProto = MB_PROTO_TCP; - pxInfo->ucSlaveAddr = xSlaveAddrInfo.ucSlaveAddr; - pxInfo->xIndex = xSlaveAddrInfo.usIndex; - pxInfo->usTidCnt = (USHORT)(xMbPortConfig.usMbSlaveInfoCount << 8U); - // Register slave - xMbPortConfig.pxMbSlaveInfo[xMbPortConfig.usMbSlaveInfoCount++] = pxInfo; - ESP_LOGI(TAG, "Add slave IP: %s", xSlaveAddrInfo.pcIPAddr); - } - } - - // Main connection cycle - while (1) - { - ESP_LOGI(TAG, "Connecting to slaves..."); - xTime = xMBTCPGetTimeStamp(); - usSlaveConnCnt = 0; - CHAR ucDot = '.'; - while(usSlaveConnCnt < xMbPortConfig.usMbSlaveInfoCount) { - usSlaveConnCnt = 0; - FD_ZERO(&xConnSet); - ucDot ^= 0x03; - // Slave connection loop - for (UCHAR ucCnt = 0; (ucCnt < MB_TCP_PORT_MAX_CONN); ucCnt++) { - pxInfo = xMbPortConfig.pxMbSlaveInfo[ucCnt]; - // if slave descriptor is NULL then it is end of list or connection closed. - if (!pxInfo) { - ESP_LOGV(TAG, "Index: % is not initialized, skip.", ucCnt); - if (xMbPortConfig.usMbSlaveInfoCount) { - continue; - } - break; - } - putchar(ucDot); - // if we don't yield we run the risk of hogging CPU - vTaskDelay(pdMS_TO_TICKS(MB_TCP_CONNECTION_TIMEOUT_MS)); - xErr = xMBTCPPortMasterConnect(pxInfo); - switch(xErr) - { - case ERR_CONN: - case ERR_INPROGRESS: - // In case of connection errors remove the socket from set - if (FD_ISSET(pxInfo->xSockId, &xConnSet)) { - FD_CLR(pxInfo->xSockId, &xConnSet); - ESP_LOGE(TAG, MB_SLAVE_FMT(" connect failed, error = 0x%x."), - (int)pxInfo->xIndex, (int)pxInfo->xSockId, - (char*)pxInfo->pcIpAddr, (int)xErr); - if (usSlaveConnCnt) { - usSlaveConnCnt--; - } - } - break; - case ERR_OK: - // if connection is successful, add the descriptor into set - if (!FD_ISSET(pxInfo->xSockId, &xConnSet)) { - FD_SET(pxInfo->xSockId, &xConnSet); - usSlaveConnCnt++; - xMaxSd = (pxInfo->xSockId > xMaxSd) ? pxInfo->xSockId : xMaxSd; - ESP_LOGD(TAG, MB_SLAVE_FMT(", connected %u slave(s), error = 0x%x."), - (int)pxInfo->xIndex, (int)pxInfo->xSockId, - pxInfo->pcIpAddr, - (unsigned)usSlaveConnCnt, (int)xErr); - // Update time stamp for connected slaves - pxInfo->xRecvTimeStamp = xMBTCPGetTimeStamp(); - pxInfo->xSendTimeStamp = xMBTCPGetTimeStamp(); - } - break; - default: - ESP_LOGE(TAG, MB_SLAVE_FMT(", unexpected error = 0x%x."), - (int)pxInfo->xIndex, - (int)pxInfo->xSockId, - pxInfo->pcIpAddr, (int)xErr); - break; - } - if (pxInfo) { - pxInfo->xError = xErr; - } - TCP_PORT_CHECK_SHDN(xShutdownSema, xMBTCPPortMasterShutdown); - } - } - ESP_LOGI(TAG, "Connected %u slaves, start polling...", (unsigned)usSlaveConnCnt); - - vMBTCPPortMasterStartPoll(); // Send event to start stack - - // Slave receive data loop - while(usSlaveConnCnt) { - xReadSet = xConnSet; - // Check transmission event to clear appropriate bit. - xMBMasterPortFsmWaitConfirmation(EV_MASTER_FRAME_TRANSMIT, pdMS_TO_TICKS(MB_EVENT_WAIT_TOUT_MS)); - TCP_PORT_CHECK_SHDN(xShutdownSema, xMBTCPPortMasterShutdown); - // Synchronize state machine with send packet event - if (xMBMasterPortFsmWaitConfirmation(EV_MASTER_FRAME_SENT, pdMS_TO_TICKS(MB_EVENT_WAIT_TOUT_MS))) { - ESP_LOGD(TAG, "FSM Synchronized with sent event."); - } - // Get slave info for the current slave. - pxCurrInfo = vMBTCPPortMasterGetCurrInfo(); - if (!pxCurrInfo) { - ESP_LOGE(TAG, "Incorrect connection options for slave index: %d.", - (int)xMbPortConfig.ucCurSlaveIndex); - vMBTCPPortMasterStopPoll(); - TCP_PORT_CHECK_SHDN(xShutdownSema, xMBTCPPortMasterShutdown); - break; // incorrect slave descriptor, reconnect. - } - xTime = xMBTCPPortMasterGetRespTimeLeft(pxCurrInfo); - ESP_LOGD(TAG, "Set select timeout, left time: %" PRIu64 " ms.", - xMBTCPPortMasterGetRespTimeLeft(pxCurrInfo)); - // Wait respond from current slave during respond timeout - int xRes = vMBTCPPortMasterRxCheck(pxCurrInfo->xSockId, &xReadSet, xTime); - if (xRes == ERR_TIMEOUT) { - // No respond from current slave, process timeout. - // Need to drop response later if it is received after timeout. - ESP_LOGD(TAG, "Select timeout, left time: %" PRIu64 " ms.", - xMBTCPPortMasterGetRespTimeLeft(pxCurrInfo)); - xTime = xMBTCPPortMasterGetRespTimeLeft(pxCurrInfo); - // Wait completion of last transaction - xMBMasterPortFsmWaitConfirmation(MB_EVENT_REQ_DONE_MASK, pdMS_TO_TICKS(xTime + 1)); - TCP_PORT_CHECK_SHDN(xShutdownSema, xMBTCPPortMasterShutdown); - continue; - } else if (xRes < 0) { - // Select error (slave connection or r/w failure). - ESP_LOGD(TAG, MB_SLAVE_FMT(", socket select error. Slave disconnected?"), - (int)pxCurrInfo->xIndex, (int)pxCurrInfo->xSockId, pxCurrInfo->pcIpAddr); - xTime = xMBTCPPortMasterGetRespTimeLeft(pxCurrInfo); - // Wait completion of last transaction - xMBMasterPortFsmWaitConfirmation(MB_EVENT_REQ_DONE_MASK, pdMS_TO_TICKS(xTime)); - // Stop polling process - vMBTCPPortMasterStopPoll(); - TCP_PORT_CHECK_SHDN(xShutdownSema, xMBTCPPortMasterShutdown); - // Check disconnected slaves, do not need a result just to print information. - xMBTCPPortMasterCheckConnState(&xConnSet); - break; - } else { - // Check to make sure that active slave data is ready - if (FD_ISSET(pxCurrInfo->xSockId, &xReadSet)) { - int xRet = ERR_BUF; - for (int retry = 0; (xRet == ERR_BUF) && (retry < MB_TCP_READ_BUF_RETRY_CNT); retry++) { - xRet = vMBTCPPortMasterReadPacket(pxCurrInfo); - // The error ERR_BUF means received response to previous request - // (due to timeout) with the same socket ID and incorrect TID, - // then ignore it and try to get next response buffer. - } - if (xRet > 0) { - // Response received correctly, send an event to stack - xMBTCPPortMasterFsmSetError(EV_ERROR_INIT, EV_MASTER_FRAME_RECEIVED); - ESP_LOGD(TAG, MB_SLAVE_FMT(", frame received."), - (int)pxCurrInfo->xIndex, (int)pxCurrInfo->xSockId, pxCurrInfo->pcIpAddr); - } else if ((xRet == ERR_TIMEOUT) || (xMBTCPPortMasterGetRespTimeLeft(pxCurrInfo) == 0)) { - // Timeout occurred when receiving frame, process respond timeout - xMBTCPPortMasterFsmSetError(EV_ERROR_RESPOND_TIMEOUT, EV_MASTER_ERROR_PROCESS); - ESP_LOGD(TAG, MB_SLAVE_FMT(", frame read timeout."), - (int)pxCurrInfo->xIndex, (int)pxCurrInfo->xSockId, pxCurrInfo->pcIpAddr); - } else if (xRet == ERR_BUF) { - // After retries a response with incorrect TID received, process failure. - xMBTCPPortMasterFsmSetError(EV_ERROR_RECEIVE_DATA, EV_MASTER_ERROR_PROCESS); - ESP_LOGD(TAG, MB_SLAVE_FMT(", frame error."), - (int)pxCurrInfo->xIndex, (int)pxCurrInfo->xSockId, pxCurrInfo->pcIpAddr); - } else { - ESP_LOGE(TAG, MB_SLAVE_FMT(", critical error=%d."), - (int)pxCurrInfo->xIndex, (int)pxCurrInfo->xSockId, pxCurrInfo->pcIpAddr, (int)xRet); - // Stop polling process - vMBTCPPortMasterStopPoll(); - TCP_PORT_CHECK_SHDN(xShutdownSema, xMBTCPPortMasterShutdown); - // Check disconnected slaves, do not need a result just to print information. - xMBTCPPortMasterCheckConnState(&xConnSet); - break; - } - xTime = xMBTCPPortMasterGetRespTimeLeft(pxCurrInfo); - ESP_LOGD(TAG, "Slave #%d, data processing left time %" PRIu64 " [ms].", (int)pxCurrInfo->xIndex, xTime); - // Wait completion of Modbus frame processing before start of new transaction. - if (xMBMasterPortFsmWaitConfirmation(MB_EVENT_REQ_DONE_MASK, pdMS_TO_TICKS(xTime))) { - ESP_LOGD(TAG, MB_SLAVE_FMT(", data processing completed."), - (int)pxCurrInfo->xIndex, (int)pxCurrInfo->xSockId, pxCurrInfo->pcIpAddr); - } - xTime = xMBTCPGetTimeStamp() - pxCurrInfo->xSendTimeStamp; - ESP_LOGD(TAG, MB_SLAVE_FMT(", processing time[us] = %" PRIu64 "."), - (int)pxCurrInfo->xIndex, (int)pxCurrInfo->xSockId, pxCurrInfo->pcIpAddr, xTime); - } - } - TCP_PORT_CHECK_SHDN(xShutdownSema, xMBTCPPortMasterShutdown); - } // while(usMbSlaveInfoCount) - } // while (1) - vTaskDelete(NULL); -} - -extern void vMBMasterPortEventClose(void); -extern void vMBMasterPortTimerClose(void); - -void vMBMasterTCPPortEnable(void) -{ - -} - -void vMBMasterTCPPortDisable(void) -{ - // Try to exit the task gracefully, so select could release its internal callbacks - // that were allocated on the stack of the task we're going to delete - xShutdownSema = xSemaphoreCreateBinary(); - // if no semaphore (alloc issues) or couldn't acquire it, just delete the task - if (xShutdownSema == NULL || xSemaphoreTake(xShutdownSema, pdMS_TO_TICKS(MB_SHDN_WAIT_TOUT_MS)) != pdTRUE) { - ESP_LOGW(TAG, "Modbus port task couldn't exit gracefully within timeout -> abruptly deleting the task."); - vTaskDelete(xMbPortConfig.xMbTcpTaskHandle); - } - if (xShutdownSema) { - vSemaphoreDelete(xShutdownSema); - xShutdownSema = NULL; - } -} - -void vMBMasterTCPPortClose(void) -{ - vQueueDelete(xMbPortConfig.xConnectQueue); - vMBMasterPortTimerClose(); - // Release resources for the event queue. - vMBMasterPortEventClose(); -} - -BOOL xMBMasterTCPPortGetRequest(UCHAR **ppucMBTCPFrame, USHORT *usTCPLength) -{ - MbSlaveInfo_t *pxInfo = vMBTCPPortMasterGetCurrInfo(); - *ppucMBTCPFrame = pxInfo->pucRcvBuf; - *usTCPLength = pxInfo->usRcvPos; - - // Reset the buffer. - pxInfo->usRcvPos = 0; - // Save slave receive timestamp - if (pxInfo->xRcvErr == ERR_OK && *usTCPLength > 0) { - pxInfo->xRecvTimeStamp = xMBTCPGetTimeStamp(); - return TRUE; - } - return FALSE; -} - -int xMBMasterTCPPortWritePoll(MbSlaveInfo_t *pxInfo, const UCHAR *pucMBTCPFrame, USHORT usTCPLength, ULONG xTimeout) -{ - // Check if the socket is alive (writable and SO_ERROR == 0) - int xRes = (int)xMBTCPPortMasterCheckAlive(pxInfo, xTimeout); - if ((xRes < 0) && (xRes != ERR_INPROGRESS)) { - ESP_LOGE(TAG, MB_SLAVE_FMT(", is not writable, error: %d, errno %u"), - (int)pxInfo->xIndex, (int)pxInfo->xSockId, pxInfo->pcIpAddr, (int)xRes, (unsigned)errno); - return xRes; - } - xRes = send(pxInfo->xSockId, pucMBTCPFrame, usTCPLength, TCP_NODELAY); - if (xRes < 0) { - ESP_LOGE(TAG, MB_SLAVE_FMT(", send data error: %d, errno %u"), - (int)pxInfo->xIndex, (int)pxInfo->xSockId, pxInfo->pcIpAddr, (int)xRes, (unsigned)errno); - } - return xRes; -} - -BOOL xMBMasterTCPPortSendResponse(UCHAR *pucMBTCPFrame, USHORT usTCPLength) -{ - BOOL bFrameSent = FALSE; - USHORT ucCurSlaveIndex = ucMBMasterGetDestAddress(); - MbSlaveInfo_t *pxInfo = vMBTCPPortMasterFindSlaveInfo(ucCurSlaveIndex); - - // If the slave is correct and active then send data - // otherwise treat slave as died and skip - if (pxInfo != NULL) { - if (pxInfo->xSockId < 0) { - ESP_LOGD(TAG, MB_SLAVE_FMT(", send to died slave, error = %u"), - (int)pxInfo->xIndex, (int)pxInfo->xSockId, pxInfo->pcIpAddr, (unsigned)pxInfo->xError); - } else { - // Apply TID field to the frame before send - pucMBTCPFrame[MB_TCP_TID] = (UCHAR)(pxInfo->usTidCnt >> 8U); - pucMBTCPFrame[MB_TCP_TID + 1] = (UCHAR)(pxInfo->usTidCnt & 0xFF); - - int xRes = xMBMasterTCPPortWritePoll(pxInfo, pucMBTCPFrame, usTCPLength, MB_TCP_SEND_TIMEOUT_MS); - if (xRes < 0) { - ESP_LOGE(TAG, MB_SLAVE_FMT(", send data failure, err(errno) = %d(%u)."), - (int)pxInfo->xIndex, (int)pxInfo->xSockId, pxInfo->pcIpAddr, (int)xRes, (unsigned)errno); - bFrameSent = FALSE; - pxInfo->xError = xRes; - } else { - bFrameSent = TRUE; - ESP_LOGD(TAG, MB_SLAVE_FMT(", send data successful: TID=0x%02x, %d (bytes), errno %u"), - (int)pxInfo->xIndex, (int)pxInfo->xSockId, pxInfo->pcIpAddr, pxInfo->usTidCnt, (int)xRes, (unsigned)errno); - pxInfo->xError = 0; - pxInfo->usRcvPos = 0; - if (pxInfo->usTidCnt < (USHRT_MAX - 1)) { - pxInfo->usTidCnt++; - } else { - pxInfo->usTidCnt = (USHORT)(pxInfo->xIndex << 8U); - } - } - pxInfo->xSendTimeStamp = xMBTCPGetTimeStamp(); - } - } else { - ESP_LOGD(TAG, "Send data to died slave, address = %u", (unsigned)ucCurSlaveIndex); - } - vMBMasterPortTimersRespondTimeoutEnable(); - xMBMasterPortEventPost(EV_MASTER_FRAME_SENT); - return bFrameSent; -} - -// Timer handler to check timeout of socket response -BOOL MB_PORT_ISR_ATTR -xMBMasterTCPTimerExpired(void) -{ - BOOL xNeedPoll = FALSE; - eMBMasterTimerMode eTimerMode = xMBMasterGetCurTimerMode(); - - vMBMasterPortTimersDisable(); - - // If timer mode is respond timeout, the master event then turns EV_MASTER_EXECUTE status. - if (eTimerMode == MB_TMODE_RESPOND_TIMEOUT) { - vMBMasterSetErrorType(EV_ERROR_RESPOND_TIMEOUT); - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_ERROR_PROCESS); - } - - return xNeedPoll; -} - -#endif // #if MB_MASTER_TCP_ENABLED diff --git a/managed_components/espressif__esp-modbus/freemodbus/tcp_master/port/port_tcp_master.h b/managed_components/espressif__esp-modbus/freemodbus/tcp_master/port/port_tcp_master.h deleted file mode 100755 index 9867bee..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/tcp_master/port/port_tcp_master.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 TCP Port - * Copyright (C) 2006 Christian Walter - * Parts of crt0.S Copyright (c) 1995, 1996, 1998 Cygnus Support - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: port.h,v 1.2 2006/09/04 14:39:20 wolti Exp $ - */ - -#ifndef _PORT_TCP_SLAVE_H -#define _PORT_TCP_SLAVE_H - -/* ----------------------- Platform includes --------------------------------*/ -#include "esp_log.h" - -#include "lwip/sys.h" -#include "freertos/event_groups.h" -#include "port.h" - -/* ----------------------- Defines ------------------------------------------*/ - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -/* ----------------------- Type definitions ---------------------------------*/ - -typedef struct { - int xIndex; /*!< Slave information index */ - int xSockId; /*!< Socket ID of slave */ - int xError; /*!< Socket error */ - int xRcvErr; /*!< Socket receive error */ - const char* pcIpAddr; /*!< TCP/UDP IP address */ - UCHAR ucSlaveAddr; /*!< Slave short address */ - UCHAR* pucRcvBuf; /*!< Receive buffer pointer */ - USHORT usRcvPos; /*!< Receive buffer position */ - int pcPort; /*!< TCP/UDP port number */ - eMBPortProto xMbProto; /*!< Protocol type */ - int64_t xSendTimeStamp; /*!< Send request time stamp */ - int64_t xRecvTimeStamp; /*!< Receive response time stamp */ - uint16_t usTidCnt; /*!< Transaction identifier (TID) for slave */ -} MbSlaveInfo_t; - -typedef struct { - TaskHandle_t xMbTcpTaskHandle; /*!< Master TCP/UDP handling task handle */ - QueueHandle_t xConnectQueue; /*!< Master connection queue */ - USHORT usPort; /*!< Master TCP/UDP port number */ - USHORT usMbSlaveInfoCount; /*!< Master count of connected slaves */ - USHORT ucCurSlaveIndex; /*!< Master current processing slave index */ - eMBPortIpVer eMbIpVer; /*!< Master IP version */ - eMBPortProto eMbProto; /*!< Master protocol type */ - void* pvNetIface; /*!< Master netif interface pointer */ - MbSlaveInfo_t** pxMbSlaveInfo; /*!< Master information structure for each connected slave */ - MbSlaveInfo_t* pxMbSlaveCurrInfo; /*!< Master current slave information */ -} MbPortConfig_t; - -typedef struct { - USHORT usIndex; /*!< index of the address info */ - const char* pcIPAddr; /*!< represents the IP address of the slave */ - UCHAR ucSlaveAddr; /*!< slave unit ID (UID) field for MBAP frame */ -} MbSlaveAddrInfo_t; - -/* ----------------------- Function prototypes ------------------------------*/ - -// The functions below are used by Modbus controller interface to configure Modbus port. -/** - * Registers slave IP address - * - * @param usIndex index of element in the configuration - * @param pcIpStr IP address to register - * @param ucSlaveAddress slave element index - * - * @return TRUE if address registered successfully, else FALSE - */ -BOOL xMBTCPPortMasterAddSlaveIp(const USHORT usIndex, const CHAR* pcIpStr, UCHAR ucSlaveAddress); - -/** - * Keeps FSM event handle and mask then wait for Master stack to start - * - * @param xEventHandle Master event handle - * @param xEvent event mask to start Modbus stack FSM - * @param usTimeout - timeout in ticks to wait for stack to start - * - * @return TRUE if stack started, else FALSE - */ -BOOL xMBTCPPortMasterWaitEvent(EventGroupHandle_t xEventHandle, EventBits_t xEvent, USHORT usTimeout); - -/** - * Set network options for Master port - * - * @param pvNetIf netif interface pointer - * @param xIpVersion IP version option for the Master port - * @param xProto Protocol version option for the Master port - * - * @return None - */ -void vMBTCPPortMasterSetNetOpt(void* pvNetIf, eMBPortIpVer xIpVersion, eMBPortProto xProto); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c b/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c deleted file mode 100755 index 40f7c02..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -// mbc_tcp_slave.c -// Implementation of the Modbus controller TCP slave - -#include // for calculation of time stamp in milliseconds -#include "esp_log.h" // for log_write -#include "mb.h" // for mb types definition -#include "mbutils.h" // for mbutils functions definition for stack callback -#include "port.h" // for port callback functions and defines -#include "sdkconfig.h" // for KConfig values -#include "esp_modbus_common.h" // for common defines -#include "esp_modbus_slave.h" // for public slave interface types -#include "mbc_slave.h" // for private slave interface types -#include "mbc_tcp_slave.h" // for tcp slave mb controller defines -#include "port_tcp_slave.h" // for tcp slave port defines - -#if MB_TCP_ENABLED - -// Shared pointer to interface structure -static mb_slave_interface_t* mbs_interface_ptr = NULL; -static const char *TAG = "MB_CONTROLLER_SLAVE"; - -// Modbus task function -static void modbus_tcp_slave_task(void *pvParameters) -{ - MB_SLAVE_ASSERT(mbs_interface_ptr != NULL); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - - // Main Modbus stack processing cycle - for (;;) { - BaseType_t status = xEventGroupWaitBits(mbs_opts->mbs_event_group, - (BaseType_t)(MB_EVENT_STACK_STARTED), - pdFALSE, // do not clear bits - pdFALSE, - portMAX_DELAY); - // Check if stack started then poll for data - if (status & MB_EVENT_STACK_STARTED) { - (void)eMBPoll(); // allow stack to process data - } - } -} - -// Setup Modbus controller parameters -static esp_err_t mbc_tcp_slave_setup(void* comm_info) -{ - MB_SLAVE_ASSERT(mbs_interface_ptr != NULL); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - MB_SLAVE_CHECK((comm_info != NULL), ESP_ERR_INVALID_ARG, - "mb wrong communication settings."); - mb_communication_info_t* comm_settings = (mb_communication_info_t*)comm_info; - MB_SLAVE_CHECK((comm_settings->ip_mode == MB_MODE_TCP), - ESP_ERR_INVALID_ARG, "mb incorrect mode = (%u).", (unsigned)comm_settings->ip_mode); - MB_SLAVE_CHECK(((comm_settings->ip_addr_type == MB_IPV4) || (comm_settings->ip_addr_type == MB_IPV6)), - ESP_ERR_INVALID_ARG, "mb incorrect addr type = (%u).", (unsigned)comm_settings->ip_addr_type); - MB_SLAVE_CHECK((comm_settings->ip_netif_ptr != NULL), - ESP_ERR_INVALID_ARG, "mb incorrect iface address."); - // Set communication options of the controller - mbs_opts->mbs_comm = *comm_settings; - return ESP_OK; -} - -// Start Modbus controller start function -static esp_err_t mbc_tcp_slave_start(void) -{ - MB_SLAVE_ASSERT(mbs_interface_ptr != NULL); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - eMBErrorCode status = MB_EIO; - - // Initialize Modbus stack using mbcontroller parameters - status = eMBTCPInit((UCHAR)mbs_opts->mbs_comm.slave_uid, (USHORT)mbs_opts->mbs_comm.ip_port); - MB_SLAVE_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb stack initialization failure, eMBInit() returns (0x%x).", (int)status); - - eMBPortProto proto = (mbs_opts->mbs_comm.ip_mode == MB_MODE_TCP) ? MB_PROTO_TCP : MB_PROTO_UDP; - eMBPortIpVer ip_ver = (mbs_opts->mbs_comm.ip_addr_type == MB_IPV4) ? MB_PORT_IPV4 : MB_PORT_IPV6; - vMBTCPPortSlaveSetNetOpt(mbs_opts->mbs_comm.ip_netif_ptr, ip_ver, proto, (char*)mbs_opts->mbs_comm.ip_addr); - - status = eMBEnable(); - MB_SLAVE_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, - "mb TCP stack start failure, eMBEnable() returned (0x%x).", (int)status); - // Set the mbcontroller start flag - EventBits_t flag = xEventGroupSetBits(mbs_opts->mbs_event_group, - (EventBits_t)MB_EVENT_STACK_STARTED); - MB_SLAVE_CHECK((flag & MB_EVENT_STACK_STARTED), - ESP_ERR_INVALID_STATE, "mb stack start event set error."); - return ESP_OK; -} - -// Modbus controller destroy function -static esp_err_t mbc_tcp_slave_destroy(void) -{ - MB_SLAVE_ASSERT(mbs_interface_ptr != NULL); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - eMBErrorCode mb_error = MB_ENOERR; - // Stop polling by clearing correspondent bit in the event group - EventBits_t flag = xEventGroupClearBits(mbs_opts->mbs_event_group, - (EventBits_t)MB_EVENT_STACK_STARTED); - MB_SLAVE_CHECK((flag & MB_EVENT_STACK_STARTED), - ESP_ERR_INVALID_STATE, "mb stack stop event failure."); - // Disable and then destroy the Modbus stack - mb_error = eMBDisable(); - MB_SLAVE_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE, "mb stack disable failure."); - (void)vTaskDelete(mbs_opts->mbs_task_handle); - (void)vQueueDelete(mbs_opts->mbs_notification_queue_handle); - (void)vEventGroupDelete(mbs_opts->mbs_event_group); - (void)vMBTCPPortClose(); - mbs_interface_ptr = NULL; - vMBPortSetMode((UCHAR)MB_PORT_INACTIVE); - return ESP_OK; -} - -// Blocking function to get event on parameter group change for application task -static mb_event_group_t mbc_tcp_slave_check_event(mb_event_group_t group) -{ - MB_SLAVE_ASSERT(mbs_interface_ptr != NULL); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - MB_SLAVE_ASSERT(mbs_opts->mbs_event_group != NULL); - BaseType_t status = xEventGroupWaitBits(mbs_opts->mbs_event_group, (BaseType_t)group, - pdTRUE , pdFALSE, portMAX_DELAY); - return (mb_event_group_t)status; -} - -// Function to get notification about parameter change from application task -static esp_err_t mbc_tcp_slave_get_param_info(mb_param_info_t* reg_info, uint32_t timeout) -{ - MB_SLAVE_ASSERT(mbs_interface_ptr != NULL); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - esp_err_t err = ESP_ERR_TIMEOUT; - MB_SLAVE_CHECK((mbs_opts->mbs_notification_queue_handle != NULL), - ESP_ERR_INVALID_ARG, "mb queue handle is invalid."); - MB_SLAVE_CHECK((reg_info != NULL), ESP_ERR_INVALID_ARG, "mb register information is invalid."); - BaseType_t status = xQueueReceive(mbs_opts->mbs_notification_queue_handle, - reg_info, pdMS_TO_TICKS(timeout)); - if (status == pdTRUE) { - err = ESP_OK; - } - return err; -} - -/* ----------------------- Callback functions for Modbus stack ---------------------------------*/ -// These are executed by modbus stack to read appropriate type of registers. - -// This is required to suppress warning when register start address is zero -#pragma GCC diagnostic ignored "-Wtype-limits" - -// Initialization of Modbus controller -esp_err_t mbc_tcp_slave_create(void** handler) -{ - // Allocate space for options - if (mbs_interface_ptr == NULL) { - mbs_interface_ptr = malloc(sizeof(mb_slave_interface_t)); - } - MB_SLAVE_ASSERT(mbs_interface_ptr != NULL); - mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; - mbs_opts->port_type = MB_PORT_TCP_SLAVE; // set interface port type - - vMBPortSetMode((UCHAR)MB_PORT_TCP_SLAVE); - - // Set default values of communication options - mbs_opts->mbs_comm.ip_port = MB_TCP_DEFAULT_PORT; - - // Initialization of active context of the Modbus controller - BaseType_t status = 0; - - // Parameter change notification queue - mbs_opts->mbs_event_group = xEventGroupCreate(); - MB_SLAVE_CHECK((mbs_opts->mbs_event_group != NULL), - ESP_ERR_NO_MEM, "mb event group error."); - // Parameter change notification queue - mbs_opts->mbs_notification_queue_handle = xQueueCreate( - MB_CONTROLLER_NOTIFY_QUEUE_SIZE, - sizeof(mb_param_info_t)); - MB_SLAVE_CHECK((mbs_opts->mbs_notification_queue_handle != NULL), - ESP_ERR_NO_MEM, "mb notify queue creation error."); - // Create Modbus controller task - status = xTaskCreatePinnedToCore((void*)&modbus_tcp_slave_task, - "mbs_port_tcp_task", - MB_CONTROLLER_STACK_SIZE, - NULL, - MB_CONTROLLER_PRIORITY, - &mbs_opts->mbs_task_handle, - MB_PORT_TASK_AFFINITY); - if (status != pdPASS) { - vTaskDelete(mbs_opts->mbs_task_handle); - MB_SLAVE_CHECK((status == pdPASS), ESP_ERR_NO_MEM, - "mb controller task creation error, xTaskCreate() returns (%u).", (unsigned)status); - } - - // The task is created but handle is incorrect - MB_SLAVE_ASSERT(mbs_opts->mbs_task_handle != NULL); - - // Initialization of interface pointers - mbs_interface_ptr->init = mbc_tcp_slave_create; - mbs_interface_ptr->destroy = mbc_tcp_slave_destroy; - mbs_interface_ptr->setup = mbc_tcp_slave_setup; - mbs_interface_ptr->start = mbc_tcp_slave_start; - mbs_interface_ptr->check_event = mbc_tcp_slave_check_event; - mbs_interface_ptr->get_param_info = mbc_tcp_slave_get_param_info; - mbs_interface_ptr->set_descriptor = NULL; // Use common descriptor setter - - // Initialize stack callback function pointers - mbs_interface_ptr->slave_reg_cb_discrete = NULL; // implemented in common layer - mbs_interface_ptr->slave_reg_cb_input = NULL; - mbs_interface_ptr->slave_reg_cb_holding = NULL; - mbs_interface_ptr->slave_reg_cb_coils = NULL; - - *handler = (void*)mbs_interface_ptr; - - return ESP_OK; -} - -#endif //#if MB_TCP_ENABLED diff --git a/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.h b/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.h deleted file mode 100755 index 56ece0d..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -// mbc_tcp_slave.h Modbus controller TCP slave implementation header file - -#ifndef _MODBUS_TCP_CONTROLLER_SLAVE -#define _MODBUS_TCP_CONTROLLER_SLAVE - -#include // for standard int types definition -#include // for NULL and std defines -#include "esp_modbus_common.h" // for common defines - -/* ----------------------- Defines ------------------------------------------*/ - -#define MB_CONTROLLER_NOTIFY_QUEUE_SIZE (CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE) // Number of messages in parameter notification queue -#define MB_CONTROLLER_NOTIFY_TIMEOUT (pdMS_TO_TICKS(CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT)) // notification timeout - -/** - * @brief Initialize Modbus controller and stack for TCP slave - * - * @param[out] handler handler(pointer) to slave data structure - * @return - * - ESP_OK Success - * - ESP_ERR_NO_MEM Parameter error - */ -esp_err_t mbc_tcp_slave_create(void** handler); - -#endif // _MODBUS_TCP_CONTROLLER_SLAVE diff --git a/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/port/port_tcp_slave.c b/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/port/port_tcp_slave.c deleted file mode 100755 index 7e641b4..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/port/port_tcp_slave.c +++ /dev/null @@ -1,758 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 TCP Port - * Copyright (C) 2006 Christian Walter - * Parts of crt0.S Copyright (c) 1995, 1996, 1998 Cygnus Support - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: port.c,v 1.2 2006/09/04 14:39:20 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include -#include -#include "esp_err.h" -#include "esp_timer.h" -#include "sys/time.h" -#include "esp_netif.h" - -/* ----------------------- lwIP includes ------------------------------------*/ -#include "lwip/err.h" -#include "lwip/sockets.h" -#include "lwip/netdb.h" -#include "net/if.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" -#include "port.h" -#include "mbframe.h" -#include "port_tcp_slave.h" -#include "esp_modbus_common.h" // for common types for network options - -#if MB_TCP_ENABLED - -/* ----------------------- Defines -----------------------------------------*/ -#define MB_TCP_DISCONNECT_TIMEOUT ( CONFIG_FMB_TCP_CONNECTION_TOUT_SEC * 1000000 ) // disconnect timeout in uS -#define MB_TCP_RESP_TIMEOUT_MS ( MB_MASTER_TIMEOUT_MS_RESPOND - 1 ) // slave response time limit -#define MB_TCP_NET_LISTEN_BACKLOG ( SOMAXCONN ) - -/* ----------------------- Prototypes ---------------------------------------*/ -void vMBPortEventClose( void ); - -/* ----------------------- Static variables ---------------------------------*/ -static const char *TAG = "MB_TCP_SLAVE_PORT"; -static int xListenSock = -1; -static SemaphoreHandle_t xShutdownSema = NULL; -static MbSlavePortConfig_t xConfig = { 0 }; - -/* ----------------------- Static functions ---------------------------------*/ -// The helper function to get time stamp in microseconds -static int64_t xMBTCPGetTimeStamp(void) -{ - int64_t xTimeStamp = esp_timer_get_time(); - return xTimeStamp; -} - -static void vxMBTCPPortMStoTimeVal(USHORT usTimeoutMs, struct timeval *pxTimeout) -{ - pxTimeout->tv_sec = usTimeoutMs / 1000; - pxTimeout->tv_usec = (usTimeoutMs - (pxTimeout->tv_sec * 1000)) * 1000; -} - -static QueueHandle_t xMBTCPPortRespQueueCreate(void) -{ - QueueHandle_t xRespQueueHandle = xQueueCreate(2, sizeof(void*)); - MB_PORT_CHECK((xRespQueueHandle != NULL), NULL, "TCP respond queue creation failure."); - return xRespQueueHandle; -} - -static void vMBTCPPortRespQueueDelete(QueueHandle_t xRespQueueHandle) -{ - vQueueDelete(xRespQueueHandle); -} - -static void* vxMBTCPPortRespQueueRecv(QueueHandle_t xRespQueueHandle) -{ - void* pvResp = NULL; - MB_PORT_CHECK(xRespQueueHandle != NULL, NULL, "Response queue is not initialized."); - BaseType_t xStatus = xQueueReceive(xRespQueueHandle, - (void*)&pvResp, - pdMS_TO_TICKS(MB_TCP_RESP_TIMEOUT_MS)); - if (xStatus != pdTRUE) { - ESP_LOGD(TAG, "Could not get respond confirmation."); - } - return pvResp; -} - -static BOOL vxMBTCPPortRespQueueSend(QueueHandle_t xRespQueueHandle, void* pvResp) -{ - MB_PORT_CHECK(xRespQueueHandle != NULL, FALSE, "Response queue is not initialized."); - BaseType_t xStatus = xQueueSend(xConfig.xRespQueueHandle, - (const void*)&pvResp, - pdMS_TO_TICKS(MB_TCP_RESP_TIMEOUT_MS)); - MB_PORT_CHECK((xStatus == pdTRUE), FALSE, "FAIL to send to response queue."); - return TRUE; -} - -static void vMBTCPPortServerTask(void *pvParameters); - -/* ----------------------- Begin implementation -----------------------------*/ -BOOL -xMBTCPPortInit( USHORT usTCPPort ) -{ - BOOL bOkay = FALSE; - - xConfig.pxMbClientInfo = calloc(MB_TCP_PORT_MAX_CONN + 1, sizeof(MbClientInfo_t*)); - if (!xConfig.pxMbClientInfo) { - ESP_LOGE(TAG, "TCP client info allocation failure."); - return FALSE; - } - for(int idx = 0; idx < MB_TCP_PORT_MAX_CONN; xConfig.pxMbClientInfo[idx] = NULL, idx++); - - xConfig.xRespQueueHandle = xMBTCPPortRespQueueCreate(); - if (!xConfig.xRespQueueHandle) { - ESP_LOGE(TAG, "Response queue allocation failure."); - return FALSE; - } - - xConfig.usPort = usTCPPort; - xConfig.eMbProto = MB_PROTO_TCP; - xConfig.usClientCount = 0; - xConfig.pvNetIface = NULL; - xConfig.xIpVer = MB_PORT_IPV4; - xConfig.pcBindAddr = NULL; - - // Create task for packet processing - BaseType_t xErr = xTaskCreatePinnedToCore(vMBTCPPortServerTask, - "tcp_slave_task", - MB_TCP_STACK_SIZE, - NULL, - MB_TCP_TASK_PRIO, - &xConfig.xMbTcpTaskHandle, - MB_PORT_TASK_AFFINITY); - if (xErr != pdTRUE) - { - ESP_LOGE(TAG, "Server task creation failure."); - vTaskDelete(xConfig.xMbTcpTaskHandle); - } else { - ESP_LOGI(TAG, "Protocol stack initialized."); - bOkay = TRUE; - } - return bOkay; -} - -void vMBTCPPortSlaveSetNetOpt(void* pvNetIf, eMBPortIpVer xIpVersion, eMBPortProto xProto, CHAR* pcBindAddrStr) -{ - // Set network options - xConfig.pvNetIface = pvNetIf; - xConfig.eMbProto = xProto; - xConfig.xIpVer = xIpVersion; - xConfig.pcBindAddr = pcBindAddrStr; -} - -static int xMBTCPPortAcceptConnection(int xListenSockId, char** pcIPAddr) -{ - MB_PORT_CHECK(pcIPAddr, -1, "Wrong IP address pointer."); - MB_PORT_CHECK((xListenSockId > 0), -1, "Incorrect listen socket ID."); - - // Address structure large enough for both IPv4 or IPv6 address - struct sockaddr_storage xSrcAddr; - CHAR cAddrStr[128]; - int xSockId = -1; - CHAR* pcStr = NULL; - socklen_t xSize = sizeof(struct sockaddr_storage); - - // Accept new socket connection if not active - xSockId = accept(xListenSockId, (struct sockaddr *)&xSrcAddr, &xSize); - if (xSockId < 0) { - ESP_LOGE(TAG, "Unable to accept connection: errno=%u", (unsigned)errno); - close(xSockId); - } else { - // Get the sender's ip address as string - if (xSrcAddr.ss_family == PF_INET) { - inet_ntoa_r(((struct sockaddr_in *)&xSrcAddr)->sin_addr.s_addr, cAddrStr, sizeof(cAddrStr) - 1); - } -#if CONFIG_LWIP_IPV6 - else if (xSrcAddr.ss_family == PF_INET6) { - inet6_ntoa_r(((struct sockaddr_in6 *)&xSrcAddr)->sin6_addr, cAddrStr, sizeof(cAddrStr) - 1); - } -#endif - else { - // Make sure ss_family is valid - abort(); - } - ESP_LOGI(TAG, "Socket (#%d), accept client connection from address: %s", (int)xSockId, cAddrStr); - pcStr = calloc(1, strlen(cAddrStr) + 1); - if (pcStr && pcIPAddr) { - memcpy(pcStr, cAddrStr, strlen(cAddrStr)); - pcStr[strlen(cAddrStr)] = '\0'; - *pcIPAddr = pcStr; // Set IP address of connected client - } - } - return xSockId; -} - -static BOOL xMBTCPPortCloseConnection(MbClientInfo_t* pxInfo) -{ - MB_PORT_CHECK(pxInfo, FALSE, "Client info is NULL."); - - if (pxInfo->xSockId == -1) { - ESP_LOGE(TAG, "Wrong socket info or disconnected socket: %d.", (int)pxInfo->xSockId); - return FALSE; - } - - // Empty tcp buffer before shutdown - (void)recv(pxInfo->xSockId, &pxInfo->pucTCPBuf[0], MB_PDU_SIZE_MAX, MSG_DONTWAIT); - - if (shutdown(pxInfo->xSockId, SHUT_RDWR) == -1) - { - ESP_LOGE(TAG, "Socket (#%d), shutdown failed: errno %u", (int)pxInfo->xSockId, (unsigned)errno); - } - close(pxInfo->xSockId); - pxInfo->xSockId = -1; - if (xConfig.usClientCount) { - xConfig.usClientCount--; // decrement counter of client connections - } else { - xConfig.pxCurClientInfo = NULL; - } - return TRUE; -} - -static void vMBTCPPortFreeClientInfo(MbClientInfo_t *pxClientInfo) -{ - if (pxClientInfo) { - if (pxClientInfo->pucTCPBuf) { - free((void *)pxClientInfo->pucTCPBuf); - } - if (pxClientInfo->pcIpAddr) { - free((void *)pxClientInfo->pcIpAddr); - } - free((void *)pxClientInfo); - } -} - -static void vMBTCPPortShutdown(void) -{ - xSemaphoreGive(xShutdownSema); - vTaskDelete(NULL); - xConfig.xMbTcpTaskHandle = NULL; - - for (int i = 0; i < MB_TCP_PORT_MAX_CONN; i++) { - MbClientInfo_t *pxClientInfo = xConfig.pxMbClientInfo[i]; - if ((pxClientInfo != NULL) && (pxClientInfo->xSockId > 0)) { - xMBTCPPortCloseConnection(pxClientInfo); - vMBTCPPortFreeClientInfo(pxClientInfo); - xConfig.pxMbClientInfo[i] = NULL; - } - } - free(xConfig.pxMbClientInfo); -} - -static int xMBTCPPortRxPoll(MbClientInfo_t *pxClientInfo, ULONG xTimeoutMs) -{ - int xRet = ERR_CLSD; - struct timeval xTimeVal; - fd_set xReadSet; - int64_t xStartTimeStamp = 0; - - // Receive data from connected client - if (pxClientInfo && pxClientInfo->xSockId > -1) { - // Set receive timeout - vxMBTCPPortMStoTimeVal(xTimeoutMs, &xTimeVal); - xStartTimeStamp = xMBTCPGetTimeStamp(); - while (1) - { - FD_ZERO(&xReadSet); - FD_SET(pxClientInfo->xSockId, &xReadSet); - xRet = select(pxClientInfo->xSockId + 1, &xReadSet, NULL, NULL, &xTimeVal); - if (xRet == -1) - { - // If select an error occurred - xRet = ERR_CLSD; - TCP_PORT_CHECK_SHDN(xShutdownSema, vMBTCPPortShutdown); - break; - } else if (xRet == 0) { - // timeout occurred - if ((xStartTimeStamp + xTimeoutMs * 1000) > xMBTCPGetTimeStamp()) { - ESP_LOGD(TAG, "Socket (#%d) Read timeout.", (int)pxClientInfo->xSockId); - xRet = ERR_TIMEOUT; - TCP_PORT_CHECK_SHDN(xShutdownSema, vMBTCPPortShutdown); - break; - } - } - if (FD_ISSET(pxClientInfo->xSockId, &xReadSet)) { - // If new buffer received then read Modbus packet into buffer - MB_PORT_CHECK((pxClientInfo->usTCPBufPos + pxClientInfo->usTCPFrameBytesLeft < MB_TCP_BUF_SIZE), - ERR_BUF, "Socket (#%d), incorrect request buffer size = %u, ignore.", - (int)pxClientInfo->xSockId, - (unsigned)(pxClientInfo->usTCPBufPos + pxClientInfo->usTCPFrameBytesLeft)); - int xLength = recv(pxClientInfo->xSockId, &pxClientInfo->pucTCPBuf[pxClientInfo->usTCPBufPos], - pxClientInfo->usTCPFrameBytesLeft, MSG_DONTWAIT); - if (xLength < 0) { - // If an error occurred during receiving - ESP_LOGE(TAG, "Receive failed: length=%u, errno=%u", (unsigned)xLength, (unsigned)errno); - xRet = (err_t)xLength; - break; - } else if (xLength == 0) { - // Socket connection closed - ESP_LOGD(TAG, "Socket (#%d)(%s), connection closed.", - (int)pxClientInfo->xSockId, pxClientInfo->pcIpAddr); - xRet = ERR_CLSD; - break; - } else { - // New data received - pxClientInfo->usTCPBufPos += xLength; - pxClientInfo->usTCPFrameBytesLeft -= xLength; - if (pxClientInfo->usTCPBufPos >= MB_TCP_FUNC) { - // Length is a byte count of Modbus PDU (function code + data) and the - // unit identifier. - xLength = (int)MB_TCP_GET_FIELD(pxClientInfo->pucTCPBuf, MB_TCP_LEN); - // Is the frame already complete. - if (pxClientInfo->usTCPBufPos < (MB_TCP_UID + xLength)) { - // The incomplete frame is received - pxClientInfo->usTCPFrameBytesLeft = xLength + MB_TCP_UID - pxClientInfo->usTCPBufPos; - } else if (pxClientInfo->usTCPBufPos == (MB_TCP_UID + xLength)) { -#if MB_TCP_DEBUG - prvvMBTCPLogFrame(TAG, (UCHAR*)&pxClientInfo->pucTCPBuf[0], pxClientInfo->usTCPBufPos); -#endif - // Copy TID field from incoming packet - pxClientInfo->usTidCnt = MB_TCP_GET_FIELD(pxClientInfo->pucTCPBuf, MB_TCP_TID); - xRet = pxClientInfo->usTCPBufPos; - break; - } else if ((pxClientInfo->usTCPBufPos + xLength) >= MB_TCP_BUF_SIZE) { - ESP_LOGE(TAG, "Incorrect buffer received (%u) bytes.", (unsigned)xLength); - // This should not happen. We can't deal with such a client and - // drop the connection for security reasons. - xRet = ERR_BUF; - break; - } - } // if ( pxClientInfo->usTCPBufPos >= MB_TCP_FUNC ) - } // if data received - } // if (FD_ISSET(pxClientInfo->xSockId, &xReadSet)) - } // while (1) - } - return (xRet); -} - -// Create a listening socket on pcBindIp: Port -static int -vMBTCPPortBindAddr(const CHAR* pcBindIp) -{ - int xPar, xRet; - int xListenSockFd = -1; - struct addrinfo xHint; - struct addrinfo* pxAddrList; - struct addrinfo* pxCurAddr; - CHAR* pcStr = NULL; - - memset( &xHint, 0, sizeof( xHint ) ); - - // Bind to IPv6 and/or IPv4, but only in the desired protocol - // Todo: Find a reason why AF_UNSPEC does not work for IPv6 - xHint.ai_family = (xConfig.xIpVer == MB_PORT_IPV4) ? AF_INET : AF_INET6; - xHint.ai_socktype = (xConfig.eMbProto == MB_PROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM; - // The LWIP has an issue when connection to IPv6 socket - xHint.ai_protocol = (xConfig.eMbProto == MB_PROTO_UDP) ? IPPROTO_UDP : IPPROTO_TCP; - xHint.ai_flags = AI_NUMERICSERV; - - if (pcBindIp == NULL) { - xHint.ai_flags |= AI_PASSIVE; - } else { - xHint.ai_flags |= AI_CANONNAME; - } - - if (asprintf(&pcStr, "%u", xConfig.usPort) == -1) { - abort(); - } - - xRet = getaddrinfo(pcBindIp, pcStr, &xHint, &pxAddrList); - free(pcStr); - - if (xRet != 0) { - return -1; - } - - // Try the sockaddr until a binding succeeds - for (pxCurAddr = pxAddrList; pxCurAddr != NULL; pxCurAddr = pxCurAddr->ai_next) - { - xListenSockFd = (int)socket(pxCurAddr->ai_family, pxCurAddr->ai_socktype, - pxCurAddr->ai_protocol); - if (xListenSockFd < 0) - { - continue; - } - - xPar = 1; - // Allow multi client connections - if (setsockopt(xListenSockFd, SOL_SOCKET, SO_REUSEADDR, - (const char*)&xPar, sizeof(xPar)) != 0) - { - close(xListenSockFd); - xListenSockFd = -1; - continue; - } - - if (bind(xListenSockFd, (struct sockaddr *)pxCurAddr->ai_addr, - (socklen_t)pxCurAddr->ai_addrlen) != 0 ) - { - close(xListenSockFd); - xListenSockFd = -1; - continue; - } - - // Listen only makes sense for TCP - if (xConfig.eMbProto == MB_PROTO_TCP) - { - if (listen(xListenSockFd, MB_TCP_NET_LISTEN_BACKLOG) != 0) - { - ESP_LOGE(TAG, "Error occurred during listen: errno=%u", (unsigned)errno); - close(xListenSockFd); - xListenSockFd = -1; - continue; - } - } - // Bind was successful - pcStr = (pxCurAddr->ai_canonname == NULL) ? (CHAR*)"ANY_IP" : pxCurAddr->ai_canonname; - ESP_LOGI(TAG, "Socket (#%d), listener %s on port: %u, errno=%u", - (int)xListenSockFd, pcStr, (unsigned)xConfig.usPort, (unsigned)errno); - break; - } - - freeaddrinfo(pxAddrList); - return(xListenSockFd); -} - -static void vMBTCPPortServerTask(void *pvParameters) -{ - int xErr = 0; - fd_set xReadSet; - int i; - CHAR* pcClientIp = NULL; - struct timeval xTimeVal; - - // Main connection cycle - while (1) { - // Create listen socket - xListenSock = vMBTCPPortBindAddr(xConfig.pcBindAddr); - if (xListenSock < 0) { - TCP_PORT_CHECK_SHDN(xShutdownSema, vMBTCPPortShutdown); - continue; - } - - // Connections handling cycle - while (1) { - // clear the socket set - FD_ZERO(&xReadSet); - // add master socket to set - FD_SET(xListenSock, &xReadSet); - int xMaxSd = xListenSock; - xConfig.usClientCount = 0; - - vxMBTCPPortMStoTimeVal(1, &xTimeVal); - // Initialize read set and file descriptor according to - // all registered connected clients - for (i = 0; i < MB_TCP_PORT_MAX_CONN; i++) { - TCP_PORT_CHECK_SHDN(xShutdownSema, vMBTCPPortShutdown); - if ((xConfig.pxMbClientInfo[i] != NULL) && (xConfig.pxMbClientInfo[i]->xSockId > 0)) { - // calculate max file descriptor for select - xMaxSd = (xConfig.pxMbClientInfo[i]->xSockId > xMaxSd) ? - xConfig.pxMbClientInfo[i]->xSockId : xMaxSd; - FD_SET(xConfig.pxMbClientInfo[i]->xSockId, &xReadSet); - xConfig.usClientCount++; - } - } - - vxMBTCPPortMStoTimeVal(MB_TCP_RESP_TIMEOUT_MS, &xTimeVal); - - // Wait for an activity on one of the sockets during timeout - xErr = select(xMaxSd + 1, &xReadSet, NULL, NULL, &xTimeVal); - if ((xErr < 0) && (errno != EINTR)) { - // error occurred during wait for read - ESP_LOGE(TAG, "select() errno = %u.", (unsigned)errno); - TCP_PORT_CHECK_SHDN(xShutdownSema, vMBTCPPortShutdown); - continue; - } else if (xErr == 0) { - // If timeout happened, something is wrong - ESP_LOGD(TAG, "select() timeout, errno = %u.", (unsigned)errno); - TCP_PORT_CHECK_SHDN(xShutdownSema, vMBTCPPortShutdown); - } - - // If something happened on the master socket, then its an incoming connection. - if (FD_ISSET(xListenSock, &xReadSet) && xConfig.usClientCount < MB_TCP_PORT_MAX_CONN) { - MbClientInfo_t* pxClientInfo = NULL; - // find first empty place to insert connection info - for (i = 0; i < MB_TCP_PORT_MAX_CONN; i++) { - pxClientInfo = xConfig.pxMbClientInfo[i]; - if (pxClientInfo == NULL) { - break; - } - } - // if request for new connection but no space left - if (pxClientInfo != NULL) { - if (xConfig.pxMbClientInfo[MB_TCP_PORT_MAX_CONN] == NULL) { - ESP_LOGE(TAG, "Fail to accept connection %u, only %u connections supported.", (unsigned)(i + 1), (unsigned)MB_TCP_PORT_MAX_CONN); - } - xConfig.pxMbClientInfo[MB_TCP_PORT_MAX_CONN] = pxClientInfo; // set last connection info - } else { - // allocate memory for new client info - pxClientInfo = calloc(1, sizeof(MbClientInfo_t)); - if (!pxClientInfo) { - ESP_LOGE(TAG, "Client info allocation fail."); - vMBTCPPortFreeClientInfo(pxClientInfo); - pxClientInfo = NULL; - } else { - // Accept new client connection - pxClientInfo->xSockId = xMBTCPPortAcceptConnection(xListenSock, &pcClientIp); - if (pxClientInfo->xSockId < 0) { - ESP_LOGE(TAG, "Fail to accept connection for client %u.", (unsigned)(xConfig.usClientCount - 1)); - // Accept connection fail, then free client info and continue polling. - vMBTCPPortFreeClientInfo(pxClientInfo); - pxClientInfo = NULL; - continue; - } - pxClientInfo->pucTCPBuf = calloc(MB_TCP_BUF_SIZE, sizeof(UCHAR)); - if (!pxClientInfo->pucTCPBuf) { - ESP_LOGE(TAG, "Fail to allocate buffer for client %u.", (unsigned)(xConfig.usClientCount - 1)); - vMBTCPPortFreeClientInfo(pxClientInfo); - pxClientInfo = NULL; - continue; - } - // Fill the connection info structure - xConfig.pxMbClientInfo[i] = pxClientInfo; - pxClientInfo->xIndex = i; - xConfig.usClientCount++; - pxClientInfo->pcIpAddr = pcClientIp; - pxClientInfo->xRecvTimeStamp = xMBTCPGetTimeStamp(); - xConfig.pxMbClientInfo[MB_TCP_PORT_MAX_CONN] = NULL; - pxClientInfo->usTCPFrameBytesLeft = MB_TCP_FUNC; - pxClientInfo->usTCPBufPos = 0; - } - } - } - // Handle data request from client - if (xErr > 0) { - // Handling client connection requests - for (i = 0; i < MB_TCP_PORT_MAX_CONN; i++) { - MbClientInfo_t* pxClientInfo = xConfig.pxMbClientInfo[i]; - if ((pxClientInfo != NULL) && (pxClientInfo->xSockId > 0)) { - if (FD_ISSET(pxClientInfo->xSockId, &xReadSet)) { - // Other sockets are ready to be read - xErr = xMBTCPPortRxPoll(pxClientInfo, MB_TCP_READ_TIMEOUT_MS); - // If an invalid data received from socket or connection fail - // or if timeout then drop connection and restart - if (xErr < 0) { - uint64_t xTimeStamp = xMBTCPGetTimeStamp(); - // If data update is timed out - switch(xErr) - { - case ERR_TIMEOUT: - ESP_LOGE(TAG, "Socket (#%d)(%s), data receive timeout, time[us]: %" PRIu64 ", close active connection.", - (int)pxClientInfo->xSockId, pxClientInfo->pcIpAddr, - (uint64_t)(xTimeStamp - pxClientInfo->xRecvTimeStamp)); - break; - case ERR_CLSD: - ESP_LOGE(TAG, "Socket (#%d)(%s), connection closed by peer.", - (int)pxClientInfo->xSockId, pxClientInfo->pcIpAddr); - break; - case ERR_BUF: - default: - ESP_LOGE(TAG, "Socket (#%d)(%s), read data error: 0x%x", - (int)pxClientInfo->xSockId, pxClientInfo->pcIpAddr, (int)xErr); - break; - } - - TCP_PORT_CHECK_SHDN(xShutdownSema, vMBTCPPortShutdown); - - // Close client connection - xMBTCPPortCloseConnection(pxClientInfo); - - // This client does not respond, then unregister it - vMBTCPPortFreeClientInfo(pxClientInfo); - xConfig.pxMbClientInfo[i] = NULL; - xConfig.pxMbClientInfo[MB_TCP_PORT_MAX_CONN] = NULL; - // If no any active connections, break - if (!xConfig.usClientCount) { - xConfig.pxCurClientInfo = NULL; - break; - } - } else { - pxClientInfo->xRecvTimeStamp = xMBTCPGetTimeStamp(); - - // set current client info to active client from which we received request - xConfig.pxCurClientInfo = pxClientInfo; - - // Complete frame received, inform state machine to process frame - xMBPortEventPost(EV_FRAME_RECEIVED); - - ESP_LOGD(TAG, "Socket (#%d)(%s), get packet TID=0x%X, %d bytes.", - (int)pxClientInfo->xSockId, pxClientInfo->pcIpAddr, - (int)pxClientInfo->usTidCnt, (int)xErr); - - // Wait while response is not processed by stack by timeout - UCHAR* pucSentBuffer = vxMBTCPPortRespQueueRecv(xConfig.xRespQueueHandle); - if (pucSentBuffer == NULL) { - ESP_LOGD(TAG, "Response is ignored, time exceeds configured %d [ms].", - (unsigned)MB_TCP_RESP_TIMEOUT_MS); - } else { - USHORT usSentTid = MB_TCP_GET_FIELD(pucSentBuffer, MB_TCP_TID); - if (usSentTid != pxClientInfo->usTidCnt) { - ESP_LOGE(TAG, "Sent TID(%x) != Recv TID(%x), ignore packet.", - (int)usSentTid, (int)pxClientInfo->usTidCnt); - } - } - - // Get time stamp of last data update - pxClientInfo->xSendTimeStamp = xMBTCPGetTimeStamp(); - ESP_LOGD(TAG, "Client %d, Socket(#%d), processing time = %" PRIu64 "(us).", - (int)pxClientInfo->xIndex, (int)pxClientInfo->xSockId, - (uint64_t)(pxClientInfo->xSendTimeStamp - pxClientInfo->xRecvTimeStamp)); - } - } else { - if (pxClientInfo) { - // client is not ready to be read - int64_t xTime = xMBTCPGetTimeStamp() - pxClientInfo->xRecvTimeStamp; - if (xTime > MB_TCP_DISCONNECT_TIMEOUT) { - ESP_LOGE(TAG, "Client %d, Socket(#%d) do not answer for %" PRIu64 " (us). Drop connection...", - (int)pxClientInfo->xIndex, (int)pxClientInfo->xSockId, (uint64_t)xTime); - xMBTCPPortCloseConnection(pxClientInfo); - - // This client does not respond, then delete registered data - vMBTCPPortFreeClientInfo(pxClientInfo); - xConfig.pxMbClientInfo[i] = NULL; - } - } else { - ESP_LOGE(TAG, "Client %d is disconnected.", (int)i); - } - } - } // if ((pxClientInfo != NULL) - } // Handling client connection requests - } - } // while(1) // Handle connection cycle - } // Main connection cycle - vTaskDelete(NULL); -} - -void -vMBTCPPortClose( ) -{ - // Try to exit the task gracefully, so select could release its internal callbacks - // that were allocated on the stack of the task we're going to delete - xShutdownSema = xSemaphoreCreateBinary(); - if (xShutdownSema == NULL || // if no semaphore (alloc issues) or couldn't acquire it, just delete the task - xSemaphoreTake(xShutdownSema, 2 * pdMS_TO_TICKS(CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND)) != pdTRUE) { - ESP_LOGE(TAG, "Task couldn't exit gracefully within timeout -> abruptly deleting the task"); - vTaskDelete(xConfig.xMbTcpTaskHandle); - } - - close(xListenSock); - xListenSock = -1; - - vMBTCPPortRespQueueDelete(xConfig.xRespQueueHandle); - - if (xShutdownSema) { - vSemaphoreDelete(xShutdownSema); - xShutdownSema = NULL; - } - vMBPortEventClose(); -} - -void vMBTCPPortEnable( void ) -{ - -} - -void -vMBTCPPortDisable( void ) -{ - -} - -BOOL -xMBTCPPortGetRequest( UCHAR ** ppucMBTCPFrame, USHORT * usTCPLength ) -{ - BOOL xRet = FALSE; - if (xConfig.pxCurClientInfo) { - *ppucMBTCPFrame = &xConfig.pxCurClientInfo->pucTCPBuf[0]; - *usTCPLength = xConfig.pxCurClientInfo->usTCPBufPos; - - // Reset the buffer. - xConfig.pxCurClientInfo->usTCPBufPos = 0; - xConfig.pxCurClientInfo->usTCPFrameBytesLeft = MB_TCP_FUNC; - xRet = TRUE; - } - return xRet; -} - -BOOL -xMBTCPPortSendResponse( UCHAR * pucMBTCPFrame, USHORT usTCPLength ) -{ - BOOL bFrameSent = FALSE; - fd_set xWriteSet; - fd_set xErrorSet; - int xErr = -1; - struct timeval xTimeVal; - - if (xConfig.pxCurClientInfo) { - FD_ZERO(&xWriteSet); - FD_ZERO(&xErrorSet); - FD_SET(xConfig.pxCurClientInfo->xSockId, &xWriteSet); - FD_SET(xConfig.pxCurClientInfo->xSockId, &xErrorSet); - vxMBTCPPortMStoTimeVal(MB_TCP_SEND_TIMEOUT_MS, &xTimeVal); - // Check if socket writable - xErr = select(xConfig.pxCurClientInfo->xSockId + 1, NULL, &xWriteSet, &xErrorSet, &xTimeVal); - if ((xErr == -1) || FD_ISSET(xConfig.pxCurClientInfo->xSockId, &xErrorSet)) { - ESP_LOGE(TAG, "Socket(#%d) , send select() error = %u.", - (int)xConfig.pxCurClientInfo->xSockId, (unsigned)errno); - return FALSE; - } - - // Apply TID field from request to the frame before send response - pucMBTCPFrame[MB_TCP_TID] = (UCHAR)(xConfig.pxCurClientInfo->usTidCnt >> 8U); - pucMBTCPFrame[MB_TCP_TID + 1] = (UCHAR)(xConfig.pxCurClientInfo->usTidCnt & 0xFF); - - // Write message into socket and disable Nagle's algorithm - xErr = send(xConfig.pxCurClientInfo->xSockId, pucMBTCPFrame, usTCPLength, TCP_NODELAY); - if (xErr < 0) { - ESP_LOGE(TAG, "Socket(#%d), fail to send data, errno = %u", - (int)xConfig.pxCurClientInfo->xSockId, (unsigned)errno); - xConfig.pxCurClientInfo->xError = xErr; - } else { - bFrameSent = TRUE; - vxMBTCPPortRespQueueSend(xConfig.xRespQueueHandle, (void*)pucMBTCPFrame); - } - } else { - ESP_LOGD(TAG, "Port is not active. Release lock."); - vxMBTCPPortRespQueueSend(xConfig.xRespQueueHandle, (void*)pucMBTCPFrame); - } - return bFrameSent; -} - -#endif //#if MB_TCP_ENABLED diff --git a/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/port/port_tcp_slave.h b/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/port/port_tcp_slave.h deleted file mode 100755 index efac0fb..0000000 --- a/managed_components/espressif__esp-modbus/freemodbus/tcp_slave/port/port_tcp_slave.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006 Christian Walter - * - * SPDX-License-Identifier: BSD-3-Clause - * - * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD - */ -/* - * FreeModbus Libary: ESP32 TCP Port - * Copyright (C) 2006 Christian Walter - * Parts of crt0.S Copyright (c) 1995, 1996, 1998 Cygnus Support - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * IF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: port.h,v 1.2 2006/09/04 14:39:20 wolti Exp $ - */ - -#ifndef _PORT_TCP_SLAVE_H -#define _PORT_TCP_SLAVE_H - -/* ----------------------- Platform includes --------------------------------*/ -#include "esp_log.h" - -#include "lwip/opt.h" -#include "lwip/sys.h" -#include "port.h" -#include "esp_modbus_common.h" // for common types for network options - -/* ----------------------- Defines ------------------------------------------*/ - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifdef __cplusplus -PR_BEGIN_EXTERN_C -#endif - -/* ----------------------- Type definitions ---------------------------------*/ -typedef struct { - int xIndex; /*!< Modbus info index */ - int xSockId; /*!< Socket id */ - int xError; /*!< TCP/UDP sock error */ - const char* pcIpAddr; /*!< TCP/UDP IP address (string) */ - UCHAR* pucTCPBuf; /*!< buffer pointer */ - USHORT usTCPBufPos; /*!< buffer active position */ - USHORT usTCPFrameBytesLeft; /*!< buffer left bytes to receive transaction */ - int64_t xSendTimeStamp; /*!< send request timestamp */ - int64_t xRecvTimeStamp; /*!< receive response timestamp */ - USHORT usTidCnt; /*!< last TID counter from packet */ -} MbClientInfo_t; - -typedef struct { - TaskHandle_t xMbTcpTaskHandle; /*!< Server task handle */ - QueueHandle_t xRespQueueHandle; /*!< Response queue handle */ - MbClientInfo_t* pxCurClientInfo; /*!< Current client info */ - MbClientInfo_t** pxMbClientInfo; /*!< Pointers to information about connected clients */ - USHORT usPort; /*!< TCP/UDP port number */ - CHAR* pcBindAddr; /*!< IP address to bind */ - eMBPortProto eMbProto; /*!< Protocol type used by port */ - USHORT usClientCount; /*!< Client connection count */ - void* pvNetIface; /*!< Network netif interface pointer for port */ - eMBPortIpVer xIpVer; /*!< IP protocol version */ -} MbSlavePortConfig_t; - -/* ----------------------- Function prototypes ------------------------------*/ - -/** - * Function to setup communication options for TCP/UDP Modbus port - * - * @param pvNetIf netif interface pointer - * @param xIpVersion IP version - * @param xProto protocol type option - * @param pcBindAddr IP bind address - * - * @return error code - */ -void vMBTCPPortSlaveSetNetOpt(void* pvNetIf, eMBPortIpVer xIpVersion, eMBPortProto xProto, CHAR* pcBindAddr); - -#ifdef __cplusplus -PR_END_EXTERN_C -#endif -#endif diff --git a/managed_components/espressif__esp-modbus/idf_component.yml b/managed_components/espressif__esp-modbus/idf_component.yml deleted file mode 100755 index 48cc5b0..0000000 --- a/managed_components/espressif__esp-modbus/idf_component.yml +++ /dev/null @@ -1,15 +0,0 @@ -dependencies: - idf: '>=4.3' -description: ESP-MODBUS is the official Modbus library for Espressif SoCs. -files: - exclude: - - docs/**/* - - docs - - test/**/* - - test - - arch - - arch/**/* - - build*/**/* - - '**/*.zip' -url: https://github.com/espressif/esp-modbus -version: 1.0.16 diff --git a/managed_components/espressif__esp-modbus/pytest.ini b/managed_components/espressif__esp-modbus/pytest.ini deleted file mode 100755 index e24fc0c..0000000 --- a/managed_components/espressif__esp-modbus/pytest.ini +++ /dev/null @@ -1,51 +0,0 @@ -[pytest] -# only the files with prefix `pytest_` would be recognized as pytest test scripts. -python_files = pytest_*.py - -# ignore PytestExperimentalApiWarning for record_xml_attribute -# set traceback to "short" to prevent the overwhelming tracebacks -addopts = - -s - --embedded-services esp,idf - --tb short - --skip-check-coredump y - -# ignore DeprecationWarning -filterwarnings = - ignore::DeprecationWarning:matplotlib.*: - ignore::DeprecationWarning:google.protobuf.*: - ignore::_pytest.warning_types.PytestExperimentalApiWarning - -markers = - # target markers - esp32: support esp32 target - esp32s2: support esp32s2 target - esp32s3: support esp32s3 target - esp32c3: support esp32c3 target - esp32c2: support esp32c2 target - esp32c6: support esp32c6 target - esp32h2: support esp32h2 target - esp32p4: support esp32p4 target - - # env markers - generic: tests should be run on generic runners - - # multi-dut markers - multi_dut_generic: tests should be run on generic runners, at least have two duts connected. - multi_dut_modbus_tcp: Modbus TCP runners with two duts connected - multi_dut_modbus_rs485: Modbus RTU/ASCII runners with two duts connected - multi_dut_modbus_serial: Modbus SERIAL runner with two duts (master, slave - additional) - multi_dut_modbus_generic: Modbus generic runner - -# log related -log_cli = True -log_cli_level = INFO -log_cli_format = %(asctime)s %(levelname)s %(message)s -log_cli_date_format = %Y-%m-%d %H:%M:%S - -# junit related -junit_family = xunit1 - -## log all to `system-out` when case fail -junit_logging = stdout -junit_log_passing_tests = False diff --git a/managed_components/espressif__esp-modbus/tools/ignore_build_warnings.txt b/managed_components/espressif__esp-modbus/tools/ignore_build_warnings.txt deleted file mode 100755 index fe3f6c1..0000000 --- a/managed_components/espressif__esp-modbus/tools/ignore_build_warnings.txt +++ /dev/null @@ -1,16 +0,0 @@ -library/error\.o -/.*error\S*\.o -.*error.*\.c\.obj -.*error.*\.c -.*error.*\.cpp\.obj -.*error.*\.cxx\.obj -.*error.*\.cc\.obj --Werror -error\.d -/.*error\S*.d -reassigning to symbol -changes choice state -crosstool_version_check\.cmake -CryptographyDeprecationWarning -Warning: \d+/\d+ app partitions are too small for binary -CMake Deprecation Warning at main/lib/tinyxml2/CMakeLists\.txt:11 \(cmake_policy\) diff --git a/managed_components/espressif__mdns/.component_hash b/managed_components/espressif__mdns/.component_hash old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/.cz.yaml b/managed_components/espressif__mdns/.cz.yaml old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/CHANGELOG.md b/managed_components/espressif__mdns/CHANGELOG.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/CMakeLists.txt b/managed_components/espressif__mdns/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/Kconfig b/managed_components/espressif__mdns/Kconfig old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/LICENSE b/managed_components/espressif__mdns/LICENSE old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/README.md b/managed_components/espressif__mdns/README.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/examples/query_advertise/CMakeLists.txt b/managed_components/espressif__mdns/examples/query_advertise/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/examples/query_advertise/README.md b/managed_components/espressif__mdns/examples/query_advertise/README.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/examples/query_advertise/main/CMakeLists.txt b/managed_components/espressif__mdns/examples/query_advertise/main/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/examples/query_advertise/main/Kconfig.projbuild b/managed_components/espressif__mdns/examples/query_advertise/main/Kconfig.projbuild old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/examples/query_advertise/main/idf_component.yml b/managed_components/espressif__mdns/examples/query_advertise/main/idf_component.yml old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/examples/query_advertise/main/mdns_example_main.c b/managed_components/espressif__mdns/examples/query_advertise/main/mdns_example_main.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/examples/query_advertise/pytest_mdns.py b/managed_components/espressif__mdns/examples/query_advertise/pytest_mdns.py old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/idf_component.yml b/managed_components/espressif__mdns/idf_component.yml old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/include/mdns.h b/managed_components/espressif__mdns/include/mdns.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/include/mdns_console.h b/managed_components/espressif__mdns/include/mdns_console.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/mdns.c b/managed_components/espressif__mdns/mdns.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/mdns_console.c b/managed_components/espressif__mdns/mdns_console.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/mdns_mem_caps.c b/managed_components/espressif__mdns/mdns_mem_caps.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/mdns_networking_lwip.c b/managed_components/espressif__mdns/mdns_networking_lwip.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/mdns_networking_socket.c b/managed_components/espressif__mdns/mdns_networking_socket.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/mem_prefix_script.py b/managed_components/espressif__mdns/mem_prefix_script.py old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/private_include/mdns_mem_caps.h b/managed_components/espressif__mdns/private_include/mdns_mem_caps.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/private_include/mdns_networking.h b/managed_components/espressif__mdns/private_include/mdns_networking.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/private_include/mdns_private.h b/managed_components/espressif__mdns/private_include/mdns_private.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/CMakeLists.txt b/managed_components/espressif__mdns/tests/host_test/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/README.md b/managed_components/espressif__mdns/tests/host_test/README.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/components/esp_netif_linux/CMakeLists.txt b/managed_components/espressif__mdns/tests/host_test/components/esp_netif_linux/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/components/esp_netif_linux/Kconfig b/managed_components/espressif__mdns/tests/host_test/components/esp_netif_linux/Kconfig old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/components/esp_netif_linux/esp_netif_linux.c b/managed_components/espressif__mdns/tests/host_test/components/esp_netif_linux/esp_netif_linux.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/components/esp_netif_linux/include/esp_wifi_types.h b/managed_components/espressif__mdns/tests/host_test/components/esp_netif_linux/include/esp_wifi_types.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/components/esp_netif_linux/include/machine/endian.h b/managed_components/espressif__mdns/tests/host_test/components/esp_netif_linux/include/machine/endian.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/dnsfixture.py b/managed_components/espressif__mdns/tests/host_test/dnsfixture.py old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/main/CMakeLists.txt b/managed_components/espressif__mdns/tests/host_test/main/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/main/Kconfig.projbuild b/managed_components/espressif__mdns/tests/host_test/main/Kconfig.projbuild old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/main/idf_component.yml b/managed_components/espressif__mdns/tests/host_test/main/idf_component.yml old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/main/main.c b/managed_components/espressif__mdns/tests/host_test/main/main.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/host_test/pytest_mdns.py b/managed_components/espressif__mdns/tests/host_test/pytest_mdns.py old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/CMakeLists.txt b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/README.md b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/README.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/esp32_mock.c b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/esp32_mock.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/esp32_mock.h b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/esp32_mock.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/esp_attr.h b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/esp_attr.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/esp_netif_mock.c b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/esp_netif_mock.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/file2.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/file2.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_4a_txt.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_4a_txt.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_aaaa.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_aaaa.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_any.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_any.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_disc.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_disc.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_ptr.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_ptr.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_query.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_query.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_query2.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/minif_query2.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/sub_fritz_m.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/sub_fritz_m.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/telnet_ptr.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/telnet_ptr.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-14.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-14.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-15.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-15.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-16.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-16.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-28.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-28.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-29.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-29.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-31.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-31.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-53.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-53.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-56.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-56.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-63.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-63.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-83.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-83.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-88.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-88.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-89.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-89.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-95.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-95.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-96.bin b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/in/test-96.bin old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/input_packets.txt b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/input_packets.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/mdns_di.h b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/mdns_di.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/mdns_mock.h b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/mdns_mock.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_afl_fuzz_host/test.c b/managed_components/espressif__mdns/tests/test_afl_fuzz_host/test.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_apps/CMakeLists.txt b/managed_components/espressif__mdns/tests/test_apps/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_apps/README.md b/managed_components/espressif__mdns/tests/test_apps/README.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_apps/main/CMakeLists.txt b/managed_components/espressif__mdns/tests/test_apps/main/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_apps/main/Kconfig.projbuild b/managed_components/espressif__mdns/tests/test_apps/main/Kconfig.projbuild old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_apps/main/idf_component.yml b/managed_components/espressif__mdns/tests/test_apps/main/idf_component.yml old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_apps/main/main.c b/managed_components/espressif__mdns/tests/test_apps/main/main.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_apps/main/mdns_test.c b/managed_components/espressif__mdns/tests/test_apps/main/mdns_test.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/test_apps/pytest_mdns_app.py b/managed_components/espressif__mdns/tests/test_apps/pytest_mdns_app.py old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/unit_test/CMakeLists.txt b/managed_components/espressif__mdns/tests/unit_test/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/unit_test/main/CMakeLists.txt b/managed_components/espressif__mdns/tests/unit_test/main/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/unit_test/main/test_mdns.c b/managed_components/espressif__mdns/tests/unit_test/main/test_mdns.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__mdns/tests/unit_test/pytest_app_mdns.py b/managed_components/espressif__mdns/tests/unit_test/pytest_app_mdns.py old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/.component_hash b/managed_components/espressif__ntc_driver/.component_hash old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/CHANGELOG.md b/managed_components/espressif__ntc_driver/CHANGELOG.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/CMakeLists.txt b/managed_components/espressif__ntc_driver/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/README.md b/managed_components/espressif__ntc_driver/README.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/README_CN.md b/managed_components/espressif__ntc_driver/README_CN.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/CMakeLists.txt b/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/README.md b/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/README.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/README_CN.md b/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/README_CN.md old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/main/CMakeLists.txt b/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/main/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/main/idf_component.yml b/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/main/idf_component.yml old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/main/ntc_temperature_example_main.c b/managed_components/espressif__ntc_driver/examples/ntc_temperature_sensor/main/ntc_temperature_example_main.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/idf_component.yml b/managed_components/espressif__ntc_driver/idf_component.yml old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/include/ntc_driver.h b/managed_components/espressif__ntc_driver/include/ntc_driver.h old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/license.txt b/managed_components/espressif__ntc_driver/license.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/ntc_driver.c b/managed_components/espressif__ntc_driver/ntc_driver.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/test_apps/CMakeLists.txt b/managed_components/espressif__ntc_driver/test_apps/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/test_apps/main/CMakeLists.txt b/managed_components/espressif__ntc_driver/test_apps/main/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/test_apps/main/test_ntc_driver.c b/managed_components/espressif__ntc_driver/test_apps/main/test_ntc_driver.c old mode 100755 new mode 100644 diff --git a/managed_components/espressif__ntc_driver/test_apps/pytest_ntc_driver.py b/managed_components/espressif__ntc_driver/test_apps/pytest_ntc_driver.py old mode 100755 new mode 100644