Added variable baudrates functionality. NOT TESTED.
This commit is contained in:
parent
daaab07912
commit
36e2597539
@ -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);
|
||||
|
||||
|
@ -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 */
|
||||
/* 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_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;
|
||||
}
|
||||
}
|
||||
|
@ -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 */
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user