From 36e2597539a4eb2f3b0aea84cd8ce295d322b5b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20=C5=BDaitl=C3=ADk?= Date: Sat, 2 Oct 2021 18:02:09 +0200 Subject: [PATCH] Added variable baudrates functionality. NOT TESTED. --- fw/Core/Inc/config.h | 11 +- fw/Core/Src/config.c | 39 ++++- fw/Core/Src/main.c | 356 ++++++++++++++++++++++++------------------- 3 files changed, 244 insertions(+), 162 deletions(-) diff --git a/fw/Core/Inc/config.h b/fw/Core/Inc/config.h index 8040bd7..9ae912f 100644 --- a/fw/Core/Inc/config.h +++ b/fw/Core/Inc/config.h @@ -54,8 +54,10 @@ config_read(&config); #define CONFIG_DEFAULT_LED_ALERT2_LIMIT 3000 #define CONFIG_DEFAULT_LED_SMOOTH 0 #define CONFIG_DEFAULT_SCD4x_T_OFFSET 0 +#define CONFIG_DEFAULT_BAUDRATE_INDEX 0 -#define MODBUS_ADDR_LENGTH 2 +#define CONFIG_MODBUS_ADDR_LENGTH 2 +#define CONFIG_BAUDRATE_INDEX_LENGTH 2 #define CONFIG_LED_ON_LENGTH 2 #define CONFIG_LED_BRIGHTNESS_LENGTH 2 #define CONFIG_LED_SMOOTH_LENGTH 2 @@ -75,7 +77,8 @@ config_read(&config); #define EEPROM_ADDR_END ((uint32_t)0x080801FF) #define CONFIG_EEPROM_ADDR_MODBUS_ADDR (EEPROM_ADDR_START) -#define CONFIG_EEPROM_ADDR_LED_ON (CONFIG_EEPROM_ADDR_MODBUS_ADDR + MODBUS_ADDR_LENGTH) +#define CONFIG_EEPROM_ADDR_BAUDRATE_INDEX (CONFIG_EEPROM_ADDR_MODBUS_ADDR + CONFIG_MODBUS_ADDR_LENGTH) +#define CONFIG_EEPROM_ADDR_LED_ON (CONFIG_EEPROM_ADDR_BAUDRATE_INDEX + CONFIG_BAUDRATE_INDEX_LENGTH) #define CONFIG_EEPROM_ADDR_LED_BRIGHTNESS (CONFIG_EEPROM_ADDR_LED_ON + CONFIG_LED_ON_LENGTH) #define CONFIG_EEPROM_ADDR_LED_SMOOTH (CONFIG_EEPROM_ADDR_LED_BRIGHTNESS + CONFIG_LED_BRIGHTNESS_LENGTH) #define CONFIG_EEPROM_ADDR_LED_ALERT1 (CONFIG_EEPROM_ADDR_LED_SMOOTH + CONFIG_LED_SMOOTH_LENGTH) @@ -118,8 +121,12 @@ typedef struct /* MODBUS CONFIG */ uint16_t modbus_addr; + uint32_t baudrate_index; } config_t; +/* IMPORTANT: baudrates must be defined in main.c and the default value must be at index 0*/ +/* const uint32_t baudrates [] = {19200, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 76800, 115200}; */ + int8_t config_read(config_t *config); int8_t config_write(config_t *config); diff --git a/fw/Core/Src/config.c b/fw/Core/Src/config.c index 8236b0f..c8b09de 100644 --- a/fw/Core/Src/config.c +++ b/fw/Core/Src/config.c @@ -17,10 +17,14 @@ static int8_t eeprom_program_byte(uint32_t addr, uint8_t ee_data); /* Function to write two bytes to the EEPROM */ /* IMPORTANT: EEPROM must be unlocked first */ static int8_t eeprom_program_halfword(uint32_t addr, uint16_t ee_data); +/* Function to write four bytes to the EEPROM */ +/* IMPORTANT: EEPROM must be unlocked first */ +static int8_t eeprom_program_word(uint32_t addr, uint32_t ee_data); int8_t config_read(config_t *config) { config->modbus_addr = *(uint16_t *) (CONFIG_EEPROM_ADDR_MODBUS_ADDR); + config->baudrate_index = *(uint32_t *) (CONFIG_EEPROM_ADDR_BAUDRATE_INDEX); config->led_on = *(uint16_t *) (CONFIG_EEPROM_ADDR_LED_ON); config->led_brightness = *(uint16_t *) (CONFIG_EEPROM_ADDR_LED_BRIGHTNESS); config->led_smooth = *(uint16_t *) (CONFIG_EEPROM_ADDR_LED_SMOOTH); @@ -28,10 +32,16 @@ int8_t config_read(config_t *config) config->led_co2_alert_limit2 = *(uint16_t *) (CONFIG_EEPROM_ADDR_LED_ALERT2); config->scd4x_t_offset = *(int16_t *) (CONFIG_EEPROM_ADDR_SCD4x_T_OFFSET); - /* Check if the EEPROM is initialized - do not check LED ON, that is 1 or 0 */ - if ((config->modbus_addr == EEPROM_EMPTY_BYTE) || - (config->led_co2_alert_limit1 == EEPROM_EMPTY_BYTE) || - (config->led_co2_alert_limit2 == EEPROM_EMPTY_BYTE)) + /* Check if the EEPROM is initialized - do not check: + * LED ON + * LED SMOOTH + * SCD4x T OFFSET + * BAUDRATE INDEX + * those can be 0 */ + if ((config->modbus_addr == EEPROM_EMPTY_BYTE) || + (config->led_co2_alert_limit1 == EEPROM_EMPTY_BYTE) || + (config->led_co2_alert_limit2 == EEPROM_EMPTY_BYTE) || + (config->led_brightness == EEPROM_EMPTY_BYTE)) { return CONFIG_ERROR; } @@ -53,6 +63,11 @@ int8_t config_write(config_t *config) { return EEPROM_WRITE_ERROR; } + /* Write BAUDRATE */ + if (eeprom_program_word(CONFIG_EEPROM_ADDR_BAUDRATE_INDEX, config->baudrate_index) != EEPROM_OK) + { + return EEPROM_WRITE_ERROR; + } /* Write LED ON */ if (eeprom_program_byte(CONFIG_EEPROM_ADDR_LED_ON, config->led_on) != EEPROM_OK) @@ -191,3 +206,19 @@ static int8_t eeprom_program_halfword(uint32_t addr, uint16_t ee_data) return EEPROM_ADDR_ERROR; } } + +static int8_t eeprom_program_word(uint32_t addr, uint32_t ee_data) +{ + if ((EEPROM_ADDR_START <= addr) && (addr <= EEPROM_ADDR_END - 4)) + { + *(uint32_t *)(addr) = ee_data; /* write data to EEPROM */ + if (*(uint32_t *)(addr) != ee_data) + { + return EEPROM_WRITE_ERROR; + } + return EEPROM_OK; + } else + { + return EEPROM_ADDR_ERROR; + } +} diff --git a/fw/Core/Src/main.c b/fw/Core/Src/main.c index 09577ac..146611d 100644 --- a/fw/Core/Src/main.c +++ b/fw/Core/Src/main.c @@ -69,7 +69,8 @@ const uint16_t tim21_period = 1200-1; // 6s * */ /* Input registers memory map implementation */ -enum { +enum +{ REGISTER_NUM_CO2 = 30010, REGISTER_NUM_T_SHT4x = 30011, REGISTER_NUM_RH_SHT4x = 30012, @@ -79,7 +80,8 @@ enum { REGISTER_NUM_T_SCD4x_SIGNED = 30016 } data_registers_numbers; -enum { +enum +{ REGISTER_NUM_LED_ON = 40001, REGISTER_NUM_LED_BRIGHTNESS = 40002, REGISTER_NUM_LED_SMOOTH = 40003, @@ -87,9 +89,11 @@ enum { REGISTER_NUM_CO2_ALERT_LIMIT2 = 40005, REGISTER_NUM_SCD4x_T_OFFSET = 40006, REGISTER_NUM_MODBUS_ADDR = 40007, + REGISTER_NUM_BAUDRATE = 40008 } config_registers_numbers; -enum { +enum +{ REGISTER_NUM_VENDOR_NAME = 30010, REGISTER_NUM_PRODUCT_CODE = 30011, REGISTER_NUM_REVISION = 30012, @@ -97,6 +101,9 @@ enum { REGISTER_NUM_SERIAL_NUMBER = 30014 } identification_registers_numbers; +/* Baudrates - STM32L0xx can do baudrates from 1200 to 115200 */ +const uint32_t baudrates [] = {19200, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 76800, 115200}; +const uint8_t baudrates_length = 12; /* Variables to store the measured data */ int CO2, T_SCD4x, RH_SCD4x; int T_SHT4x, RH_SHT4x; @@ -104,6 +111,8 @@ uint16_t sps30_measured_data[10]; /* Struct to store the sensor config */ config_t sensor_config; + +uint8_t baudrate_changed = 0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -113,124 +122,13 @@ static void MX_I2C1_Init(void); static void MX_LPUART1_UART_Init(void); static void MX_TIM21_Init(void); /* USER CODE BEGIN PFP */ +int8_t modbus_slave_callback(modbus_transaction_t *transaction); +int8_t modbus_transmit_function(uint8_t *buffer, int data_len); void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint8_t buffer_tx_len); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -int8_t modbus_slave_callback(modbus_transaction_t *transaction) -{ - uint16_t register_number = transaction->register_number; - switch (transaction->function_code) - { - case MODBUS_READ_INPUT_REGISTERS: - for (int i = 0; i < transaction->register_count; i++, register_number++) - { - switch (register_number) - { - case REGISTER_NUM_CO2: - transaction->input_registers[i] = (uint16_t)CO2; - break; - case REGISTER_NUM_T_SHT4x: - transaction->input_registers[i] = (uint16_t)T_SHT4x; - break; - case REGISTER_NUM_RH_SHT4x: - transaction->input_registers[i] = (uint16_t)RH_SHT4x; - break; - case REGISTER_NUM_T_SCD4x: - transaction->input_registers[i] = (uint16_t)T_SCD4x; - break; - case REGISTER_NUM_RH_SCD4x: - transaction->input_registers[i] = (uint16_t)RH_SCD4x; - break; - case REGISTER_NUM_T_SHT4x_SIGNED: - transaction->input_registers_signed[i] = (int16_t)T_SHT4x; - break; - case REGISTER_NUM_T_SCD4x_SIGNED: - transaction->input_registers_signed[i] = (int16_t)T_SCD4x; - break; - default: - return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; - } - } - return MODBUS_OK; - case MODBUS_READ_HOLDING_REGISTERS: - for (int i = 0; i < transaction->register_count; i++, register_number++) - { - switch (register_number) - { - case REGISTER_NUM_LED_ON: - transaction->holding_registers[i] = (uint16_t)(sensor_config.led_on); - break; - case REGISTER_NUM_CO2_ALERT_LIMIT1: - transaction->holding_registers[i] = (uint16_t)(sensor_config.led_co2_alert_limit1); - break; - case REGISTER_NUM_CO2_ALERT_LIMIT2: - transaction->holding_registers[i] = (uint16_t)(sensor_config.led_co2_alert_limit2); - break; - case REGISTER_NUM_MODBUS_ADDR: - transaction->holding_registers[i] = (uint16_t)(sensor_config.modbus_addr); - break; - default: - return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; - } - } - return MODBUS_OK; - case MODBUS_WRITE_SINGLE_REGISTER: - switch (register_number) - { - case REGISTER_NUM_LED_ON: - sensor_config.led_on = (uint8_t) transaction->holding_registers[0]; - break; - case REGISTER_NUM_CO2_ALERT_LIMIT1: - sensor_config.led_co2_alert_limit1 = (uint16_t) transaction->holding_registers[0]; - break; - case REGISTER_NUM_CO2_ALERT_LIMIT2: - sensor_config.led_co2_alert_limit2 = (uint16_t) transaction->holding_registers[0]; - break; - case REGISTER_NUM_MODBUS_ADDR: - sensor_config.modbus_addr = (uint16_t) transaction->holding_registers[0]; - break; - default: - return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; - } - return MODBUS_OK; - case MODBUS_WRITE_MULTIPLE_REGISTERS: - for (int i = 0; i < transaction->register_count; i++, register_number++) - { - switch (register_number) - { - case REGISTER_NUM_LED_ON: - sensor_config.led_on = (uint8_t) transaction->holding_registers[i]; - break; - case REGISTER_NUM_CO2_ALERT_LIMIT1: - sensor_config.led_co2_alert_limit1 = (uint16_t) transaction->holding_registers[i]; - break; - case REGISTER_NUM_CO2_ALERT_LIMIT2: - sensor_config.led_co2_alert_limit2 = (uint16_t) transaction->holding_registers[i]; - break; - case REGISTER_NUM_MODBUS_ADDR: - sensor_config.modbus_addr = (uint16_t) transaction->holding_registers[i]; - break; - default: - return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; - } - } - return MODBUS_OK; - default: - return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; - } - /* Catch-all error */ - return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; /* nothing implemented yet! TODO */ -} - -int8_t modbus_transmit_function(uint8_t *buffer, int data_len) -{ - /* TODO */ - LPUART1_TX_Buffer(buffer, data_len); - return MODBUS_OK; -} - /* USER CODE END 0 */ @@ -261,7 +159,19 @@ int main(void) SystemClock_Config(); /* USER CODE BEGIN SysInit */ - + /* Read config from EEPROM - if unsuccessful, set the default values*/ + int8_t config_read_status = config_read(&sensor_config); + if (config_read_status != CONFIG_OK) + { + sensor_config.modbus_addr = MODBUS_DEFAULT_SLAVE_ADDRESS; + sensor_config.led_co2_alert_limit1 = CONFIG_DEFAULT_LED_ALERT1_LIMIT; + sensor_config.led_co2_alert_limit2 = CONFIG_DEFAULT_LED_ALERT2_LIMIT; + sensor_config.led_on = CONFIG_DEFAULT_LED_ON; + sensor_config.led_brightness = CONFIG_DEFAULT_LED_BRIGHTNESS; + sensor_config.led_smooth = CONFIG_DEFAULT_LED_SMOOTH; + sensor_config.scd4x_t_offset = CONFIG_DEFAULT_SCD4x_T_OFFSET; + sensor_config.baudrate_index = CONFIG_DEFAULT_BAUDRATE_INDEX; + } /* USER CODE END SysInit */ /* Initialize all configured peripherals */ @@ -279,18 +189,6 @@ int main(void) /* Enable I2C for sensors */ LL_I2C_Enable(I2C1); - /* Read config from EEPROM - if unsuccessful, set the default values*/ - int8_t config_read_status = config_read(&sensor_config); - if (config_read_status != CONFIG_OK) - { - sensor_config.modbus_addr = MODBUS_DEFAULT_SLAVE_ADDRESS; - sensor_config.led_co2_alert_limit1 = CONFIG_DEFAULT_LED_ALERT1_LIMIT; - sensor_config.led_co2_alert_limit2 = CONFIG_DEFAULT_LED_ALERT2_LIMIT; - sensor_config.led_on = CONFIG_DEFAULT_LED_ON; - sensor_config.led_brightness = CONFIG_DEFAULT_LED_BRIGHTNESS; - sensor_config.led_smooth = CONFIG_DEFAULT_LED_SMOOTH; - sensor_config.scd4x_t_offset = CONFIG_DEFAULT_SCD4x_T_OFFSET; - } /* Set the modbus address */ modbus_slave_set_address(sensor_config.modbus_addr); @@ -361,6 +259,15 @@ int main(void) lpuart1_rx_done = 0; } + if (baudrate_changed == 1) + { + /* TODO: TEST */ + LL_LPUART_Disable(LPUART1); + MX_LPUART1_UART_Init(); + LL_LPUART_Enable(LPUART1); + baudrate_changed = 0; + } + /* It is time for measurement */ if (tim21_elapsed_period == 1) { @@ -386,7 +293,7 @@ int main(void) if (CO2 <= sensor_config.led_co2_alert_limit1) { - /* CO2 is OK -> BLUE */ + /* CO2 is OK -> GREEN */ LL_GPIO_SetOutputPin(LED_R_GPIO_Port, LED_R_Pin); LL_GPIO_ResetOutputPin(LED_G_GPIO_Port, LED_G_Pin); LL_GPIO_SetOutputPin(LED_B_GPIO_Port, LED_B_Pin); @@ -410,31 +317,6 @@ int main(void) /* Reset the TIM21 Elapsed Period Flag */ tim21_elapsed_period = 0; } - /* TEST START */ - - //LL_LPUART_TransmitData9(LPUART1, 0x69); - //LL_mDelay(250); - /* TODO: DELETE TEST */ - - /* RS485 test */ - /*LL_LPUART_SetDESignalPolarity(LPUART1, 1); - LL_LPUART_TransmitData8(LPUART1, uart_data_dummy); - uart_data_dummy++;*/ - - /* SHT41 measurement */ - /*sht4x_measure(&T_SHT4x, &RH_SHT4x); - LL_mDelay(10);*/ - - /* SCD4x measurement */ - /*scd4x_read_measurement(&CO2, &T_SCD4x, &RH_SCD4x); - LL_mDelay(10);*/ - - /* SPS30 measurement*/ - /*sps30_read_measured_values(sps30_measured_data, 10);*/ - - /* SLEEP */ - /*LL_mDelay(1000);*/ - /* TEST END */ /* USER CODE END WHILE */ @@ -608,7 +490,7 @@ static void MX_LPUART1_UART_Init(void) /* USER CODE BEGIN LPUART1_Init 1 */ /* USER CODE END LPUART1_Init 1 */ - LPUART_InitStruct.BaudRate = 19200; + LPUART_InitStruct.BaudRate = baudrates[sensor_config.baudrate_index]; LPUART_InitStruct.DataWidth = LL_LPUART_DATAWIDTH_9B; LPUART_InitStruct.StopBits = LL_LPUART_STOPBITS_1; LPUART_InitStruct.Parity = LL_LPUART_PARITY_EVEN; @@ -732,6 +614,168 @@ void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint8_t buffer_tx_len) __enable_irq(); } +int8_t modbus_slave_callback(modbus_transaction_t *transaction) +{ + uint16_t register_number = transaction->register_number; + switch (transaction->function_code) + { + case MODBUS_READ_INPUT_REGISTERS: + for (int i = 0; i < transaction->register_count; i++, register_number++) + { + switch (register_number) + { + case REGISTER_NUM_CO2: + transaction->input_registers[i] = (uint16_t)CO2; + break; + case REGISTER_NUM_T_SHT4x: + transaction->input_registers[i] = (uint16_t)T_SHT4x; + break; + case REGISTER_NUM_RH_SHT4x: + transaction->input_registers[i] = (uint16_t)RH_SHT4x; + break; + case REGISTER_NUM_T_SCD4x: + transaction->input_registers[i] = (uint16_t)T_SCD4x; + break; + case REGISTER_NUM_RH_SCD4x: + transaction->input_registers[i] = (uint16_t)RH_SCD4x; + break; + case REGISTER_NUM_T_SHT4x_SIGNED: + transaction->input_registers_signed[i] = (int16_t)T_SHT4x; + break; + case REGISTER_NUM_T_SCD4x_SIGNED: + transaction->input_registers_signed[i] = (int16_t)T_SCD4x; + break; + default: + return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; + } + } + return MODBUS_OK; + case MODBUS_READ_HOLDING_REGISTERS: + for (int i = 0; i < transaction->register_count; i++, register_number++) + { + switch (register_number) + { + case REGISTER_NUM_LED_ON: + transaction->holding_registers[i] = (uint16_t)(sensor_config.led_on); + break; + case REGISTER_NUM_LED_BRIGHTNESS: + transaction->holding_registers[i] = (uint16_t)(sensor_config.led_brightness); + break; + case REGISTER_NUM_LED_SMOOTH: + transaction->holding_registers[i] = (uint16_t)(sensor_config.led_smooth); + break; + case REGISTER_NUM_CO2_ALERT_LIMIT1: + transaction->holding_registers[i] = (uint16_t)(sensor_config.led_co2_alert_limit1); + break; + case REGISTER_NUM_CO2_ALERT_LIMIT2: + transaction->holding_registers[i] = (uint16_t)(sensor_config.led_co2_alert_limit2); + break; + case REGISTER_NUM_SCD4x_T_OFFSET: + transaction->holding_registers[i] = (uint16_t)(sensor_config.scd4x_t_offset); + break; + case REGISTER_NUM_MODBUS_ADDR: + transaction->holding_registers[i] = (uint16_t)(sensor_config.modbus_addr); + break; + case REGISTER_NUM_BAUDRATE: + transaction->holding_registers[i] = (uint16_t)(sensor_config.baudrate_index); + break; + default: + return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; + } + } + return MODBUS_OK; + case MODBUS_WRITE_SINGLE_REGISTER: + switch (register_number) + { + case REGISTER_NUM_LED_ON: + sensor_config.led_on = (uint8_t) transaction->holding_registers[0]; + break; + case REGISTER_NUM_LED_BRIGHTNESS: + sensor_config.led_brightness = (uint16_t) transaction->holding_registers[0]; + break; + case REGISTER_NUM_LED_SMOOTH: + sensor_config.led_smooth = (uint16_t) transaction->holding_registers[0]; + break; + case REGISTER_NUM_CO2_ALERT_LIMIT1: + sensor_config.led_co2_alert_limit1 = (uint16_t) transaction->holding_registers[0]; + break; + case REGISTER_NUM_CO2_ALERT_LIMIT2: + sensor_config.led_co2_alert_limit2 = (uint16_t) transaction->holding_registers[0]; + break; + case REGISTER_NUM_SCD4x_T_OFFSET: + sensor_config.scd4x_t_offset = (int16_t) transaction->holding_registers[0]; + break; + case REGISTER_NUM_MODBUS_ADDR: + sensor_config.modbus_addr = (uint16_t) transaction->holding_registers[0]; + break; + case REGISTER_NUM_BAUDRATE: + if (transaction->holding_registers[0] < baudrates_length) + { + sensor_config.baudrate_index = (uint16_t) (transaction->holding_registers[0]); + baudrate_changed = 1; + } + break; + default: + return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; + } + /* TODO: Set modbus address on change */ + /* TODO: Set UART baudrate on change */ + config_write(&sensor_config); + return MODBUS_OK; + case MODBUS_WRITE_MULTIPLE_REGISTERS: + for (int i = 0; i < transaction->register_count; i++, register_number++) + { + switch (register_number) + { + case REGISTER_NUM_LED_ON: + sensor_config.led_on = (uint8_t) transaction->holding_registers[i]; + break; + case REGISTER_NUM_LED_BRIGHTNESS: + sensor_config.led_brightness = (uint16_t) transaction->holding_registers[i]; + break; + case REGISTER_NUM_LED_SMOOTH: + sensor_config.led_smooth = (uint16_t) transaction->holding_registers[i]; + break; + case REGISTER_NUM_CO2_ALERT_LIMIT1: + sensor_config.led_co2_alert_limit1 = (uint16_t) transaction->holding_registers[i]; + break; + case REGISTER_NUM_CO2_ALERT_LIMIT2: + sensor_config.led_co2_alert_limit2 = (uint16_t) transaction->holding_registers[i]; + break; + case REGISTER_NUM_SCD4x_T_OFFSET: + sensor_config.scd4x_t_offset = (int16_t) transaction->holding_registers[i]; + break; + case REGISTER_NUM_MODBUS_ADDR: + sensor_config.modbus_addr = (uint16_t) transaction->holding_registers[i]; + break; + case REGISTER_NUM_BAUDRATE: + if (transaction->holding_registers[0] < baudrates_length) + { + sensor_config.baudrate_index = (uint16_t) (transaction->holding_registers[i]); + baudrate_changed = 1; + } + break; + default: + return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; + } + } + /* TODO: Set modbus address on change */ + /* TODO: Set UART baudrate on change */ + config_write(&sensor_config); + return MODBUS_OK; + default: + return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; + } + /* Catch-all error */ + return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; /* nothing implemented yet! TODO */ +} + +int8_t modbus_transmit_function(uint8_t *buffer, int data_len) +{ + /* TODO */ + LPUART1_TX_Buffer(buffer, data_len); + return MODBUS_OK; +} /* USER CODE END 4 */ /**