313 lines
11 KiB
C
313 lines
11 KiB
C
//
|
||
// 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;
|
||
}
|
||
*/ |