// // Created by cfif on 14.02.23. // #include "file_logger.h" #include "string.h" #include "fs_base_func.h" void FileLogger_Init(tFileLogger *env, tDeviceStorageIni *store, tFs *fs, tRtcIO *rtc, osMutexId_t access_log, char *dirlog) { env->fs = fs; env->dirlog[0] = '\0'; strcat(env->dirlog, dirlog); env->store = store; env->access = access_log; env->rtcIo = rtc; env->rtcIo->get(env->rtcIo, &env->timestampWriteFileLogger); } // Получение имени файла лога size_t getFileNameLogger(tRtcIO *rtc, char *buf, size_t len, int32_t gr) { time_t timestamp; rtc->get(rtc, ×tamp); timestamp += gr * 3600; struct tm timestampTM; localtime_r(×tamp, ×tampTM); return strftime(buf, len, "%d-%m-%y.LOG", ×tampTM); } uint32_t getStateWriteFileLogger(tFileLogger *env) { return env->timestampWriteFileLogger; } uint16_t FileLogger_Write(tFileLogger *env, uint8_t *data, uint16_t size, uint32_t timeout) { // return 0; FIL file; FRESULT fr; if (osMutexAcquire(env->access, 8000) == osOK) { env->filename2[0] = '\0'; strcat(env->filename2, env->filename); env->rtcIo->get(env->rtcIo, &env->timestampWriteFileLogger); char FileNameLog[64]; FileNameLog[0] = '\0'; strcat(FileNameLog, env->dirlog); getFileNameLogger(env->rtcIo, &FileNameLog[strlen(FileNameLog)], sizeof(FileNameLog) - strlen(FileNameLog), env->store->nvm.Settings_General.GMTcorr_v); env->filename[0] = '\0'; strcat(env->filename, FileNameLog); fr = f_open_i(env->fs, &file, (TCHAR *) env->filename, FA_WRITE | FA_OPEN_APPEND); if (fr) { osMutexRelease(env->access); return 0; } UINT bytes_written; if (strcmp(env->filename, env->filename2) != 0) { char str[512]; reportScan(str, env->store->nvm.Settings_General.ATnum_v); fr = f_write_i(env->fs, &file, str, strlen(str), &bytes_written); } fr = f_write_i(env->fs, &file, data, size, &bytes_written); if (fr) { f_close_i(env->fs, &file); osMutexRelease(env->access); return 0; } fr = f_close_i(env->fs, &file); if (fr) { osMutexRelease(env->access); return 0; } osMutexRelease(env->access); return bytes_written; } return 0; } uint16_t FileLogger_Receive(tFileLogger *env, uint8_t *data, uint16_t size, uint32_t timeout) { return 0; } tSerialPortIO FileLogger_GetSerialIo(tFileLogger *env) { tSerialPortIO serialPortIo = { .env = env, .receive =(void *) FileLogger_Receive, .transmit =(void *) FileLogger_Write, }; return serialPortIo; }