From 2d861881c3363cc64276b9476e5ec4a5633c8141 Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 4 Dec 2024 13:10:49 +0300 Subject: [PATCH] Init --- VariablesTable.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++ VariablesTable.h | 92 ++++++++++++++++++++++++++++++++++ modular.json | 12 +++++ 3 files changed, 229 insertions(+) create mode 100644 VariablesTable.c create mode 100644 VariablesTable.h create mode 100644 modular.json diff --git a/VariablesTable.c b/VariablesTable.c new file mode 100644 index 0000000..a95a4f5 --- /dev/null +++ b/VariablesTable.c @@ -0,0 +1,125 @@ +// +// Created by zemon on 03.06.2022. + +#include +#include +#include "VariablesTable.h" + +uint8_t variablesTypeLength[] = { + [VARIABLE_TYPE_UINT8] = 0x01, + [VARIABLE_TYPE_UINT16] = 0x02, + [VARIABLE_TYPE_STRING] = 0x00, + [VARIABLE_TYPE_BOOL] = 0x01, + [VARIABLE_TYPE_FLOAT32] = 0x04, + [VARIABLE_TYPE_INT32] = 0x04, + [VARIABLE_TYPE_UINT32] = 0x04, + [VARIABLE_TYPE_INT16] = 0x02, + [VARIABLE_TYPE_INT64] = 0x08 +}; + + +void VariablesTableInit(tVariablesTable *env, tVariableDescriptor *mem, uint16_t limit) { + env->items = mem; + env->limit = limit; + env->count = 0; + env->changes = 0; + env->writeAccess = osMutexNew(NULL); +} + +bool VariablesTableAdd( + tVariablesTable *env, + char *nameStatic, + uint8_t nameLength, + eVariableTypeId type, + void *addr, + void *len, + uint16_t *writeAttempts, + uint32_t groupMask +) { + if (env->count >= env->limit) { + return false; + } + + tVariableDescriptor *var = env->items + env->count; + + var->name.str = nameStatic; + var->name.length = nameLength; + + var->typeId = type; + var->addr = addr; + var->len = len; + var->writeAttempts = writeAttempts; + var->groupMask = groupMask; + + ++env->count; + return true; +} + +tVariableDescriptor *VariablesTable_GetLast(tVariablesTable *env) { + return env->items + env->count - 1; +} + +tVariableDescriptor *VariablesTable_GetByName(tVariablesTable *env, char *name, uint8_t nameLen) { + // Поиск текстового id в таблице + + for (uint16_t id = 0; id < env->count; ++id) { + if (nameLen == env->items[id].name.length) { + if (strncmp(name, env->items[id].name.str, nameLen) == 0) { + return env->items + id; + } + } + } + + return NULL; +} + +uint8_t VariablesTable_GetVarLength(tVariableDescriptor *var) { + uint8_t len = variablesTypeLength[var->typeId]; + + if (!len) { + len = *(uint8_t *) var->len; + } + + return len; +} + + +uint8_t VariablesTable_GetVarTypeLength(tVariableDescriptor *var) { + return variablesTypeLength[var->typeId]; +} + + +//todo нужно сделать доступ к записи значений потокозащищенным +bool VariablesTable_RequireChange(tVariablesTable *env, uint32_t timeout) { + return osMutexAcquire(env->writeAccess, SystemMsToTicks(timeout)) == osOK; +} + +bool VariablesTable_IsVariableChangeAllowed(tVariableDescriptor *var) { + return var->writeAttempts ? *var->writeAttempts : true; +} + + +void VariablesTable_VariableChanged(tVariablesTable *env, tVariableDescriptor *var) { + if (var->writeAttempts) { + --(*var->writeAttempts); + } + env->changes |= var->groupMask; +} + +void VariablesTable_ReleaseChange(tVariablesTable *env) { + osMutexRelease(env->writeAccess); +} + +bool VariablesTable_TakeChange(tVariablesTable *env, uint32_t groupMask) { + if (env->changes) { + if (VariablesTable_RequireChange(env, 0)) { + if (env->changes & groupMask) { + env->changes &= ~groupMask; + VariablesTable_ReleaseChange(env); + return true; + } + VariablesTable_ReleaseChange(env); + } + } + return false; +} \ No newline at end of file diff --git a/VariablesTable.h b/VariablesTable.h new file mode 100644 index 0000000..e5bd9f9 --- /dev/null +++ b/VariablesTable.h @@ -0,0 +1,92 @@ +// +// Created by zemon on 02.06.2022. +// + +#ifndef TERMINAL_MOTO_0_0_1_PUBLICVARIABLESTABLE_H +#define TERMINAL_MOTO_0_0_1_PUBLICVARIABLESTABLE_H + +#include "stdint.h" +#include +#include + +typedef enum { + VARIABLE_TYPE_UINT8 = 0x01, + VARIABLE_TYPE_UINT16 = 0x02, + VARIABLE_TYPE_STRING = 0x03, + VARIABLE_TYPE_BOOL = 0x04, + VARIABLE_TYPE_FLOAT32 = 0x05, + VARIABLE_TYPE_INT32 = 0x06, + VARIABLE_TYPE_UINT32 = 0x07, + VARIABLE_TYPE_INT16 = 0x08, + VARIABLE_TYPE_INT64 = 0x09, +} eVariableTypeId; + +extern uint8_t variablesTypeLength[]; + +#define VARIABLE_NAME_LENGTH 64 + +typedef struct { + char *str; + uint8_t length; +} tVariableName; + +#define VARIABLE_NAME(STR) {.str=(STR), .length=sizeof(STR)-1} + +typedef struct { + tVariableName name; + eVariableTypeId typeId; + void *addr; + void *len; + uint16_t *writeAttempts; + uint32_t groupMask;//это маска группы изменений (см tVariablesTable) +} tVariableDescriptor; + +typedef struct { + tVariableDescriptor *items; + uint16_t limit; + uint16_t count; + + //все изменени разбиты на группы + //всего возможно 32 группы соответственно + //при изменении переменной поднимаеться бит соответствующей группы + //и изменение можно обработать + uint32_t changes; + osMutexId_t writeAccess; +} tVariablesTable; + +void VariablesTableInit(tVariablesTable *env, tVariableDescriptor *memAlloc, uint16_t memAllocLimit); + +#define VariablesTableInitStatic(ENV, MEM) VariablesTableInit(ENV,MEM, sizeof(MEM)/sizeof(tVariableDescriptor)) + +bool VariablesTableAdd( + tVariablesTable *env, + char *nameStatic, + uint8_t nameLength, + eVariableTypeId type, + void *addr, + void *len, + uint16_t *writeAttempts, + uint32_t groupMask +); + +tVariableDescriptor *VariablesTable_GetLast(tVariablesTable *env); + +tVariableDescriptor *VariablesTable_GetByName(tVariablesTable *env, char *name, uint8_t nameLen); + +#define VariablesTable_GetByNameStatic(ENV, NAME) VariablesTable_GetByName(ENV, NAME, sizeof(NAME)-1) + +uint8_t VariablesTable_GetVarLength(tVariableDescriptor *descriptor); + +uint8_t VariablesTable_GetVarTypeLength(tVariableDescriptor *var); + +bool VariablesTable_IsVariableChangeAllowed(tVariableDescriptor *var); + +void VariablesTable_VariableChanged(tVariablesTable *env, tVariableDescriptor *var); + +bool VariablesTable_RequireChange(tVariablesTable *env, uint32_t timeout); + +void VariablesTable_ReleaseChange(tVariablesTable *env); + +bool VariablesTable_TakeChange(tVariablesTable *env, uint32_t groupMask); + +#endif //TERMINAL_MOTO_0_0_1_PUBLICVARIABLESTABLE_H diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..5e4ed34 --- /dev/null +++ b/modular.json @@ -0,0 +1,12 @@ +{ + "dep": [ + ], + "cmake": { + "inc_dirs": [ + "./" + ], + "srcs": [ + "./**.c" + ] + } +} \ No newline at end of file