SP8EBC-ParaTNC/system/src/modbus_rtu/rtu_getters.c

646 wiersze
20 KiB
C

/*
* rtu_getters.c
*
* Created on: 29.09.2020
* Author: mateusz
*/
#include <stdio.h>
#include "station_config.h"
#include "modbus_rtu/rtu_getters.h"
#include "modbus_rtu/rtu_return_values.h"
#include "modbus_rtu/rtu_register_data_t.h"
#include "modbus_rtu/rtu_configuration.h"
#include "rte_wx.h"
#include "rte_rtu.h"
#include "main.h"
int32_t rtu_get_temperature(float* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
uint16_t raw_register_value = 0;
float physical_register_value = 0.0f;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
// the timestamp of last update of the register value
uint32_t last_update_timestam = 0;
#ifdef _MODBUS_RTU
#ifdef _RTU_SLAVE_TEMPERATURE_SOURCE
#if (_RTU_SLAVE_TEMPERATURE_SOURCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[0];
#elif (_RTU_SLAVE_TEMPERATURE_SOURCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[1];
#elif (_RTU_SLAVE_TEMPERATURE_SOURCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[2];
#elif (_RTU_SLAVE_TEMPERATURE_SOURCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[3];
#elif (_RTU_SLAVE_TEMPERATURE_SOURCE == 5)
source = &RTU_GETTERS_F5_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_5;
scaling_b = _RTU_SLAVE_SCALING_B_5;
scaling_c = _RTU_SLAVE_SCALING_C_5;
scaling_d = _RTU_SLAVE_SCALING_D_5;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[4];
#elif (_RTU_SLAVE_TEMPERATURE_SOURCE == 6)
source = &RTU_GETTERS_F6_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_6;
scaling_b = _RTU_SLAVE_SCALING_B_6;
scaling_c = _RTU_SLAVE_SCALING_C_6;
scaling_d = _RTU_SLAVE_SCALING_D_6;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[5];
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_CONFIGURED;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value in degrees C
physical_register_value = (
scaling_a * (float)raw_register_value * (float)raw_register_value +
scaling_b * (float)raw_register_value +
scaling_c
) /
scaling_d;
// check when the value has been updated
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE ||
physical_register_value < RTU_MIN_VALID_TEMPERATURE ||
physical_register_value > RTU_MAX_VALID_TEMPERATURE) {
retval = MODBUS_RET_NOT_AVALIABLE;
}
else {
if (main_get_master_time() - rte_rtu_last_modbus_rx_error_timestamp < RTU_MAXIMUM_VALUE_AGE) {
retval = MODBUS_RET_DEGRADED;
}
else {
retval = MODBUS_RET_OK;
}
*out = physical_register_value;
}
}
#endif
return retval;
}
int32_t rtu_get_pressure(float* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
uint16_t raw_register_value = 0;
float physical_register_value = 0.0f;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
// the timestamp of last update of the register value
uint32_t last_update_timestam = 0;
#ifdef _MODBUS_RTU
#ifdef _RTU_SLAVE_PRESSURE_SOURCE
#if (_RTU_SLAVE_PRESSURE_SOURCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[0];
#elif (_RTU_SLAVE_PRESSURE_SOURCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[1];
#elif (_RTU_SLAVE_PRESSURE_SOURCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[2];
#elif (_RTU_SLAVE_PRESSURE_SOURCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[3];
#elif (_RTU_SLAVE_PRESSURE_SOURCE == 5)
source = &RTU_GETTERS_F5_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_5;
scaling_b = _RTU_SLAVE_SCALING_B_5;
scaling_c = _RTU_SLAVE_SCALING_C_5;
scaling_d = _RTU_SLAVE_SCALING_D_5;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[4];
#elif (_RTU_SLAVE_PRESSURE_SOURCE == 6)
source = &RTU_GETTERS_F6_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_6;
scaling_b = _RTU_SLAVE_SCALING_B_6;
scaling_c = _RTU_SLAVE_SCALING_C_6;
scaling_d = _RTU_SLAVE_SCALING_D_6;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[5];
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_CONFIGURED;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value in degrees C
physical_register_value = (
scaling_a * (float)raw_register_value * (float)raw_register_value +
scaling_b * (float)raw_register_value +
scaling_c
) /
scaling_d;
// check when the value has been updated
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE ||
physical_register_value < RTU_MIN_VALID_PRESSURE ||
physical_register_value > RTU_MAX_VALID_PRESSURE) {
retval = MODBUS_RET_NOT_AVALIABLE;
}
else {
if (main_get_master_time() - rte_rtu_last_modbus_rx_error_timestamp < RTU_MAXIMUM_VALUE_AGE) {
retval = MODBUS_RET_DEGRADED;
}
else {
retval = MODBUS_RET_OK;
}
*out = physical_register_value;
}
}
#endif
return retval;
}
int32_t rtu_get_wind_direction(uint16_t* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
uint16_t raw_register_value = 0, physical_register_value = 0;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
// the timestamp of last update of the register value
uint32_t last_update_timestam = 0;
#ifdef _MODBUS_RTU
#ifdef _RTU_SLAVE_WIND_DIRECTION_SORUCE
#if (_RTU_SLAVE_WIND_DIRECTION_SORUCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[0];
#elif (_RTU_SLAVE_WIND_DIRECTION_SORUCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[1];
#elif (_RTU_SLAVE_WIND_DIRECTION_SORUCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[2];
#elif (_RTU_SLAVE_WIND_DIRECTION_SORUCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[3];
#elif (_RTU_SLAVE_WIND_DIRECTION_SORUCE == 5)
source = &RTU_GETTERS_F5_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_5;
scaling_b = _RTU_SLAVE_SCALING_B_5;
scaling_c = _RTU_SLAVE_SCALING_C_5;
scaling_d = _RTU_SLAVE_SCALING_D_5;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[4];
#elif (_RTU_SLAVE_WIND_DIRECTION_SORUCE == 6)
source = &RTU_GETTERS_F6_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_6;
scaling_b = _RTU_SLAVE_SCALING_B_6;
scaling_c = _RTU_SLAVE_SCALING_C_6;
scaling_d = _RTU_SLAVE_SCALING_D_6;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[5];
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_CONFIGURED;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value
physical_register_value = (uint16_t)(
scaling_a * (uint16_t)raw_register_value * (uint16_t)raw_register_value +
scaling_b * (uint16_t)raw_register_value +
scaling_c
) /
scaling_d;
// check when the value has been updated
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE ||
physical_register_value > 360) {
retval = MODBUS_RET_NOT_AVALIABLE;
}
else {
if (main_get_master_time() - rte_rtu_last_modbus_rx_error_timestamp < RTU_MAXIMUM_VALUE_AGE) {
retval = MODBUS_RET_DEGRADED;
}
else {
retval = MODBUS_RET_OK;
}
*out = physical_register_value;
}
}
#endif
return retval;
}
int32_t rtu_get_wind_speed(uint16_t* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
uint16_t raw_register_value = 0, physical_register_value = 0;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
// the timestamp of last update of the register value
uint32_t last_update_timestam = 0;
#ifdef _MODBUS_RTU
#ifdef _RTU_SLAVE_WIND_SPEED_SOURCE
#if (_RTU_SLAVE_WIND_SPEED_SOURCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[0];
#elif (_RTU_SLAVE_WIND_SPEED_SOURCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[1];
#elif (_RTU_SLAVE_WIND_SPEED_SOURCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[2];
#elif (_RTU_SLAVE_WIND_SPEED_SOURCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[3];
#elif (_RTU_SLAVE_WIND_SPEED_SOURCE == 5)
source = &RTU_GETTERS_F5_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_5;
scaling_b = _RTU_SLAVE_SCALING_B_5;
scaling_c = _RTU_SLAVE_SCALING_C_5;
scaling_d = _RTU_SLAVE_SCALING_D_5;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[4];
#elif (_RTU_SLAVE_WIND_SPEED_SOURCE == 6)
source = &RTU_GETTERS_F6_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_6;
scaling_b = _RTU_SLAVE_SCALING_B_6;
scaling_c = _RTU_SLAVE_SCALING_C_6;
scaling_d = _RTU_SLAVE_SCALING_D_6;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[5];
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_CONFIGURED;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value in .1m/s incremenets
physical_register_value = (uint16_t) (10 * (
scaling_a * (uint16_t)raw_register_value * (uint16_t)raw_register_value +
scaling_b * (uint16_t)raw_register_value +
scaling_c
) /
scaling_d);
// check when the value has been updated
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE ||
physical_register_value > RTU_MAX_VALID_WINDSPEED) {
retval = MODBUS_RET_NOT_AVALIABLE;
}
else {
if (main_get_master_time() - rte_rtu_last_modbus_rx_error_timestamp < RTU_MAXIMUM_VALUE_AGE) {
retval = MODBUS_RET_DEGRADED;
}
else {
retval = MODBUS_RET_OK;
}
*out = physical_register_value;
}
}
#endif
return retval;
}
int32_t rtu_get_wind_gusts(uint16_t* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
uint16_t raw_register_value = 0, physical_register_value = 0;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
// the timestamp of last update of the register value
uint32_t last_update_timestam = 0;
#ifdef _MODBUS_RTU
#ifdef _RTU_SLAVE_WIND_GUSTS_SOURCE
#if (_RTU_SLAVE_WIND_GUSTS_SOURCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[0];
#elif (_RTU_SLAVE_WIND_GUSTS_SOURCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[1];
#elif (_RTU_SLAVE_WIND_GUSTS_SOURCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[2];
#elif (_RTU_SLAVE_WIND_GUSTS_SOURCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[3];
#elif (_RTU_SLAVE_WIND_GUSTS_SOURCE == 5)
source = &RTU_GETTERS_F5_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_5;
scaling_b = _RTU_SLAVE_SCALING_B_5;
scaling_c = _RTU_SLAVE_SCALING_C_5;
scaling_d = _RTU_SLAVE_SCALING_D_5;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[4];
#elif (_RTU_SLAVE_WIND_GUSTS_SOURCE == 6)
source = &RTU_GETTERS_F6_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_6;
scaling_b = _RTU_SLAVE_SCALING_B_6;
scaling_c = _RTU_SLAVE_SCALING_C_6;
scaling_d = _RTU_SLAVE_SCALING_D_6;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[5];
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_CONFIGURED;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value in .1m/s incremenets
physical_register_value = (uint16_t) (10 * (
scaling_a * (uint16_t)raw_register_value * (uint16_t)raw_register_value +
scaling_b * (uint16_t)raw_register_value +
scaling_c
) /
scaling_d);
// check when the value has been updated
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE ||
physical_register_value > RTU_MAX_VALID_WINDSPEED) {
retval = MODBUS_RET_NOT_AVALIABLE;
}
else {
if (main_get_master_time() - rte_rtu_last_modbus_rx_error_timestamp < RTU_MAXIMUM_VALUE_AGE) {
retval = MODBUS_RET_DEGRADED;
}
else {
retval = MODBUS_RET_OK;
}
*out = physical_register_value;
}
}
#endif
return retval;
}
int32_t rtu_get_humidity(int8_t* out) {
int32_t retval = MODBUS_RET_UNINITIALIZED;
rtu_register_data_t* source = 0;
volatile uint16_t raw_register_value = 0;
int8_t physical_register_value = 0;
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
// the timestamp of last update of the register value
uint32_t last_update_timestam = 0;
#ifdef _MODBUS_RTU
#ifdef _RTU_SLAVE_HUMIDITY_SOURCE
#if (_RTU_SLAVE_HUMIDITY_SOURCE == 1)
source = &RTU_GETTERS_F1_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_1;
scaling_b = _RTU_SLAVE_SCALING_B_1;
scaling_c = _RTU_SLAVE_SCALING_C_1;
scaling_d = _RTU_SLAVE_SCALING_D_1;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[0];
#elif (_RTU_SLAVE_HUMIDITY_SOURCE == 2)
source = &RTU_GETTERS_F2_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_2;
scaling_b = _RTU_SLAVE_SCALING_B_2;
scaling_c = _RTU_SLAVE_SCALING_C_2;
scaling_d = _RTU_SLAVE_SCALING_D_2;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[1];
#elif (_RTU_SLAVE_HUMIDITY_SOURCE == 3)
source = &RTU_GETTERS_F3_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_3;
scaling_b = _RTU_SLAVE_SCALING_B_3;
scaling_c = _RTU_SLAVE_SCALING_C_3;
scaling_d = _RTU_SLAVE_SCALING_D_3;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[2];
#elif (_RTU_SLAVE_HUMIDITY_SOURCE == 4)
source = &RTU_GETTERS_F4_NAME;
scaling_a = _RTU_SLAVE_SCALING_A_4;
scaling_b = _RTU_SLAVE_SCALING_B_4;
scaling_c = _RTU_SLAVE_SCALING_C_4;
scaling_d = _RTU_SLAVE_SCALING_D_4;
last_update_timestam = rte_rtu_pool_queue.last_successfull_call_to_function[3];
#else
#error "Wrong Modbus Configuration"
#endif
#else
retval = MODBUS_RET_NOT_CONFIGURED;
#endif
if (retval == MODBUS_RET_UNINITIALIZED && source != 0) {
// copy the raw value from modbus register data
raw_register_value = source->registers_values[0];
// rescale the raw value to target value in percents
physical_register_value = (int8_t) (
scaling_a * (uint16_t)raw_register_value * (uint16_t)raw_register_value +
scaling_b * (uint16_t)raw_register_value +
scaling_c
/
scaling_d);
// check when the value has been updated
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE ||
physical_register_value > 99 || physical_register_value < 0) {
retval = MODBUS_RET_NOT_AVALIABLE;
}
else {
if (main_get_master_time() - rte_rtu_last_modbus_rx_error_timestamp < RTU_MAXIMUM_VALUE_AGE) {
retval = MODBUS_RET_DEGRADED;
}
else {
retval = MODBUS_RET_OK;
}
*out = physical_register_value;
}
}
#endif
return retval;
}
void rtu_get_raw_values_string(char* out, uint16_t out_buffer_ln, uint8_t* generated_string_ln) {
uint16_t f1_value = 0;
uint16_t f2_value = 0;
uint16_t f3_value = 0;
uint16_t f4_value = 0;
uint16_t f5_value = 0;
uint16_t f6_value = 0;
int string_ln = 0;
#ifdef _MODBUS_RTU
#if defined(_RTU_SLAVE_ID_1)
f1_value = RTU_GETTERS_F1_NAME.registers_values[0];
#endif
#if defined(_RTU_SLAVE_ID_2)
f2_value = RTU_GETTERS_F2_NAME.registers_values[0];
#endif
#if defined(_RTU_SLAVE_ID_3)
f3_value = RTU_GETTERS_F3_NAME.registers_values[0];
#endif
#if defined(_RTU_SLAVE_ID_4)
f4_value = RTU_GETTERS_F4_NAME.registers_values[0];
#endif
#if defined(_RTU_SLAVE_ID_5)
f5_value = RTU_GETTERS_F5_NAME.registers_values[0];
#endif
#if defined(_RTU_SLAVE_ID_6)
f6_value = RTU_GETTERS_F6_NAME.registers_values[0];
#endif
#endif
string_ln = snprintf(out, out_buffer_ln, ">F1V %X, F2V %X, F3V %X, F4V %X, F5V %X, F6V %X",
(int) f1_value,
(int) f2_value,
(int) f3_value,
(int) f4_value,
(int) f5_value,
(int) f6_value);
*generated_string_ln = (uint8_t)string_ln;
}