From 9075327d8cc1fc4da626bc31c722f773ef7585b4 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Thu, 4 Apr 2019 19:57:21 +0200 Subject: [PATCH] DB01 --- include/main.h | 2 +- skalowania.ods | Bin 0 -> 45456 bytes src/main.c | 2 + src/packet_tx_handler.c | 10 ++- src/rte_pv.c | 2 + src/rte_pv.h | 2 + system/include/aprs/telemetry.h | 9 ++- .../ve_direct_protocol/average_struct.h | 4 ++ system/include/ve_direct_protocol/parser.h | 3 + system/src/aprs/telemetry.c | 30 ++++++-- system/src/ve_direct_protocol/parser.c | 67 ++++++++++++++++++ 11 files changed, 123 insertions(+), 8 deletions(-) create mode 100644 skalowania.ods diff --git a/include/main.h b/include/main.h index d6d7587..9206438 100644 --- a/include/main.h +++ b/include/main.h @@ -3,7 +3,7 @@ #include "aprs/ax25.h" -#define SW_VER "DB00" +#define SW_VER "DB02" #define SW_DATE "04042019" #define SYSTICK_TICKS_PER_SECONDS 100 diff --git a/skalowania.ods b/skalowania.ods new file mode 100644 index 0000000000000000000000000000000000000000..704180eccdda21a70e0e72eafc7077bdfe8336ed GIT binary patch literal 45456 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 literal 0 HcmV?d00001 diff --git a/src/main.c b/src/main.c index e7d140b..72dc749 100644 --- a/src/main.c +++ b/src/main.c @@ -300,6 +300,8 @@ main(int argc, char* argv[]) ve_direct_get_averages(&rte_pv_average, &rte_pv_battery_current, &rte_pv_battery_voltage, &rte_pv_cell_voltage, &rte_pv_load_current); ve_direct_set_sys_voltage(&rte_pv_struct, &rte_pv_sys_voltage); + + ve_direct_store_errors(&rte_pv_struct, &rte_pv_last_error); } } diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index f761d33..d07c16c 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -90,14 +90,22 @@ void packet_tx_handler(void) { if (packet_tx_telemetry_descr_counter >= packet_tx_telemetry_descr_interval) { #ifdef _VICTRON telemetry_send_chns_description_pv(); + + main_wait_for_tx_complete(); + + telemetry_send_status(&rte_pv_average, &rte_pv_last_error, rte_pv_struct.system_state); + + main_wait_for_tx_complete(); #else telemetry_send_chns_description(); -#endif + main_wait_for_tx_complete(); telemetry_send_status(); main_wait_for_tx_complete(); +#endif + packet_tx_telemetry_descr_counter = 0; } diff --git a/src/rte_pv.c b/src/rte_pv.c index 5855537..08330d0 100644 --- a/src/rte_pv.c +++ b/src/rte_pv.c @@ -11,6 +11,8 @@ ve_direct_average_struct rte_pv_average; uint8_t rte_pv_sys_voltage; ve_direct_raw_struct rte_pv_struct; +ve_direct_error_reason rte_pv_last_error; + int16_t rte_pv_battery_current; uint16_t rte_pv_battery_voltage; uint16_t rte_pv_cell_voltage; diff --git a/src/rte_pv.h b/src/rte_pv.h index aa2fbd1..b6985ac 100644 --- a/src/rte_pv.h +++ b/src/rte_pv.h @@ -16,6 +16,8 @@ extern ve_direct_average_struct rte_pv_average; extern uint8_t rte_pv_sys_voltage; extern ve_direct_raw_struct rte_pv_struct; +extern ve_direct_error_reason rte_pv_last_error; + extern int16_t rte_pv_battery_current; extern uint16_t rte_pv_battery_voltage; extern uint16_t rte_pv_cell_voltage; diff --git a/system/include/aprs/telemetry.h b/system/include/aprs/telemetry.h index 307f0d7..0f4a036 100644 --- a/system/include/aprs/telemetry.h +++ b/system/include/aprs/telemetry.h @@ -14,6 +14,10 @@ #include "./station_config.h" +#ifdef _VICTRON +#include "ve_direct_protocol/parser.h" +#endif + #include "stdint.h" #ifdef __cplusplus @@ -31,6 +35,8 @@ void telemetry_send_values_pv ( uint8_t rx_pkts, ms5611_qf_t ms_qf, dht22QF ds_qf); void telemetry_send_chns_description_pv(void); +void telemetry_send_status(ve_direct_average_struct* avg, ve_direct_error_reason* last_error, ve_direct_system_state state); + #else void telemetry_send_values( uint8_t rx_pkts, uint8_t tx_pkts, @@ -41,9 +47,10 @@ void telemetry_send_values( uint8_t rx_pkts, ms5611_qf_t ms_qf, dht22QF ds_qf); void telemetry_send_chns_description(void); -#endif void telemetry_send_status(void); +#endif + #ifdef __cplusplus } #endif diff --git a/system/include/ve_direct_protocol/average_struct.h b/system/include/ve_direct_protocol/average_struct.h index f7c59f2..bc0b065 100644 --- a/system/include/ve_direct_protocol/average_struct.h +++ b/system/include/ve_direct_protocol/average_struct.h @@ -24,6 +24,10 @@ typedef __attribute__ ((aligned(1))) struct ve_direct_average_struct { uint8_t full_buffer; + int16_t min_battery_current; + + int16_t max_battery_current; + } ve_direct_average_struct; diff --git a/system/include/ve_direct_protocol/parser.h b/system/include/ve_direct_protocol/parser.h index 41cf1d6..622d596 100644 --- a/system/include/ve_direct_protocol/parser.h +++ b/system/include/ve_direct_protocol/parser.h @@ -28,6 +28,9 @@ int ve_direct_parse_to_raw_struct(uint8_t* input, uint16_t input_ln, ve_direct_r void ve_direct_add_to_average(ve_direct_raw_struct* in, ve_direct_average_struct* avg_struct); void ve_direct_get_averages(ve_direct_average_struct* avg_struct, int16_t* battery_current, uint16_t* battery_voltage, uint16_t* pv_voltage, uint16_t* load_current); void ve_direct_set_sys_voltage(ve_direct_raw_struct* in, uint8_t* sys_voltage); +void ve_direct_store_errors(ve_direct_raw_struct* input, ve_direct_error_reason* err_reason); +void ve_direct_error_to_string(ve_direct_error_reason input, char* output, int8_t output_ln); +void ve_direct_state_to_string(ve_direct_system_state input, char* output, int8_t output_ln); #ifdef __cplusplus } diff --git a/system/src/aprs/telemetry.c b/system/src/aprs/telemetry.c index 709a19c..91bd068 100644 --- a/system/src/aprs/telemetry.c +++ b/system/src/aprs/telemetry.c @@ -10,7 +10,10 @@ #include "station_config.h" #include "delay.h" +#include "ve_direct_protocol/parser.h" + #include +#include uint16_t telemetry_counter = 0; @@ -93,9 +96,9 @@ void telemetry_send_values_pv ( uint8_t rx_pkts, float phy_battery_voltage = 0.0f; float phy_pvcell_voltage = 0.0f; - phy_battery_current = raw_battery_current / 100; - phy_battery_voltage = raw_battery_voltage / 100; - phy_pvcell_voltage = raw_pv_cell_voltage / 100; + phy_battery_current = (float)raw_battery_current / 1000.0f; + phy_battery_voltage = (float)raw_battery_voltage / 1000.0f; + phy_pvcell_voltage = (float)raw_pv_cell_voltage / 1000.0f; scaled_battery_current = (uint8_t) roundf((phy_battery_current + 8.0f) * 14.2857f); scaled_battery_voltage = (uint8_t) roundf((phy_battery_voltage - 4.0f) * 14.2857f); @@ -153,6 +156,21 @@ void telemetry_send_values_pv ( uint8_t rx_pkts, } +void telemetry_send_status(ve_direct_average_struct* avg, ve_direct_error_reason* last_error, ve_direct_system_state state) { + char string_buff_err[24], string_buff_state[23]; + + ve_direct_state_to_string(state, string_buff_state, 23); + ve_direct_error_to_string(*last_error, string_buff_err, 24); + + main_own_aprs_msg_len = snprintf(main_own_aprs_msg, sizeof(main_own_aprs_msg), "> FwVersion %s BatAmpsMin %d BatAmpsMax %d %s %s", SW_VER, avg->min_battery_current, avg->max_battery_current, string_buff_state, string_buff_err); + ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); + afsk_txStart(&main_afsk); + + avg->max_battery_current = 0; + avg->min_battery_current = 0; + *last_error = ERR_UNINITIALIZED; +} + #else void telemetry_send_chns_description(void) { @@ -292,8 +310,6 @@ void telemetry_send_values( uint8_t rx_pkts, afsk_txStart(&main_afsk); } -#endif - void telemetry_send_status(void) { main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ">ParaTNC firmware %s-%s by SP8EBC", SW_VER, SW_DATE); ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); @@ -301,3 +317,7 @@ void telemetry_send_status(void) { } +#endif + + + diff --git a/system/src/ve_direct_protocol/parser.c b/system/src/ve_direct_protocol/parser.c index a6e4d83..1666d96 100644 --- a/system/src/ve_direct_protocol/parser.c +++ b/system/src/ve_direct_protocol/parser.c @@ -15,12 +15,17 @@ #define LOWEST_PRINTABLE_CHARACTER 33 #define HIGHEST_PRINTABLE_CHARACTER 126 +#define VE_DIRECT_MESSAGES_TO_SKIP 2 + #define is_non_printable_character() (*(input + i) < LOWEST_PRINTABLE_CHARACTER || *(input + i) > HIGHEST_PRINTABLE_CHARACTER) #define is_printable_character() (*(input + i) >= LOWEST_PRINTABLE_CHARACTER && *(input + i) <= HIGHEST_PRINTABLE_CHARACTER) uint8_t key[9]; // the static array to store a key fetched from input file uint8_t value[12]; +uint8_t skip_counter = 0; // counter used to skip some of VE.Direct protocol messages to spread an average over longer + // period of time + //ve_direct_average_struct ve_avg; static int copy_till_non_printable_char(uint8_t* input, uint16_t* input_offset, uint16_t input_ln, uint8_t* output, uint16_t output_ln) { @@ -309,6 +314,13 @@ int ve_direct_parse_to_raw_struct(uint8_t* input, uint16_t input_ln, ve_direct_r void ve_direct_add_to_average(ve_direct_raw_struct* in, ve_direct_average_struct* avg_struct) { + if (skip_counter++ < VE_DIRECT_MESSAGES_TO_SKIP) { + return; + } + else { + skip_counter = 0; + } + uint16_t it = avg_struct->current_pointer; avg_struct->battery_current[it] = in->battery_current; @@ -328,6 +340,14 @@ void ve_direct_add_to_average(ve_direct_raw_struct* in, ve_direct_average_struct avg_struct->current_pointer = it; + if (in->battery_current < avg_struct->min_battery_current) { + avg_struct->min_battery_current = in->battery_current; + } + + if (in->battery_current > avg_struct->max_battery_current) { + avg_struct->max_battery_current = in->battery_current; + } + return; } @@ -359,3 +379,50 @@ void ve_direct_get_averages(ve_direct_average_struct* avg_struct, int16_t* batte void ve_direct_set_sys_voltage(ve_direct_raw_struct* in, uint8_t* sys_voltage) { } + +void ve_direct_store_errors(ve_direct_raw_struct* input, ve_direct_error_reason* err_reason) { + if (input->error_reason != ERR_OK) { + *err_reason = input->error_reason; + } + else { + if (*err_reason == ERR_UNINITIALIZED || *err_reason == ERR_OK) { + *err_reason = ERR_OK; + } + } + +} + +void ve_direct_error_to_string(ve_direct_error_reason input, char* output, int8_t output_ln) { + memset(output, 0x00, output_ln); + + switch(input) { + case ERR_UNINITIALIZED: snprintf(output, output_ln, "ERR_UNINITIALIZED"); break; + case ERR_OK: snprintf(output, output_ln, "ERR_OK"); break; + case ERR_EXCESIVE_BAT_VOLTAGE: snprintf(output, output_ln, "ERR_EXCESIVE_BAT_VOLTAGE"); break; + case ERR_CHGR_TEMP_TOO_HIGH: snprintf(output, output_ln, "ERR_CHGR_TEMP_TOO_HIGH"); break; + case ERR_CHGR_EXCESIVE_CURR: snprintf(output, output_ln, "ERR_CHGR_EXCESIVE_CURR"); break; + case ERR_CHGR_CURR_REVERSED: snprintf(output, output_ln, "ERR_CHGR_CURR_REVERSED"); break; + case ERR_BULK_TIME_EXCEED: snprintf(output, output_ln, "ERR_BULK_TIME_EXCEED"); break; + case ERR_CURRENT_SENSE_FAIL: snprintf(output, output_ln, "ERR_CURRENT_SENSE_FAIL"); break; + case ERR_EXCESIVE_TERMINAL_TEMP: snprintf(output, output_ln, "ERR_EXCESIVE_TERMINAL_TEMP"); break; + case ERR_EXCESIVE_PV_VOLTAGE: snprintf(output, output_ln, "ERR_EXCESIVE_PV_VOLTAGE"); break; + case ERR_EXCESIVE_PV_CURRENT: snprintf(output, output_ln, "ERR_EXCESIVE_PV_CURRENT"); break; + case ERR_INPUT_SHUTDOWN: snprintf(output, output_ln, "ERR_INPUT_SHUTDOWN"); break; + case ERR_TUNES_LOST: snprintf(output, output_ln, "ERR_TUNES_LOST"); break; + } +} + +void ve_direct_state_to_string(ve_direct_system_state input, char* output, int8_t output_ln) { + memset(output, 0x00, output_ln); + + switch(input) { + case STATE_UNINITIALIZED: snprintf(output, output_ln, "STATE_UNINITIALIZED"); break; + case STATE_OFF: snprintf(output, output_ln, "STATE_OFF"); break; + case STATE_LOW_PWR: snprintf(output, output_ln, "STATE_LOW_PWR"); break; + case STATE_FAULT: snprintf(output, output_ln, "STATE_FAULT"); break; + case STATE_BULK: snprintf(output, output_ln, "STATE_BULK"); break; + case STATE_ABSORPTION: snprintf(output, output_ln, "STATE_ABSORPTION"); break; + case STATE_FLOAT: snprintf(output, output_ln, "STATE_FLOAT"); break; + case STATE_INVERTING: snprintf(output, output_ln, "STATE_INVERTING"); break; + } +}