/* * nbus_memory.h * * Created on: Nov 4, 2023 * Author: juraj */ #ifndef MODULES_NBUS_INC_NBUS_MEMORY_H_ #define MODULES_NBUS_INC_NBUS_MEMORY_H_ #include "mcu_platform.h" #define ERROR_VALUE_I32 0x7FFFFFFF #define MODULE_SENSORS_ADDRESS_OFFSET 64 #define MODULE_PARAMS_COUNT 16 #define MODULE_PARAM_SIZE 4 #define GET_PARAM_ADDRESS(sensor, param) \ (MODULE_SENSORS_ADDRESS_OFFSET + (sensor)*MODULE_PARAMS_COUNT * MODULE_PARAM_SIZE + (param)*MODULE_PARAM_SIZE) #define PARAMETER_VALID 0b10 #define PARAMETER_UNSET 0b01 typedef struct { uint8_t (*init)(void *, uint16_t); uint32_t (*read_word)(uint16_t); uint16_t (*read_half_word)(uint16_t); uint8_t (*read_byte)(uint16_t); /** * @brief Zapíše 4B/2B/1B hodnotu na adresu * @param uint32_t data dáta * @param uint16_t address adresa v pamati. Povolený rozsah: 0-0x09FF * @param uint8_t length dĺžka zapisovaných dát */ uint8_t (*write_data)(uint8_t *data, uint16_t address, uint8_t length); uint8_t (*read_id)(uint8_t *); uint32_t (*get_capacity)(void); } nBus_MemoryDriver; typedef enum { MEMORY_STORE_FAIL, MEMORY_STORE_OK, } nBus_memoryState_t; typedef struct { uint8_t (*storeParam)(uint8_t sensor_index, uint8_t param_name, uint32_t param_value); uint32_t (*readParam)(uint8_t sensor_index, uint8_t param_name); uint8_t (*isParamActive)(uint8_t sensor_index, uint8_t param_name); void (*readHeaderData)(void); uint8_t (*getId)(uint8_t *); uint32_t (*getCapacity)(void); } nBus_memoryInterface_t; typedef struct __attribute__((packed)) { uint8_t param0 : 2; uint8_t param1 : 2; uint8_t param2 : 2; uint8_t param3 : 2; } nBus_MemorySensorParam_t; typedef struct { nBus_MemorySensorParam_t params_map[64]; } nBus_memoryHeader_t; nBus_memoryInterface_t *getnbusMemoryInterface(void); void nbus_memory_init(nBus_MemoryDriver *driver); /** * @brief Store sensor parameter. */ nBus_memoryState_t nbus_memory_store_param(uint8_t sensor_index, uint8_t param_name, uint32_t param_value); uint32_t nbus_memory_read_param(uint8_t sensor_index, uint8_t param_name); uint8_t nbus_memory_id(uint8_t *); uint32_t nbus_get_capacity(void); void nbus_read_header_data(void); void memory_params_format(void); uint8_t nbus_is_param_active(uint8_t sensor_index, uint8_t param_name); uint8_t getParameterHeaderOffset(uint8_t sensor_index, uint8_t param_name); #endif /* MODULES_NBUS_INC_NBUS_MEMORY_H_ */