SMART_COMPONENTS_Egts/EgtsTeledataStoragePoint.c

313 lines
11 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 cfif on 02.08.2024.
//
#include "EgtsTeledataStoragePoint.h"
#include "lfs_file_utils.h"
#define LOG_SIGN "EGTS STORE"
#define LOGGER &env->slog->logger
extern const tStringStatic textEgtsEventTetedata[];
extern void addTeledataQueue(tEgtsProcessing *env, tEgtsTeledata *egtsTeledata);
bool getPointStorageCount(tEgtsProcessing *env, uint32_t *countValidPoints) {
int lfs_err;
lfs_file_t file;
tEgtsStorageTeledata egtsStorageTeledata;
*countValidPoints = 0;
lfs_err = lfs_file_open(&env->fs->lfs, &file, "points.bin", LFS_O_RDONLY);
if (lfs_err != 0) {
return false;
}
lfs_soff_t fileSize = lfs_file_size(&env->fs->lfs, &file);
// lfs_err = lfs_file_rewind(&env->fs->lfs, &file);
int32_t seek = lfs_file_seek(&env->fs->lfs, &file, env->pPointsStorageSent * sizeof(tEgtsStorageTeledata),
LFS_SEEK_SET);
uint32_t countPoints = fileSize / sizeof(tEgtsStorageTeledata) - env->pPointsStorageSent;
for (uint32_t i = 0; i < countPoints; ++i) {
int reading = lfs_file_read(&env->fs->lfs, &file, &egtsStorageTeledata, sizeof(tEgtsStorageTeledata));
if (reading != sizeof(tEgtsStorageTeledata)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка чтения файла: points.bin")
lfs_err = lfs_file_close(&env->fs->lfs, &file);
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
uint32_t crcCalc = lfs_crc(0, &egtsStorageTeledata,
sizeof(tEgtsStorageTeledata) - sizeof(egtsStorageTeledata.crc));
if (egtsStorageTeledata.crc != crcCalc) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка контрольной суммы файла: points.bin")
lfs_err = lfs_file_close(&env->fs->lfs, &file);
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
if (egtsStorageTeledata.isValid) {
++(*countValidPoints);
}
}
if (*countValidPoints == 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление точек из хранилища")
lfs_err = lfs_file_close(&env->fs->lfs, &file);
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
lfs_err = lfs_file_close(&env->fs->lfs, &file);
return true;
}
bool dumpPointStorage(tEgtsProcessing *env, tEgtsTeledata *egtsTeledata, bool over) {
if (env->egtsTeledataSent.egtsPosDataArgs.SRC < 88) {
LoggerStrFormatInfo(LOGGER, LOG_SIGN, "Сохранение точки в хранилище, событие: %s",
textEgtsEventTetedata[egtsTeledata->egtsPosDataArgs.SRC].data);
} else {
LoggerStrFormatInfo(LOGGER, LOG_SIGN, "Неизвестное событие. Сохранение точки в хранилище, событие: %d",
env->egtsTeledataSent.egtsPosDataArgs.SRC);
}
if ((egtsTeledata->egtsPosDataArgs.SRC != EVENT_EMERGENCY_CALL) &&
(egtsTeledata->egtsPosDataArgs.SRC != EVENT_USER_CALL) &&
(egtsTeledata->egtsPosDataArgs.SRC != EVENT_VEH_STATE_CHANGED) &&
(egtsTeledata->egtsPosDataArgs.SRC != EVENT_ROTATE_ANGLE_LIMIT) &&
(egtsTeledata->egtsPosDataArgs.SRC != EVENT_NAVIGATION_START_STOP)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Точка не критичная. Сохранение отменено")
return true;
}
int freeBlock = getFreeSize(&env->fs->lfs);
int lfs_err;
// 25
if (freeBlock < 2) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "В хранилище закончилась память")
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
} else {
// LoggerStrFormatInfo(LOGGER, LOG_SIGN, "Блоков, свободно: %d", freeBlock);
}
/*
if (over) {
if (freeBlock <= 10) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "В хранилище закончилась память")
return false;
}
} else {
if (freeBlock <= 25) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "В хранилище закончилась память")
return false;
}
}
*/
lfs_file_t file;
lfs_err = lfs_file_open(&env->fs->lfs, &file, "points.bin", LFS_O_WRONLY | LFS_O_APPEND | LFS_O_CREAT);
if (lfs_err != 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка открытия файла (запись): points.bin")
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
tEgtsStorageTeledata egtsStorageTeledata;
egtsStorageTeledata.egtsPosDataArgs = egtsTeledata->egtsPosDataArgs;
egtsStorageTeledata.egtsExtPositionDataArgs = egtsTeledata->egtsExtPositionDataArgs;
egtsStorageTeledata.egtsSensorsDigArgs = egtsTeledata->egtsSensorsDigArgs;
egtsStorageTeledata.egtsSensorsAnArgs = egtsTeledata->egtsSensorsAnArgs;
egtsStorageTeledata.isValid = true;
egtsStorageTeledata.crc = lfs_crc(0, &egtsStorageTeledata,
sizeof(tEgtsStorageTeledata) - sizeof(egtsStorageTeledata.crc));
int writes = lfs_file_write(&env->fs->lfs, &file, &egtsStorageTeledata, sizeof(tEgtsStorageTeledata));
if (writes != sizeof(tEgtsStorageTeledata)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка записи файла: points.bin")
lfs_err = lfs_file_close(&env->fs->lfs, &file);
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
lfs_err = lfs_file_close(&env->fs->lfs, &file);
if (lfs_err != 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка записи файла: points.bin")
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
return true;
}
bool loadPointStorage(tEgtsProcessing *env, tEgtsTeledata *egtsTeledata) {
int lfs_err;
lfs_file_t file;
lfs_err = lfs_file_open(&env->fs->lfs, &file, "points.bin", LFS_O_RDONLY);
if (lfs_err != 0) {
return false;
}
tEgtsStorageTeledata egtsStorageTeledata;
egtsStorageTeledata.egtsPosDataArgs = egtsTeledata->egtsPosDataArgs;
egtsStorageTeledata.egtsExtPositionDataArgs = egtsTeledata->egtsExtPositionDataArgs;
egtsStorageTeledata.egtsSensorsDigArgs = egtsTeledata->egtsSensorsDigArgs;
egtsStorageTeledata.egtsSensorsAnArgs = egtsTeledata->egtsSensorsAnArgs;
lfs_soff_t fileSize = lfs_file_size(&env->fs->lfs, &file);
// lfs_err = lfs_file_rewind(&env->fs->lfs, &file);
int32_t seek = lfs_file_seek(&env->fs->lfs, &file, env->pPointsStorageSent * sizeof(tEgtsStorageTeledata),
LFS_SEEK_SET);
// uint32_t countPoints = fileSize / sizeof(tEgtsStorageTeledata);
// for (uint32_t i = 0; i < countPoints; ++i) {
int reading = lfs_file_read(&env->fs->lfs, &file, &egtsStorageTeledata, sizeof(tEgtsStorageTeledata));
if (reading != sizeof(tEgtsStorageTeledata)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка чтения файла: points.bin")
lfs_err = lfs_file_close(&env->fs->lfs, &file);
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
uint32_t crcCalc = lfs_crc(0, &egtsStorageTeledata,
sizeof(tEgtsStorageTeledata) - sizeof(egtsStorageTeledata.crc));
if (egtsStorageTeledata.crc != crcCalc) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка контрольной суммы файла: points.bin")
lfs_err = lfs_file_close(&env->fs->lfs, &file);
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
if (egtsStorageTeledata.isValid) {
lfs_err = lfs_file_close(&env->fs->lfs, &file);
egtsTeledata->egtsPosDataArgs = egtsStorageTeledata.egtsPosDataArgs;
egtsTeledata->egtsExtPositionDataArgs = egtsStorageTeledata.egtsExtPositionDataArgs;
egtsTeledata->egtsSensorsDigArgs = egtsStorageTeledata.egtsSensorsDigArgs;
egtsTeledata->egtsSensorsAnArgs = egtsStorageTeledata.egtsSensorsAnArgs;
return true;
}
// }
lfs_err = lfs_file_close(&env->fs->lfs, &file);
return false;
}
bool deleteFilePointStorage(tEgtsProcessing *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление точек из хранилища")
int lfs_err = lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
if (lfs_err != 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка удаления файла: points.bin")
return false;
}
return true;
}
/*
bool deletePointStorage(tEgtsProcessing *env, tEgtsTeledata *egtsTeledata) {
int lfs_err;
lfs_file_t file;
tEgtsStorageTeledata egtsStorageTeledata;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление точки из хранилища")
lfs_err = lfs_file_open(&env->fs->lfs, &file, "points.bin", LFS_O_RDWR);
if (lfs_err != 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка открытия файла (чтение): points.bin")
return false;
}
lfs_soff_t fileSize = lfs_file_size(&env->fs->lfs, &file);
lfs_err = lfs_file_rewind(&env->fs->lfs, &file);
uint32_t countPoints = fileSize / sizeof(tEgtsStorageTeledata);
for (uint32_t i = 0; i < countPoints; ++i) {
int reading = lfs_file_read(&env->fs->lfs, &file, &egtsStorageTeledata, sizeof(tEgtsStorageTeledata));
if (reading != sizeof(tEgtsStorageTeledata)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка чтения файла: points.bin")
lfs_err = lfs_file_close(&env->fs->lfs, &file);
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
uint32_t crcCalc = lfs_crc(0, &egtsStorageTeledata,
sizeof(tEgtsStorageTeledata) - sizeof(egtsStorageTeledata.crc));
if (egtsStorageTeledata.crc != crcCalc) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка контрольной суммы файла: points.bin")
lfs_err = lfs_file_close(&env->fs->lfs, &file);
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
if (egtsStorageTeledata.isValid) {
egtsStorageTeledata.isValid = false;
egtsStorageTeledata.crc = lfs_crc(0, &egtsStorageTeledata,
sizeof(tEgtsStorageTeledata) - sizeof(egtsStorageTeledata.crc));
int32_t seek = lfs_file_seek(&env->fs->lfs, &file, i * sizeof(tEgtsStorageTeledata) + sizeof(tEgtsStorageTeledata)- 8, LFS_SEEK_SET);
int writes = lfs_file_write(&env->fs->lfs, &file, &egtsStorageTeledata, 8);
if (writes != 8) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка записи файла: points.bin")
lfs_err = lfs_file_close(&env->fs->lfs, &file);
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
lfs_err = lfs_file_close(&env->fs->lfs, &file);
if (lfs_err != 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка записи файла: points.bin")
lfs_err = lfs_remove(&env->fs->lfs, "points.bin");
return false;
}
return true;
}
}
lfs_err = lfs_file_close(&env->fs->lfs, &file);
return true;
}
*/