From 8c14c40e3e7ac233104c488d0386feb98f76e501 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Tue, 23 Mar 2021 08:01:33 +0100 Subject: [PATCH] worarounds of problem with communication with PV controller --- .settings/language.settings.xml | 2 +- src/main.c | 8 +++++--- system/src/ve_direct_protocol/parser.c | 25 +++++++------------------ 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 7b454e1..073aca8 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -16,7 +16,7 @@ - + diff --git a/src/main.c b/src/main.c index b82ac6d..7b1ba8e 100644 --- a/src/main.c +++ b/src/main.c @@ -560,10 +560,10 @@ int main(int argc, char* argv[]){ // enabling timeout handling for serial port. This is required because VE protocol frame may vary in lenght // and serial port driver could finish reception only either on stop character or when declared number of bytes // has been received. - srl_switch_timeout(main_kiss_srl_ctx_ptr, 1, 100); + srl_switch_timeout(main_kiss_srl_ctx_ptr, 1, 50); // switching UART to receive mode to be ready for data from charging controller - srl_receive_data(main_kiss_srl_ctx_ptr, VE_DIRECT_MAX_FRAME_LN, 0x0D, 0, 0, 0, 0); + srl_receive_data(main_kiss_srl_ctx_ptr, VE_DIRECT_MAX_FRAME_LN, 0, 0, 0, 0, 0); } else { // switching UART to receive mode to be ready for KISS frames from host @@ -690,7 +690,9 @@ int main(int argc, char* argv[]){ rte_pv_corrupted_messages_count++; } - srl_receive_data(main_kiss_srl_ctx_ptr, VE_DIRECT_MAX_FRAME_LN, 0x0D, 0, 0, 0, 0); + //memset(srl_get_rx_buffer(main_kiss_srl_ctx_ptr), 0x00, TX_BUFFER_1_LN); + + srl_receive_data(main_kiss_srl_ctx_ptr, VE_DIRECT_MAX_FRAME_LN, 0, 0, 0, 0, 0); } } else if (config_data_mode.wx_umb == 1) { diff --git a/system/src/ve_direct_protocol/parser.c b/system/src/ve_direct_protocol/parser.c index d30bca4..62bf0d9 100644 --- a/system/src/ve_direct_protocol/parser.c +++ b/system/src/ve_direct_protocol/parser.c @@ -155,10 +155,6 @@ void ve_direct_cut_to_checksum(uint8_t* input, uint16_t input_ln, *target_ln = checksum_start + CHECKSUM_NAME_FIELD_LN_TO_DATA; - for (i = checksum_start + CHECKSUM_NAME_FIELD_LN_TO_DATA; i < input_ln; i++) { - *(input + i) = 0x00; - } - } void ve_direct_validate_checksum(uint8_t* input, uint16_t input_ln, uint8_t* valid) { @@ -171,20 +167,6 @@ void ve_direct_validate_checksum(uint8_t* input, uint16_t input_ln, uint8_t* val return; } - // rewind to first printable chcaracter - while (is_non_printable_character()) { - i++; - - // if we reach an end of the string but no printable character has been spotted - if (i >= input_ln) { - *valid = 0; - return; - } - } - - // checksum need to be calculated including newline before first record - i -= 2; - for (; i < input_ln; i++) { // workaround of the problem with loosing \n or \r characters @@ -214,6 +196,13 @@ void ve_direct_validate_checksum(uint8_t* input, uint16_t input_ln, uint8_t* val } } + else { + + // the next part of the stupid workaround + if ((*input) == '\n') { + sum += '\r'; + } + } }