2020-09-29 20:46:31 +00:00
|
|
|
/*
|
|
|
|
* rtu_getters.c
|
|
|
|
*
|
|
|
|
* Created on: 29.09.2020
|
|
|
|
* Author: mateusz
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include "station_config.h"
|
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
#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 "main.h"
|
2020-09-29 20:46:31 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
|
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
// the timestamp of last update of the register value
|
|
|
|
uint32_t last_update_timestam = 0;
|
|
|
|
|
2020-10-14 15:39:53 +00:00
|
|
|
#ifdef _MODBUS_RTU
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[0];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[1];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[2];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[3];
|
2020-09-29 20:46:31 +00:00
|
|
|
#else
|
|
|
|
#error "Wrong Modbus Configuration"
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
retval = MODBUS_RET_NOT_AVALIABLE;
|
2020-10-14 15:39:53 +00:00
|
|
|
#endif
|
2020-09-29 20:46:31 +00:00
|
|
|
#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
|
|
|
|
*out = (
|
|
|
|
scaling_a * (float)raw_register_value * (float)raw_register_value +
|
|
|
|
scaling_b * (float)raw_register_value +
|
|
|
|
scaling_c
|
|
|
|
) /
|
|
|
|
scaling_d;
|
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
// check when the value has been updated
|
|
|
|
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE) {
|
|
|
|
retval = MODBUS_RET_DEGRADED;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
retval = MODBUS_RET_OK;
|
|
|
|
}
|
|
|
|
|
2020-09-29 20:46:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
|
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
// the timestamp of last update of the register value
|
|
|
|
uint32_t last_update_timestam = 0;
|
|
|
|
|
2020-10-14 15:39:53 +00:00
|
|
|
#ifdef _MODBUS_RTU
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[0];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[1];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[2];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[3];
|
2020-09-29 20:46:31 +00:00
|
|
|
#else
|
|
|
|
#error "Wrong Modbus Configuration"
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
retval = MODBUS_RET_NOT_AVALIABLE;
|
2020-10-14 15:39:53 +00:00
|
|
|
#endif
|
2020-09-29 20:46:31 +00:00
|
|
|
#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
|
|
|
|
*out = (
|
|
|
|
scaling_a * (float)raw_register_value * (float)raw_register_value +
|
|
|
|
scaling_b * (float)raw_register_value +
|
|
|
|
scaling_c
|
|
|
|
) /
|
|
|
|
scaling_d;
|
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
// check when the value has been updated
|
|
|
|
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE) {
|
|
|
|
retval = MODBUS_RET_DEGRADED;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
retval = MODBUS_RET_OK;
|
|
|
|
}
|
2020-09-29 20:46:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
|
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
// the timestamp of last update of the register value
|
|
|
|
uint32_t last_update_timestam = 0;
|
|
|
|
|
2020-10-14 15:39:53 +00:00
|
|
|
#ifdef _MODBUS_RTU
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[0];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[1];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[2];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[3];
|
2020-09-29 20:46:31 +00:00
|
|
|
#else
|
|
|
|
#error "Wrong Modbus Configuration"
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
retval = MODBUS_RET_NOT_AVALIABLE;
|
2020-10-14 15:39:53 +00:00
|
|
|
#endif
|
2020-09-29 20:46:31 +00:00
|
|
|
#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
|
2020-10-11 20:14:41 +00:00
|
|
|
*out = (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;
|
2020-09-29 20:46:31 +00:00
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
// check when the value has been updated
|
|
|
|
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE) {
|
|
|
|
retval = MODBUS_RET_DEGRADED;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
retval = MODBUS_RET_OK;
|
|
|
|
}
|
2020-09-29 20:46:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
|
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
// the timestamp of last update of the register value
|
|
|
|
uint32_t last_update_timestam = 0;
|
|
|
|
|
2020-10-14 15:39:53 +00:00
|
|
|
#ifdef _MODBUS_RTU
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[0];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[1];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[2];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[3];
|
2020-09-29 20:46:31 +00:00
|
|
|
#else
|
|
|
|
#error "Wrong Modbus Configuration"
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
retval = MODBUS_RET_NOT_AVALIABLE;
|
2020-10-14 15:39:53 +00:00
|
|
|
#endif
|
2020-09-29 20:46:31 +00:00
|
|
|
#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
|
2020-10-11 20:14:41 +00:00
|
|
|
*out = (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);
|
2020-09-29 20:46:31 +00:00
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
// check when the value has been updated
|
|
|
|
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE) {
|
|
|
|
retval = MODBUS_RET_DEGRADED;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
retval = MODBUS_RET_OK;
|
|
|
|
}
|
2020-09-29 20:46:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t rtu_get_humidity(int8_t* out) {
|
|
|
|
|
|
|
|
int32_t retval = MODBUS_RET_UNINITIALIZED;
|
|
|
|
|
|
|
|
rtu_register_data_t* source = 0;
|
|
|
|
|
2020-10-11 20:14:41 +00:00
|
|
|
volatile uint16_t raw_register_value = 0;
|
2020-09-29 20:46:31 +00:00
|
|
|
|
|
|
|
uint16_t scaling_a, scaling_b, scaling_c, scaling_d;
|
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
// the timestamp of last update of the register value
|
|
|
|
uint32_t last_update_timestam = 0;
|
|
|
|
|
2020-10-14 15:39:53 +00:00
|
|
|
#ifdef _MODBUS_RTU
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[0];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[1];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[2];
|
2020-09-29 20:46:31 +00:00
|
|
|
#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;
|
2020-09-30 20:07:39 +00:00
|
|
|
last_update_timestam = rte_wx_rtu_pool_queue.last_call_to_function[3];
|
2020-09-29 20:46:31 +00:00
|
|
|
#else
|
|
|
|
#error "Wrong Modbus Configuration"
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
retval = MODBUS_RET_NOT_AVALIABLE;
|
2020-10-14 15:39:53 +00:00
|
|
|
#endif
|
2020-09-29 20:46:31 +00:00
|
|
|
#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
|
2020-10-11 20:14:41 +00:00
|
|
|
*out = (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);
|
2020-09-29 20:46:31 +00:00
|
|
|
|
2020-09-30 20:07:39 +00:00
|
|
|
// check when the value has been updated
|
|
|
|
if (main_get_master_time() - last_update_timestam > RTU_MAXIMUM_VALUE_AGE) {
|
|
|
|
retval = MODBUS_RET_DEGRADED;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
retval = MODBUS_RET_OK;
|
|
|
|
}
|
2020-09-29 20:46:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|