#include #include #include #include #include #include #include #include "initializers.h" #include "net_event_handler.h" #include "mqtt_event_handler.h" #include "sdkconfig.h" #define LED_STRIP_RMT_RES_HZ (10 * 1000 * 1000) char TAG[] = "initializers"; led_strip_handle_t debug_led; esp_mqtt_client_handle_t mqtt_client; // Modbus master initialization esp_err_t init_modbus(const mb_parameter_descriptor_t* device_parameters, const uint16_t num_device_parameters) { // Initialize and start Modbus controller mb_communication_info_t comm = { .port = MB_PORT_NUM, #if CONFIG_MB_COMM_MODE_ASCII .mode = MB_MODE_ASCII, #elif CONFIG_MB_COMM_MODE_RTU .mode = MB_MODE_RTU, #endif .baudrate = MB_DEV_SPEED, .parity = MB_PARITY }; void* master_handler = NULL; esp_err_t err = mbc_master_init(MB_PORT_SERIAL_MASTER, &master_handler); MB_RETURN_ON_FALSE((master_handler != NULL), ESP_ERR_INVALID_STATE, TAG, "mb controller initialization fail."); MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, "mb controller initialization fail, returns(0x%"PRIu32").", (uint32_t)err); err = mbc_master_setup((void*)&comm); MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, "mb controller setup fail, returns(0x%"PRIu32").", (uint32_t)err); // Set UART pin numbers err = uart_set_pin(MB_PORT_NUM, CONFIG_MB_UART_TXD, CONFIG_MB_UART_RXD, CONFIG_MB_UART_RTS, UART_PIN_NO_CHANGE); MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, "mb serial set pin failure, uart_set_pin() returned (0x%"PRIu32").", (uint32_t)err); err = mbc_master_start(); MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, "mb controller start fail, returns(0x%"PRIu32").", (uint32_t)err); // Set driver mode to Half Duplex err = uart_set_mode(MB_PORT_NUM, UART_MODE_RS485_HALF_DUPLEX); MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, "mb serial set mode failure, uart_set_mode() returned (0x%"PRIu32").", (uint32_t)err); // Set UART stop bits err = uart_set_stop_bits(MB_PORT_NUM, MB_STOP_BITS); MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, "mb serial set stop bits failure, uart_set_stop_bits() returned (0x%"PRIu32").", (uint32_t)err); vTaskDelay(5); err = mbc_master_set_descriptor(device_parameters, num_device_parameters); MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, "mb controller set descriptor fail, returns(0x%"PRIu32").", (uint32_t)err); ESP_LOGI(TAG, "Modbus master stack initialized..."); return err; } esp_err_t init_led_strip() { // LED strip general initialization, according to your led board design led_strip_config_t debug_led_config = { .strip_gpio_num = CONFIG_PIN_DEBUG_LED, // The GPIO that connected to the LED strip's data line .max_leds = 1, // The number of LEDs in the strip, .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip .led_model = LED_MODEL_WS2812, // LED strip model .flags.invert_out = false, // whether to invert the output signal }; // LED strip backend configuration: RMT led_strip_rmt_config_t debug_led_rmt_config = { .clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption .resolution_hz = LED_STRIP_RMT_RES_HZ, // RMT counter clock frequency .flags.with_dma = false, // DMA feature is available on ESP target like ESP32-S3 }; ESP_ERROR_CHECK(led_strip_new_rmt_device(&debug_led_config, &debug_led_rmt_config, &debug_led)); ESP_LOGI("led", "Created LED strip object with RMT backend for debug LED"); return ESP_OK; } esp_err_t init_eventloop() { esp_err_t ret = esp_event_loop_create_default(); ESP_ERROR_CHECK(ret); return ret; } esp_err_t init_wifi() { esp_err_t ret; ret = esp_netif_init(); ESP_ERROR_CHECK(ret); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ret = esp_wifi_init(&cfg); ESP_ERROR_CHECK(ret); ret = esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &network_event_handler, NULL, NULL); ESP_ERROR_CHECK(ret); ret = esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &network_event_handler, NULL, NULL); ESP_ERROR_CHECK(ret); // Initialize default station as network interface instance (esp-netif) esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta(); assert(sta_netif); // Initialize and start WiFi wifi_config_t wifi_config = { .sta = { .ssid = CONFIG_WIFI_SSID, .password = CONFIG_WIFI_PASSWORD, .scan_method = CONFIG_WIFI_FAST_SCAN ? WIFI_FAST_SCAN : WIFI_ALL_CHANNEL_SCAN, .sort_method = WIFI_CONNECT_AP_BY_SIGNAL, .threshold.rssi = -127, .threshold.authmode = WIFI_AUTH_WPA2_PSK, }, }; ret = esp_wifi_set_mode(WIFI_MODE_STA); ESP_ERROR_CHECK(ret); ret = esp_wifi_set_config(WIFI_IF_STA, &wifi_config); ESP_ERROR_CHECK(ret); ret = esp_wifi_start(); ESP_ERROR_CHECK(ret); return ret; } esp_err_t init_nvs() { // Initialize NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); return ret; } esp_err_t init_mqtt() { esp_err_t ret; const esp_mqtt_client_config_t mqtt_cfg = { .broker = { .address.uri = CONFIG_BROKER_URI, .verification.crt_bundle_attach = esp_crt_bundle_attach } }; esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ ret = esp_mqtt_client_register_event(client, MQTT_EVENT_ANY, mqtt_event_handler, NULL); ESP_ERROR_CHECK(ret); ret = esp_mqtt_client_start(client); ESP_ERROR_CHECK(ret); mqtt_client = client; return ret; }