mirror of
https://gitlab.com/fabinfra/fabhardware/fabmeter.git
synced 2025-03-12 22:51:44 +01:00
175 lines
6.6 KiB
C
175 lines
6.6 KiB
C
#include <mbcontroller.h>
|
|
#include <led_strip.h>
|
|
#include <esp_event.h>
|
|
#include <esp_wifi.h>
|
|
#include <esp_crt_bundle.h>
|
|
#include <mqtt_client.h>
|
|
#include <nvs_flash.h>
|
|
|
|
#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;
|
|
}
|