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