commit 77de150d7335c517b5525c44886cf614ea365667 Author: cfif Date: Mon Jun 2 13:26:41 2025 +0300 Init diff --git a/Inc/EraGlonassMsdTable.h b/Inc/EraGlonassMsdTable.h new file mode 100644 index 0000000..d6f3546 --- /dev/null +++ b/Inc/EraGlonassMsdTable.h @@ -0,0 +1,41 @@ +// +// Created by xemon on 21.11.22. +// + +#ifndef UVEOS_ON_NATION_ERAGLONASSMSDTABLE_H +#define UVEOS_ON_NATION_ERAGLONASSMSDTABLE_H + +#include "EraGlonassMsd.h" + +#define ERA_GLONASS_MSD_TABLE_LENGTH 101 + +typedef struct { + uint16_t attemptsLeft; + tEraGlonassMsd msd; +} tEraGlonassMsdTableItem; + +typedef struct { + tEraGlonassMsdTableItem items[ERA_GLONASS_MSD_TABLE_LENGTH]; +} tEraGlonassMsdTable; + +void EraGlonassMsdTable_Init(tEraGlonassMsdTable *env); + +uint16_t EraGlonassMsdTable_GetSize(); + +uint16_t EraGlonassMsdTable_GetLastId(tEraGlonassMsdTable *env); + +uint32_t EraGlonassMsdTable_GetNoSendDataCount(tEraGlonassMsdTable *env); + +tEraGlonassMsdTableItem *EraGlonassMsdTable_GetNoSendData(tEraGlonassMsdTable *env, tEraGlonassMsdTableItem *prev); + +tEraGlonassMsdTableItem *EraGlonassMsdTable_GetLastMsd(tEraGlonassMsdTable *env, tEraGlonassMsdTableItem *prev); + +tEraGlonassMsdTableItem *EraGlonassMsdTable_GetNextUnsent(tEraGlonassMsdTable *env, tEraGlonassMsdTableItem *prev); + +tEraGlonassMsdTableItem *EraGlonassMsdTable_GetNextFree(tEraGlonassMsdTable *env); + +uint32_t EraGlonassMsdTable_GetCount(tEraGlonassMsdTable *env); + +tEraGlonassMsdTableItem *EraGlonassMsdTable_GetById(tEraGlonassMsdTable *env, uint16_t id); + +#endif //UVEOS_ON_NATION_ERAGLONASSMSDTABLE_H diff --git a/Src/EraGlonassMsdTable.c b/Src/EraGlonassMsdTable.c new file mode 100644 index 0000000..60e2ac2 --- /dev/null +++ b/Src/EraGlonassMsdTable.c @@ -0,0 +1,152 @@ +// +// Created by xemon on 21.11.22. +// + +#include "EraGlonassMsdTable.h" +#include "memory.h" + +uint16_t EraGlonassMsdTable_GetSize() { + return ERA_GLONASS_MSD_TABLE_LENGTH; +} + +void EraGlonassMsdTable_Init(tEraGlonassMsdTable *env) { + memset(env->items, 0, sizeof(env->items)); +} + +//находим самый новый ID (чтоб в следующем мнд сделать ID+1) +uint16_t EraGlonassMsdTable_GetLastId(tEraGlonassMsdTable *env) { + uint16_t lastId = 0; + tEraGlonassMsdTableItem *end = env->items + ERA_GLONASS_MSD_TABLE_LENGTH; + for (tEraGlonassMsdTableItem *item = env->items; item < end; ++item) { + if (item->msd.MSD_Data.msgId > lastId) { + lastId = item->msd.MSD_Data.msgId; + } + } + return lastId; +} + +//находим самый старый или пустой элемент таблицы +tEraGlonassMsdTableItem *EraGlonassMsdTable_GetNextFree(tEraGlonassMsdTable *env) { + tEraGlonassMsdTableItem *oldest = env->items; + + tEraGlonassMsdTableItem *end = env->items + ERA_GLONASS_MSD_TABLE_LENGTH; + for (tEraGlonassMsdTableItem *item = env->items; item < end; ++item) { + if (item->msd.MSD_Data.msgId < oldest->msd.MSD_Data.msgId) { + oldest = item; + } + + } + + memset(oldest, 0, sizeof(tEraGlonassMsdTableItem)); + + return oldest; +} + +//находим слудующий после текущего неотправленный МНД с непустым количеством попыток отправки +tEraGlonassMsdTableItem *EraGlonassMsdTable_GetNextUnsent(tEraGlonassMsdTable *env, tEraGlonassMsdTableItem *prev) { + tEraGlonassMsdTableItem *returnItem = NULL; + + //предена пустой указатель на предыдущий элемент, начинаем с начала + if (prev == NULL) { + prev = env->items; + } else { + ++prev; + } + + tEraGlonassMsdTableItem *end = env->items + ERA_GLONASS_MSD_TABLE_LENGTH; + + //если ошибочно предан указатель на другую область памяти возвращаем NULL + if (prev < env->items && prev >= end) { + return NULL; + } + + for (tEraGlonassMsdTableItem *item = prev; item < end; ++item) { + if (item->attemptsLeft > 0) { + return item; + } + } + + return NULL; +} + +tEraGlonassMsdTableItem *EraGlonassMsdTable_GetNoSendData(tEraGlonassMsdTable *env, tEraGlonassMsdTableItem *prev) { + tEraGlonassMsdTableItem *returnItem = NULL; + //предена пустой указатель на предыдущий элемент, начинаем с начала + if (prev == NULL) { + prev = env->items; + } + + for (uint32_t id = 0; id < EraGlonassMsdTable_GetSize(); ++id) { + if (env->items[id].attemptsLeft > 0) { + returnItem = &env->items[id]; + } + } + + for (uint32_t id = 0; id < EraGlonassMsdTable_GetSize(); ++id) { + if (env->items[id].attemptsLeft > 0) { + if (env->items[id].msd.MSD_Data.timestamp < returnItem->msd.MSD_Data.timestamp) { + returnItem = &env->items[id]; + } + } + } + return returnItem; +} + +tEraGlonassMsdTableItem *EraGlonassMsdTable_GetLastMsd(tEraGlonassMsdTable *env, tEraGlonassMsdTableItem *prev) { + tEraGlonassMsdTableItem *returnItem = NULL; + //предена пустой указатель на предыдущий элемент, начинаем с начала + if (prev == NULL) { + prev = env->items; + } + + for (uint32_t id = 0; id < EraGlonassMsdTable_GetSize(); ++id) { + if (env->items[id].msd.MSD_Data.msgId > 0) { + returnItem = &env->items[id]; + break; + } + } + + for (uint32_t id = 0; id < EraGlonassMsdTable_GetSize(); ++id) { + if (env->items[id].msd.MSD_Data.msgId > 0) { + if (env->items[id].msd.MSD_Data.timestamp > returnItem->msd.MSD_Data.timestamp) { + returnItem = &env->items[id]; + } + } + } + return returnItem; +} + +uint32_t EraGlonassMsdTable_GetNoSendDataCount(tEraGlonassMsdTable *env) { + uint32_t count = 0; + for (uint32_t id = 0; id < EraGlonassMsdTable_GetSize(); ++id) { + if (env->items[id].attemptsLeft > 0) { + count++; + } + } + return count; +} + +uint32_t EraGlonassMsdTable_GetCount(tEraGlonassMsdTable *env) { + uint32_t count = 0; + for (uint32_t id = 0; id < EraGlonassMsdTable_GetSize(); ++id) { + if (env->items[id].msd.MSD_Data.msgId != 0) { + count++; + } + } + return count; +} + +//находим существующий мнд по ID +tEraGlonassMsdTableItem *EraGlonassMsdTable_GetById(tEraGlonassMsdTable *env, uint16_t id) { + + if (id) { + tEraGlonassMsdTableItem *end = env->items + ERA_GLONASS_MSD_TABLE_LENGTH; + for (tEraGlonassMsdTableItem *item = env->items; item < end; ++item) { + if (item->msd.MSD_Data.msgId == id) { + return item; + } + } + } + + return NULL; +} \ No newline at end of file diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..24d89bc --- /dev/null +++ b/modular.json @@ -0,0 +1,17 @@ +{ + "dep": [ + { + "type": "git", + "provider": "Smart_Components_Aurus", + "repo": "EraGlonassMsd" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file