Init
This commit is contained in:
commit
77de150d73
|
|
@ -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
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"dep": [
|
||||||
|
{
|
||||||
|
"type": "git",
|
||||||
|
"provider": "Smart_Components_Aurus",
|
||||||
|
"repo": "EraGlonassMsd"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"cmake": {
|
||||||
|
"inc_dirs": [
|
||||||
|
"Inc"
|
||||||
|
],
|
||||||
|
"srcs": [
|
||||||
|
"Src/**.c"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue