diff --git a/include/kiss_communication/kiss_xmacro_helpers.h b/include/kiss_communication/kiss_xmacro_helpers.h index 5f2ec9e..fed57aa 100644 --- a/include/kiss_communication/kiss_xmacro_helpers.h +++ b/include/kiss_communication/kiss_xmacro_helpers.h @@ -44,7 +44,7 @@ { \ .identifier = id, \ .first_data = (void*)string_pointer, \ - .first_data_size = 0, \ + .first_data_size = sizeof(string_pointer), \ .second_data = (void*)0xDEADBEEFu, \ .second_data_size = 0, \ .third_data = (void*)0xDEADBEEFu, \ diff --git a/include/main.h b/include/main.h index 71fb107..53e3187 100644 --- a/include/main.h +++ b/include/main.h @@ -15,7 +15,7 @@ #define SYSTICK_TICKS_PER_SECONDS 100 #define SYSTICK_TICKS_PERIOD 10 -#define INTERNAL_WATCHDOG +//#define INTERNAL_WATCHDOG #define EXTERNAL_WATCHDOG #define PWR_SWITCH_BOTH diff --git a/include/variant.h b/include/variant.h index 48f8535..c1780c0 100644 --- a/include/variant.h +++ b/include/variant.h @@ -10,7 +10,7 @@ #include "stdint.h" -int variant_validate_is_within_ram(uint32_t address); +int variant_validate_is_within_ram(void * address); diff --git a/src/backup_registers.c b/src/backup_registers.c index 8639970..c19dbf3 100644 --- a/src/backup_registers.c +++ b/src/backup_registers.c @@ -93,7 +93,7 @@ inline static uint8_t backup_reg_get_checksum(uint32_t reg) { inline static void backup_reg_set_checksum(volatile uint32_t * reg, const uint8_t checksum) { - if (variant_validate_is_within_ram((const uint32_t)reg) != 0) { + if (variant_validate_is_within_ram((void*)reg) != 0) { // clear existing checksum (*reg) &= (0xFFFFFFFF ^ 0xF0000000); diff --git a/src/kiss_protocol/kiss_did.c b/src/kiss_protocol/kiss_did.c index 5082e8a..a01e964 100644 --- a/src/kiss_protocol/kiss_did.c +++ b/src/kiss_protocol/kiss_did.c @@ -22,6 +22,10 @@ #include #endif +#define KISS_DID_SIZE_MAPPING_INT8 1 +#define KISS_DID_SIZE_MAPPING_INT16 2 +#define KISS_DID_SIZE_MAPPING_INT32 3 + //!< Dummy variable used only as end of definition marker in tables char did_dummy_data; @@ -46,10 +50,10 @@ const static kiss_did_numeric_definition_t kiss_did_def[] = { //!< Mapping between a result of sizeof operator and a value of sizebyte const static uint8_t kiss_did_sizeof_to_sizebyte_mapping[5] = { 0,// nothing - 1, // int8_t - 2, // int16_t + KISS_DID_SIZE_MAPPING_INT8, // int8_t -> 1 + KISS_DID_SIZE_MAPPING_INT16, // int16_t -> 2 0, // nothing - 3 // int32_t + KISS_DID_SIZE_MAPPING_INT32 // int32_t -> 3 }; /** @@ -146,9 +150,9 @@ static int kiss_did_validate(kiss_did_numeric_definition_t * definition, uint8_t if (amount_of_data > 0) { // check if DID data size an address is correct - if ((definition->first_data_size == 0 || - definition->first_data_size == 1 || - definition->first_data_size == 4) && + if ((definition->first_data_size == sizeof(int8_t) || + definition->first_data_size == sizeof(int16_t) || + definition->first_data_size == sizeof(int32_t)) && (uint32_t)definition->first_data > SRAM_BASE && (uint32_t)definition->first_data < SRAM_BASE + SRAM1_SIZE_MAX) { @@ -158,9 +162,9 @@ static int kiss_did_validate(kiss_did_numeric_definition_t * definition, uint8_t // if second did is also defined if (amount_of_data > 1) { // check if DID data size is correct - if ((definition->second_data_size == 0 || - definition->second_data_size == 1 || - definition->second_data_size == 4) && + if ((definition->first_data_size == sizeof(int8_t) || + definition->first_data_size == sizeof(int16_t) || + definition->first_data_size == sizeof(int32_t)) && (uint32_t)definition->second_data > SRAM_BASE && (uint32_t)definition->second_data < SRAM_BASE + SRAM1_SIZE_MAX) { @@ -171,9 +175,9 @@ static int kiss_did_validate(kiss_did_numeric_definition_t * definition, uint8_t if (amount_of_data > 2) { // check third DID source data size - if ((definition->third_data_size == 0 || - definition->third_data_size == 1 || - definition->third_data_size == 4) && + if ((definition->first_data_size == sizeof(int8_t) || + definition->first_data_size == sizeof(int16_t) || + definition->first_data_size == sizeof(int32_t)) && (uint32_t)definition->third_data > SRAM_BASE && (uint32_t)definition->third_data < SRAM_BASE + SRAM1_SIZE_MAX) { @@ -209,6 +213,13 @@ static int kiss_did_validate(kiss_did_numeric_definition_t * definition, uint8_t } + // special case for float DIDs + if (out == 0) { + if (kiss_did_validate_is_float(definition) != 0) { + out = 1; + } + } + if (amount != 0) { *amount = amount_of_data; } @@ -231,7 +242,7 @@ static int kiss_did_validate(kiss_did_numeric_definition_t * definition, uint8_t */ uint8_t kiss_did_response(uint16_t identifier, uint8_t * output_buffer, uint16_t buffer_ln) { - uint8_t out = 0; + uint8_t out = 0xFF; // iterator to go through DID definition int i = 0; @@ -245,7 +256,7 @@ uint8_t kiss_did_response(uint16_t identifier, uint8_t * output_buffer, uint16_t * 0y - If most significant bit is set to zero, size_byte will * signalize string DID as ASCII characters from basic ASIC * table are from range 0 to 127 - * 10 - If most significant bit is set to zero AND next significant + * 10 - If most significant bit is set to one AND next significant * bit is set to zero this DID returns integer data. In such * case three groups of two bits controls a size of data according * to 'kiss_did_sizeof_to_sizebyte_mapping'. If a group of two bits @@ -407,17 +418,29 @@ uint8_t kiss_did_response(uint16_t identifier, uint8_t * output_buffer, uint16_t output_buffer[1] = (identifier & 0xFF00) >> 8; // if this is a string DID - const char * str = (char *)found.first_data; + const void * str = (void *)found.first_data; - const size_t str_len = strlen(str); + const size_t str_len = found.first_data_size; + + memset(output_buffer, 0x00, buffer_ln - 2); if (str_len - 2 > buffer_ln) { - memcpy(output_buffer + 2, found.first_data, buffer_ln); + memcpy(output_buffer, str, buffer_ln - 2); + + out = buffer_ln - 2; } else { - memcpy(output_buffer, found.first_data, str_len); + memcpy(output_buffer, str, str_len); + + out = str_len; } + // include DID number itself + out += 2; + + } + else { + out = 0; } return out; diff --git a/src/variant_parameteo.c b/src/variant_parameteo.c index 90e644b..461794e 100644 --- a/src/variant_parameteo.c +++ b/src/variant_parameteo.c @@ -7,8 +7,16 @@ #include "variant.h" -int variant_validate_is_within_ram(uint32_t address) { - if (address != 0x00) { +#ifdef STM32L471xx +#include +#endif + +int variant_validate_is_within_ram(void * address) { + + uint32_t addr_value = (uint32_t)address; + + if (addr_value > SRAM_BASE && + addr_value < SRAM_BASE + SRAM1_SIZE_MAX) { return 1; } else {