EraGlonassMsdTable/Src/EraGlonassMsdTable.c

152 lines
4.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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