From 3c44e7e0d13204351a61d802cd0896d90afb21b4 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Sun, 9 Apr 2023 19:30:09 +0200 Subject: [PATCH] conditional compilation of nvm logger using platform depends defines, loading battery scaling from configuration --- .../ParaMETEO-STM32L476RG.launch | 4 +- ...-HW-RevCplus-gerber-schematic-partlist.zip | Bin 19401393 -> 19399458 bytes include/config_data.h | 4 ++ include/configuration_handler.h | 4 ++ include/etc/io_default_vbat_scaling.h | 16 ++++++ include/io.h | 3 +- include/kiss_communication.h | 26 ---------- include/kiss_communication_service_ids.h | 47 +++++++++++++++++ include/main.h | 2 +- src/config_data_default.c | 8 ++- src/config_data_first.c | 8 ++- src/config_data_second.c | 8 ++- src/configuration_handler.c | 49 +++++++++++++++--- src/kiss_callback.c | 1 + src/kiss_communication.c | 2 +- src/main.c | 5 +- src/packet_tx_handler.c | 2 + src/wx_handler_humidity.c | 5 +- src/wx_handler_pressure.c | 28 +++++----- 19 files changed, 159 insertions(+), 63 deletions(-) create mode 100644 include/etc/io_default_vbat_scaling.h create mode 100644 include/kiss_communication_service_ids.h diff --git a/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch b/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch index 6dc4206..ab475ab 100644 --- a/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch +++ b/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch @@ -1,6 +1,6 @@ - + @@ -57,6 +57,6 @@ - + diff --git a/hardware/ParaTNC-HW-RevCplus-gerber-schematic-partlist.zip b/hardware/ParaTNC-HW-RevCplus-gerber-schematic-partlist.zip index 15b65d40d175cdb918595ace2e594e47003a345b..f8c12b9aa8c17e0b3114a04f048d2079e239067d 100644 GIT binary patch delta 27505 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 z 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 delta 29558 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 Oga`(<`8s2Pf&D-2@pFd& diff --git a/include/config_data.h b/include/config_data.h index dd0fb37..c3f3c20 100644 --- a/include/config_data.h +++ b/include/config_data.h @@ -164,6 +164,10 @@ typedef struct __attribute__((aligned (4))) config_data_basic_t { */ uint8_t engineering2; + uint16_t battery_scalling_a; + + uint16_t battery_scalling_b; + } config_data_basic_t; typedef enum config_data_wx_sources_enum_t { diff --git a/include/configuration_handler.h b/include/configuration_handler.h index 5f5aed5..a7dd269 100644 --- a/include/configuration_handler.h +++ b/include/configuration_handler.h @@ -43,4 +43,8 @@ int configuration_get_early_tx_assert(void); int configuration_get_power_cycle_vbat_r(void); int configuration_get_reboot_after_24_hours(void); +uint16_t configuration_get_vbat_a_coeff(void); +uint16_t configuration_get_vbat_b_coeff(void); + + #endif /* CONFIGURATION_HANDLER_H_ */ diff --git a/include/etc/io_default_vbat_scaling.h b/include/etc/io_default_vbat_scaling.h new file mode 100644 index 0000000..c3f018d --- /dev/null +++ b/include/etc/io_default_vbat_scaling.h @@ -0,0 +1,16 @@ +/* + * io_default_vbat_scaling.h + * + * Created on: Apr 9, 2023 + * Author: mateusz + */ + +#ifndef IO_DEFAULT_VBAT_SCALING_H_ +#define IO_DEFAULT_VBAT_SCALING_H_ + +#define VBAT_MEAS_A_COEFF 1000 +#define VBAT_MEAS_B_COEFF 95 + + + +#endif /* IO_DEFAULT_VBAT_SCALING_H_ */ diff --git a/include/io.h b/include/io.h index 41fc7b3..8f2fc48 100644 --- a/include/io.h +++ b/include/io.h @@ -42,8 +42,7 @@ void io_vbat_meas_enable(void); void io_pool_vbat_r(int16_t minutes_to_wx); #endif -#define VBAT_MEAS_A_COEFF 1200 -#define VBAT_MEAS_B_COEFF 40 + /** * Keep this uncommented to configure ADC which monitor Vbatt to diff --git a/include/kiss_communication.h b/include/kiss_communication.h index 4c57750..862c93f 100644 --- a/include/kiss_communication.h +++ b/include/kiss_communication.h @@ -25,33 +25,7 @@ #define NONSTANDARD (uint8_t)0x0F -#define KISS_DATA (uint8_t) 0x00 -#define KISS_GET_RUNNING_CONFIG (uint8_t) 0x20 -#define KISS_RUNNING_CONFIG (uint8_t) 0x70 - -#define KISS_GET_VERSION_AND_ID (uint8_t) 0x21 -#define KISS_VERSION_AND_ID (uint8_t) 0x71 - -#define KISS_ERASE_STARTUP_CFG (uint8_t) 0x22 -#define KISS_ERASE_STARTUP_CFG_RESP (uint8_t) 0x72 - -#define KISS_PROGRAM_STARTUP_CFG (uint8_t) 0x23 -#define KISS_PROGRAM_STARTUP_CFG_RESP (uint8_t) 0x73 - -#define KISS_CONFIG_CRC (uint8_t) 0x24 -#define KISS_CONFIG_CRC_RESP (uint8_t) 0x74 - -#define KISS_RESTART (uint8_t) 0x25 -#define KISS_RESTART_RESP (uint8_t) 0x75 - -#define KISS_TOGGLE_PTT (uint8_t) 0x26 -//#define KISS_RESTART_RESP (uint8_t) 0x76 - -#define KISS_CONTROL_VOLTAGE (uint8_t) 0x27 -#define KISS_CONTROL_VOLTAGE_RESP (uint8_t) 0x77 - -#define KISS_RETURN_IDLE 1 extern uint8_t kiss_current_async_message; diff --git a/include/kiss_communication_service_ids.h b/include/kiss_communication_service_ids.h new file mode 100644 index 0000000..f2fb853 --- /dev/null +++ b/include/kiss_communication_service_ids.h @@ -0,0 +1,47 @@ +/* + * kiss_communication_service_ids.h + * + * Created on: Apr 9, 2023 + * Author: mateusz + */ + +#ifndef KISS_COMMUNICATION_SERVICE_IDS_H_ +#define KISS_COMMUNICATION_SERVICE_IDS_H_ + + +#define KISS_DATA (uint8_t) 0x00 + +#define KISS_RESTART (uint8_t) 0x11 +#define KISS_RESTART_RESP (uint8_t) 0x51 + +#define KISS_GET_VERSION_AND_ID (uint8_t) 0x21 +#define KISS_VERSION_AND_ID (uint8_t) 0x61 + +#define KISS_READ_DID (uint8_t) 0x22 +#define KISS_READ_DID_RESP (uint8_t) 0x62 + +#define KISS_READ_MEM_ADDR (uint8_t) 0x23 +#define KISS_READ_MEM_ADDR_RESP (uint8_t) 0x63 + +#define KISS_PROGRAM_STARTUP_CFG (uint8_t) 0x34 +#define KISS_PROGRAM_STARTUP_CFG_RESP (uint8_t) 0x74 + +#define KISS_GET_RUNNING_CONFIG (uint8_t) 0x35 +#define KISS_RUNNING_CONFIG (uint8_t) 0x75 + +#define KISS_ERASE_STARTUP_CFG (uint8_t) 0x37 +#define KISS_ERASE_STARTUP_CFG_RESP (uint8_t) 0x77 + +//#define KISS_CONFIG_CRC (uint8_t) 0x24 +//#define KISS_CONFIG_CRC_RESP (uint8_t) 0x74 + +//#define KISS_TOGGLE_PTT (uint8_t) 0x26 +//#define KISS_RESTART_RESP (uint8_t) 0x76 + +//#define KISS_CONTROL_VOLTAGE (uint8_t) 0x27 +//#define KISS_CONTROL_VOLTAGE_RESP (uint8_t) 0x77 + +#define KISS_RETURN_IDLE 1 + + +#endif /* KISS_COMMUNICATION_SERVICE_IDS_H_ */ diff --git a/include/main.h b/include/main.h index b262fde..d12d724 100644 --- a/include/main.h +++ b/include/main.h @@ -8,7 +8,7 @@ #include "config_data.h" #define SW_VER "EA20" -#define SW_DATE "18022023" +#define SW_DATE "09042023" #define SW_KISS_PROTO "A" #define SYSTICK_TICKS_PER_SECONDS 100 diff --git a/src/config_data_default.c b/src/config_data_default.c index 343c181..bae7f39 100644 --- a/src/config_data_default.c +++ b/src/config_data_default.c @@ -10,6 +10,7 @@ // reprogram it from the default set stored somewhere within .code section #include "config_data.h" +#include "io_default_vbat_scaling.h" #include "station_config.h" @@ -212,10 +213,13 @@ const config_data_basic_t __attribute__((section(".config_section_default.basic" #endif #ifdef ENG2 - .engineering2 = ENG2 + .engineering2 = ENG2, #else - .engineering2 = 0 + .engineering2 = 0, #endif + + .battery_scalling_a = VBAT_MEAS_A_COEFF, + .battery_scalling_b = VBAT_MEAS_B_COEFF }; /** diff --git a/src/config_data_first.c b/src/config_data_first.c index c696156..b2766f7 100644 --- a/src/config_data_first.c +++ b/src/config_data_first.c @@ -11,6 +11,7 @@ */ #include "config_data.h" +#include "io_default_vbat_scaling.h" #include "station_config.h" @@ -205,10 +206,13 @@ const config_data_basic_t __attribute__((section(".config_section_first.basic")) #endif #ifdef ENG1 - .engineering1 = ENG1 + .engineering1 = ENG1, #else - .engineering1 = 0xFF + .engineering1 = 0xFF, #endif + + .battery_scalling_a = VBAT_MEAS_A_COEFF, + .battery_scalling_b = VBAT_MEAS_B_COEFF }; /** diff --git a/src/config_data_second.c b/src/config_data_second.c index 7d498f1..0caddb9 100644 --- a/src/config_data_second.c +++ b/src/config_data_second.c @@ -6,6 +6,7 @@ */ #include "config_data.h" +#include "io_default_vbat_scaling.h" #include "station_config.h" @@ -199,10 +200,13 @@ const config_data_basic_t __attribute__((section(".config_section_second.basic") #endif #ifdef ENG1 - .engineering1 = ENG1 + .engineering1 = ENG1, #else - .engineering1 = 0xFF + .engineering1 = 0xFF, #endif + + .battery_scalling_a = VBAT_MEAS_A_COEFF, + .battery_scalling_b = VBAT_MEAS_B_COEFF }; /** diff --git a/src/configuration_handler.c b/src/configuration_handler.c index 717d80c..adcfb8b 100644 --- a/src/configuration_handler.c +++ b/src/configuration_handler.c @@ -11,6 +11,8 @@ #include "config_data.h" #include "config_data_externs.h" +#include "io_default_vbat_scaling.h" + #include "main.h" #ifdef STM32F10X_MD_VL @@ -41,13 +43,13 @@ #define CONFIG_SECTION_DEFAULT_START 0x0801E000 #define CONFIG_MODE_PGM_CNTR 0x0 -#define CONFIG_MODE_OFSET 0x20 // Current size: 0x10, free: 0x10 -#define CONFIG_BASIC_OFFSET 0x40 // Current size: 0x9D, free: 0x43 -#define CONFIG_SOURCES_OFFSET 0x120 // Current size: 0x4, free: 0x1C -#define CONFIG_UMB_OFFSET 0x140 // Current size: 0x12, free: 0xE -#define CONFIG_RTU_OFFSET 0x160 // Current size: 0x54, free: 0x4C -#define CONFIG_GSM_OFFSET 0x200 // Current size: 0xF8, -#define CONFIG__END__OFFSET 0x300 +#define CONFIG_MODE_OFSET 0x20 // Current size: 0x14, free: 0x0C +#define CONFIG_BASIC_OFFSET 0x40 // Current size: 0xA4, free: 0x3C +#define CONFIG_SOURCES_OFFSET 0x120 // Current size: 0x8, free: 0x18 +#define CONFIG_UMB_OFFSET 0x140 // Current size: 0x10, free: 0x10 +#define CONFIG_RTU_OFFSET 0x160 // Current size: 0x10, free: 0x90 +#define CONFIG_GSM_OFFSET 0x200 // Current size: 0x114, +#define CONFIG__END__OFFSET 0x7E0 #include @@ -863,3 +865,36 @@ int configuration_get_reboot_after_24_hours(void) { return out; } + +uint16_t configuration_get_vbat_a_coeff(void) { + + uint16_t out = 0; + + // get coefficient stored into flash memory + out = main_config_data_basic->battery_scalling_a; + + // check if it is set to non default value + if (out == 0x00 || out == 0xFF) { + // revert back to hardcoded value + out = VBAT_MEAS_A_COEFF; + } + + return out; +} + + +uint16_t configuration_get_vbat_b_coeff(void) { + + uint16_t out = 0; + + // get coefficient stored into flash memory + out = main_config_data_basic->battery_scalling_b; + + // check if it is set to non default value + if (out == 0x00 || out == 0xFF) { + // revert back to hardcoded value + out = VBAT_MEAS_B_COEFF; + } + + return out; +} diff --git a/src/kiss_callback.c b/src/kiss_callback.c index 6246d1a..e730215 100644 --- a/src/kiss_callback.c +++ b/src/kiss_callback.c @@ -6,6 +6,7 @@ */ #include "kiss_communication.h" +#include "kiss_communication_service_ids.h" #include "configuration_handler.h" #include "main.h" diff --git a/src/kiss_communication.c b/src/kiss_communication.c index 3f1a215..ca54030 100644 --- a/src/kiss_communication.c +++ b/src/kiss_communication.c @@ -7,7 +7,7 @@ #include #include "kiss_callback.h" - +#include "kiss_communication_service_ids.h" #include "main.h" #include "config_data_externs.h" diff --git a/src/main.c b/src/main.c index e30284e..f9bf6d9 100644 --- a/src/main.c +++ b/src/main.c @@ -52,6 +52,7 @@ #include "float_to_string.h" #include "pwr_save.h" #include +#include "io_default_vbat_scaling.h" #include "it_handlers.h" @@ -557,7 +558,7 @@ int main(int argc, char* argv[]){ pwr_save_init(main_config_data_mode->powersave); // initialize B+ measurement - io_vbat_meas_init(VBAT_MEAS_A_COEFF, VBAT_MEAS_B_COEFF); + io_vbat_meas_init(configuration_get_vbat_a_coeff(), configuration_get_vbat_b_coeff()); #endif // initalizing separated Open Collector output @@ -1494,9 +1495,11 @@ int main(int argc, char* argv[]){ wx_pwr_switch_periodic_handle(); } +#ifdef PARAMETEO if (configuration_get_power_cycle_vbat_r() == 1 && !main_afsk.sending) { io_pool_vbat_r(packet_tx_get_minutes_to_next_wx()); } +#endif wx_check_force_i2c_reset(); diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index 97dbdb0..7290520 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -236,6 +236,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con // check if there is a time to send meteo packet through RF if (packet_tx_meteo_counter >= packet_tx_meteo_interval && packet_tx_meteo_interval != 0) { +#ifdef STM32L471xx if (config_mode->nvm_logger != 0) { packet_tx_nvm.temperature_humidity = wx_get_nvm_record_temperature(); packet_tx_nvm.wind = wx_get_nvm_record_wind(); @@ -244,6 +245,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con // write to NVM if it is enabled nvm_measurement_store(&packet_tx_nvm); } +#endif // this function is required if more than one RF frame will be send from this function at once // it waits for transmission completion and add some delay to let digipeaters do theris job diff --git a/src/wx_handler_humidity.c b/src/wx_handler_humidity.c index f89fa88..de8e3ad 100644 --- a/src/wx_handler_humidity.c +++ b/src/wx_handler_humidity.c @@ -56,9 +56,8 @@ int32_t wx_get_humidity_measurement(const config_data_wx_sources_t * const confi // set the flag that external temperature is available out |= WX_HANDLER_PARAMETER_RESULT_HUMIDITY; - if (measurement_result == BME280_OK) { - rte_wx_humidity_valid = rte_wx_humidity; - } + rte_wx_humidity_valid = rte_wx_humidity; + } break; diff --git a/src/wx_handler_pressure.c b/src/wx_handler_pressure.c index 1e9131e..1e3e97d 100644 --- a/src/wx_handler_pressure.c +++ b/src/wx_handler_pressure.c @@ -107,20 +107,20 @@ int32_t wx_get_pressure_measurement(const config_data_wx_sources_t * const confi case WX_SOURCE_RTU: case WX_SOURCE_FULL_RTU: { - // get the value read from RTU registers - measurement_retval = rtu_get_humidity(&rte_wx_humidity, config_rtu); - - // check - if (measurement_retval == MODBUS_RET_OK || measurement_retval == MODBUS_RET_DEGRADED) { - - // set the flag that external temperature is available - output |= WX_HANDLER_PARAMETER_RESULT_HUMIDITY; - - if (measurement_retval == BME280_OK) { - rte_wx_humidity_valid = rte_wx_humidity; - } - } - +// // get the value read from RTU registers +// measurement_retval = rtu_get_humidity(&rte_wx_humidity, config_rtu); +// +// // check +// if (measurement_retval == MODBUS_RET_OK || measurement_retval == MODBUS_RET_DEGRADED) { +// +// // set the flag that external temperature is available +// output |= WX_HANDLER_PARAMETER_RESULT_HUMIDITY; +// +// if (measurement_retval == BME280_OK) { +// rte_wx_humidity_valid = rte_wx_humidity; +// } +// } +// break; } case WX_SOURCE_DAVIS_SERIAL: