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