This commit is contained in:
cfif 2025-06-02 13:26:41 +03:00
commit 77de150d73
3 changed files with 210 additions and 0 deletions

41
Inc/EraGlonassMsdTable.h Normal file
View File

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

152
Src/EraGlonassMsdTable.c Normal file
View File

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

17
modular.json Normal file
View File

@ -0,0 +1,17 @@
{
"dep": [
{
"type": "git",
"provider": "Smart_Components_Aurus",
"repo": "EraGlonassMsd"
}
],
"cmake": {
"inc_dirs": [
"Inc"
],
"srcs": [
"Src/**.c"
]
}
}