From 56d0f440b81d4e35bf71d3b456387d04d3e232d7 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Wed, 12 Jul 2023 14:09:03 +0200 Subject: [PATCH] did with string content --- include/etc/kiss_did_configuration.h | 30 +++++++++++++- .../kiss_communication/kiss_xmacro_helpers.h | 11 +++++ src/kiss_protocol/kiss_did.c | 40 +++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/include/etc/kiss_did_configuration.h b/include/etc/kiss_did_configuration.h index 9ab0235..beafde4 100644 --- a/include/etc/kiss_did_configuration.h +++ b/include/etc/kiss_did_configuration.h @@ -21,14 +21,42 @@ #include "./kiss_communication/kiss_xmacro_helpers.h" #include "rte_wx.h" +#include "main_master_time.h" +#include "main.h" +#include "rte_main.h" +#include "gsm/sim800c.h" //!< Dummy variable used only as end of definition marker in tables extern char did_dummy_data; //!< Definition of all DIDs with theirs source data for PARAMETEO platform #if defined(PARAMETEO) + #define DIDS_STRING(ENTRY) \ + ENTRY(0x1500U, gsm_sim800_registered_network) \ + ENTRY(0x1501U, gsm_sim800_simcard_status_string) \ + ENTRY(0x1502U, gsm_sim800_cellid) \ + ENTRY(0x1503U, gsm_sim800_lac) \ + + #define DIDS_FLOAT(ENTRY) \ + ENTRY(0x2000U, &rte_wx_temperature_average_external_valid, 0x0, 0x0) \ + ENTRY(0x2001U, &rte_wx_temperature_internal_valid, 0x0, 0x0) \ + ENTRY(0x2002U, &rte_wx_pressure_history[0], &rte_wx_pressure_history[1], &rte_wx_pressure_history[2]) \ + ENTRY(0x1505U, &gsm_sim800_signal_level_dbm, 0x0, 0x0) \ + #define DIDS_NUMERIC(ENTRY) \ - ENTRY(0x1234U, &rte_wx_temperature_average_dallas, &rte_wx_temperature_average_pt, &rte_wx_temperature_average_internal) \ + ENTRY(0x1000U, &master_time, 0x0, 0x0) \ + ENTRY(0x1001U, &rx10m, 0x0, 0x0) \ + ENTRY(0x1002U, &tx10m, 0x0, 0x0) \ + ENTRY(0x1003U, &digi10m, 0x0, 0x0) \ + ENTRY(0x1004U, &digidrop10m, 0x0, 0x0) \ + ENTRY(0x1100U, &rte_main_battery_voltage, &rte_main_average_battery_voltage, 0x0) \ + ENTRY(0x2003U, &rte_wx_temperature_average_dallas, &rte_wx_temperature_average_pt, &rte_wx_temperature_average_internal) \ + ENTRY(0x2004U, &rte_wx_average_winddirection, &rte_wx_average_windspeed, &rte_wx_max_windspeed) \ + ENTRY(0x2005U, &rte_wx_windspeed[0], &rte_wx_windspeed[1], &rte_wx_windspeed[2]) \ + ENTRY(0x2006U, &rte_wx_winddirection[0], &rte_wx_winddirection[1], &rte_wx_winddirection[2]) \ + ENTRY(0x2007U, &rte_wx_humidity, 0x0, 0x0) \ + ENTRY(0x2008U, &rte_wx_humidity, 0x0, 0x0) \ + ENTRY(0x1504U, &gsm_sim800_signal_level_dbm, 0x0, 0x0) \ ENTRY(0xFFFFU, &did_dummy_data, &did_dummy_data, &did_dummy_data) #endif diff --git a/include/kiss_communication/kiss_xmacro_helpers.h b/include/kiss_communication/kiss_xmacro_helpers.h index 4a86557..836721e 100644 --- a/include/kiss_communication/kiss_xmacro_helpers.h +++ b/include/kiss_communication/kiss_xmacro_helpers.h @@ -38,4 +38,15 @@ .third_data_size = 0 \ }, +#define DID_NUMERIC_STRING_DEFINITION_EXPANDER(id, string_pointer ) \ + { \ + .identifier = id, \ + .first_data = (void*)string_pointer, \ + .first_data_size = 0, \ + .second_data = (void*)0xDEADBEEFu, \ + .second_data_size = 0, \ + .third_data = (void*)0xDEADBEEFu, \ + .third_data_size = 0 \ + }, + #endif /* KISS_XMACRO_HELPERS_H_ */ diff --git a/src/kiss_protocol/kiss_did.c b/src/kiss_protocol/kiss_did.c index 2766867..b7bf387 100644 --- a/src/kiss_protocol/kiss_did.c +++ b/src/kiss_protocol/kiss_did.c @@ -11,6 +11,8 @@ #include #include +#include + #ifdef STM32F10X_MD_VL #include #define SRAM1_SIZE_MAX (0x00002000UL) /*!< maximum SRAM1 size (up to 96 KBytes) */ @@ -36,6 +38,8 @@ typedef struct kiss_did_numeric_definition_t { //!< Definition of all DIDs with numeric data const static kiss_did_numeric_definition_t kiss_did_def[] = { + DIDS_STRING(DID_NUMERIC_STRING_DEFINITION_EXPANDER) + DIDS_FLOAT(DID_NUMERIC_FLOAT_DEFINITION_EXPANDER) DIDS_NUMERIC(DID_NUMERIC_DEFINITION_EXPANDER) }; @@ -74,6 +78,25 @@ static uint8_t kiss_did_how_much_data(kiss_did_numeric_definition_t * definition return out; } +/** + * Check if this DID return string data + * @param definition + * @return + */ +static int kiss_did_validate_is_string(kiss_did_numeric_definition_t * definition) { + int out = 0; + + if (definition != 0) { + if (kiss_did_how_much_data(definition) == 3) { + if (definition->second_data == (void*)0xDEADBEEFu && definition->third_data == (void*)0xDEADBEEFu) { + out = 1; + } + } + } + + return out; +} + /** * Checks if DID configuration is anything valid * @param definition @@ -209,6 +232,9 @@ uint8_t kiss_did_response(uint16_t identifier, uint8_t * output_buffer, uint16_t // check is valid const int is_valid = kiss_did_validate(&found, &number_of_data_source); + // check if this is string did + const int is_string = kiss_did_validate_is_string(&found); + // if something has been found and it is valid if (found.identifier != 0xFFFFu && is_valid == 1) { @@ -261,6 +287,20 @@ uint8_t kiss_did_response(uint16_t identifier, uint8_t * output_buffer, uint16_t // also include size_byte in this calculation out++; + } + else if (found.identifier != 0xFFFFu && is_string == 1) { + // if this is a string DID + const char * str = (char *)found.first_data; + + const size_t str_len = strlen(str); + + if (str_len > buffer_ln) { + memcpy(output_buffer, found.first_data, buffer_ln); + } + else { + memcpy(output_buffer, found.first_data, str_len); + } + } return out;