kiss did: few bugfixes here and there. warninggit add * internal watchdig is disabledgit add *!

master
Mateusz Lubecki 2023-11-05 22:28:38 +01:00
rodzic eaee4cf588
commit ee541a54dc
6 zmienionych plików z 55 dodań i 24 usunięć

Wyświetl plik

@ -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, \

Wyświetl plik

@ -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

Wyświetl plik

@ -10,7 +10,7 @@
#include "stdint.h"
int variant_validate_is_within_ram(uint32_t address);
int variant_validate_is_within_ram(void * address);

Wyświetl plik

@ -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);

Wyświetl plik

@ -22,6 +22,10 @@
#include <stm32l4xx.h>
#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;

Wyświetl plik

@ -7,8 +7,16 @@
#include "variant.h"
int variant_validate_is_within_ram(uint32_t address) {
if (address != 0x00) {
#ifdef STM32L471xx
#include <stm32l4xx.h>
#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 {