GONEC_ARTERY_HttpServer/Src/fs_base_func.c

780 lines
19 KiB
C
Raw 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 30.01.23.
//
#include "fs_base_func.h"
#include "stdlib.h"
#include "httpd_types.h"
#include "GonetsCrcs.h"
unsigned char crc8(unsigned char *pcBlock, unsigned char len) {
unsigned char crc = 0xFF;
unsigned char i;
while (len--) {
crc ^= *pcBlock++;
for (i = 0; i < 8; i++)
crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
}
return crc;
}
//CRC
#define POLYNOMIAL 0x131 //P(x)=x^8+x^5+x^4+1 = 100110001
//============================================================
uint8_t SF04_CheckCrc(const uint8_t data[], uint8_t nbrOfBytes)
//============================================================
//calculates checksum for n bytes of data
//and compares it with expected checksum
//input: data[] checksum is built based on this data
// nbrOfBytes checksum is built for n bytes of data
// checksum expected checksum
//return: error: CHECKSUM_ERROR = checksum does not match
// 0 = checksum matches
//============================================================
{
uint8_t crc = 0;
uint8_t byteCtr;
//calculates 8-Bit checksum with given polynomial
for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr) {
crc ^= (data[byteCtr]);
for (uint8_t bit = 8; bit > 0; --bit) {
if (crc & 0x80) {
crc = (crc << 1) ^ POLYNOMIAL;
} else { crc = (crc << 1); }
}
}
return crc;
}
FRESULT scan_files(char *path, uint32_t *globDirCount, uint32_t *globFileCount) {
FRESULT res;
DIR dir;
UINT i;
static FILINFO fno;
res = f_opendir(&dir, path); // Open the directory
if (res == FR_OK) {
for (;;) {
res = f_readdir(&dir, &fno); // Read a directory item
if (res != FR_OK || fno.fname[0] == 0) break; // Break on error or end of dir
if (fno.fattrib & AM_DIR) { // It is a directory
i = strlen(path);
strcat(path, "/");
strcat(path, fno.fname);
++*globDirCount;
res = scan_files(path, globDirCount, globFileCount); // Enter the directory
if (res != FR_OK) break;
path[i] = 0;
} else { // It is a file.
++*globFileCount;
}
}
f_closedir(&dir);
}
return res;
}
void reportScan(char *str, uint32_t AT) {
char buf[12];
char buff[256];
buff[0] = '\0';
strcat(buff, "1:/");
uint32_t globDirCount = 0;
uint32_t globFileCount = 0;
scan_files(buff, &globDirCount, &globFileCount);
str[0] = '\0';
strcat(str, "АТ-");
utoa(AT, buf, 10);
strcat(str, buf);
strcat(str, "\n");
strcat(str, "Проверка диска \n");
strcat(str, "Директорий ");
utoa(globDirCount, buf, 10);
strcat(str, buf);
strcat(str, "\n");
strcat(str, "Файлов ");
utoa(globFileCount, buf, 10);
strcat(str, buf);
strcat(str, "\n");
strcat(str, "Ошибок 0 \n");
}
void toAddPrefixStr(char *out, char *in, size_t len) {
if (len <= strlen(in)) {
out[0] = '\0';
strcat(out, in);
return;
}
size_t countPrefix = len - strlen(in);
for (size_t i = 0; i < countPrefix; ++i)
out[i] = '0';
out[countPrefix] = '\0';
strcat(out, in);
}
void getDelFileDir(tFs *fs, char *path) {
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS + MAX_LEN_PATH_FS];
fr = f_findfirst_i(fs, &dj, &fno, path, "*");
while (fr == FR_OK && fno.fname[0]) {
pathTmp[0] = '\0';
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
fr = f_unlink_i(fs, pathTmp);
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
void getDelFilesDir(tFs *fs, char *path) {
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS + MAX_LEN_PATH_FS];
fr = f_findfirst_i(fs, &dj, &fno, path, "*");
while (fr == FR_OK && fno.fname[0]) {
if (fno.fattrib & AM_DIR) {
pathTmp[0] = '\0';
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
strcat(pathTmp, "/");
getDelFileDir(fs, pathTmp);
}
pathTmp[0] = '\0';
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
fr = f_unlink_i(fs, pathTmp);
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
bool getDelFileDirClean(tFs *fs, char *path) {
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS + 32];
bool isClean = true;
fr = f_findfirst_i(fs, &dj, &fno, path, "*");
if (fr == FR_OK && fno.fname[0]) {
isClean = false;
}
fr = f_closedir_i(fs, &dj);
return isClean;
}
void getDelFilesDirClean(tFs *fs, char *path) {
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS + 32];
fr = f_findfirst_i(fs, &dj, &fno, path, "*");
while (fr == FR_OK && fno.fname[0]) {
if (fno.fattrib & AM_DIR) {
pathTmp[0] = '\0';
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
strcat(pathTmp, "/");
if (getDelFileDirClean(fs, pathTmp)) {
fr = f_unlink_i(fs, pathTmp);
}
}
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
void getDelFileDirDatTracert(tFs *fs, char *path) {
FILINFO fnoInf;
FRESULT frInf;
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS];
bool isClean = true;
fr = f_findfirst_i(fs, &dj, &fno, path, "*.DAT");
while (fr == FR_OK && fno.fname[0]) {
pathTmp[0] = 0;
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
pathTmp[strlen(pathTmp) - 3] = 'O';
pathTmp[strlen(pathTmp) - 2] = 'T';
pathTmp[strlen(pathTmp) - 1] = 'M';
frInf = f_stat(pathTmp, &fnoInf);
if (frInf == FR_NO_FILE) {
pathTmp[0] = 0;
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
fr = f_unlink_i(fs, pathTmp);
}
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
void getDelFileDirDatInbox(tFs *fs, char *path, char *ext) {
FILINFO fnoInf;
FRESULT frInf;
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS];
bool isClean = true;
fr = f_findfirst_i(fs, &dj, &fno, path, "*.DAT");
while (fr == FR_OK && fno.fname[0]) {
pathTmp[0] = 0;
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
pathTmp[strlen(pathTmp) - 3] = ext[0];//'I';
pathTmp[strlen(pathTmp) - 2] = ext[1];//'T';
pathTmp[strlen(pathTmp) - 1] = ext[2];//'M';
frInf = f_stat(pathTmp, &fnoInf);
if (frInf == FR_NO_FILE) {
pathTmp[0] = 0;
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
fr = f_unlink_i(fs, pathTmp);
}
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
void getDelFilesDirDat(tFs *fs, char *path, char *ext) {
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS];
fr = f_findfirst_i(fs, &dj, &fno, path, "*");
while (fr == FR_OK && fno.fname[0]) {
if (fno.fattrib & AM_DIR) {
pathTmp[0] = '\0';
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
strcat(pathTmp, "/");
getDelFileDirDatInbox(fs, pathTmp, ext);
}
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
void getPath(char *pathIn, char *pathOut, int count_dir) {
char tmp[2];
int step_dir = 0;
pathOut[0] = 0;
for (uint32_t i = 0; i < strlen(pathIn); ++i) {
if (pathIn[i] == '/')
++step_dir;
tmp[0] = toupper(pathIn[i]);
tmp[1] = 0;
strcat(pathOut, tmp);
if (step_dir == count_dir)
break;
}
}
// Получение указателя на расширение файла
char *getVoidExt(char *buf) {
char *p = buf;
for (size_t i = 0; i < strlen(buf); ++i) {
if (*p == '.')
return p;
++p;
}
return p;
}
// Получение имени файла лога
size_t getFileNameLog(tRtcIO *rtc, char *buf, size_t len) {
struct tm dateTime;
rtc->getTM(rtc, &dateTime);
return strftime(buf, len, "%d-%m-%y.LOG", &dateTime);
}
// Получение строки дата
size_t getDateStr(tRtcIO *rtc, char *buf, size_t len) {
struct tm dateTime;
rtc->getTM(rtc, &dateTime);
return strftime(buf, len, "%Y%m%d", &dateTime);
}
// Получение строки дата время в UTC
size_t getDataTimeUTC(time_t *timestamp, char *buf, size_t len) {
struct tm dateTime;
localtime_r(timestamp, &dateTime);
// return strftime(buf, len, "%FT%T+03:00", dateTime);
return strftime(buf, len, "%FT%T", &dateTime);
}
// Получение строки дата время в UTC
size_t getDataTimeUTC_Ex(struct tm *dateTime, char *buf, size_t len) {
// return strftime(buf, len, "%FT%T+03:00", dateTime);
return strftime(buf, len, "%FT%T", dateTime);
}
// Получение строки дата/время
size_t getDataTime(time_t *timestamp, char *buf, size_t len) {
struct tm dateTime;
localtime_r(timestamp, &dateTime);
return strftime(buf, len, "%d-%m-%g %T", &dateTime);
}
// Удаление всех файлов в директории
bool delDirFileFs(tFs *fs, char *dir) {
FRESULT fr;
DIR dj;
FILINFO fno;
char dirScan[MAX_LEN_PATH_FS];
dirScan[0] = '\0';
strcat(dirScan, dir);
char dirFileScan[MAX_LEN_PATH_FS];
fr = f_findfirst_i(fs, &dj, &fno, dirScan, "*");
if (fr)
return false;
while (fr == FR_OK && fno.fname[0]) {
dirFileScan[0] = '\0';
strcat(dirFileScan, dirScan);
strcat(dirFileScan, fno.fname);
fr = f_unlink_i(fs, dirFileScan);
fr = f_findnext_i(fs, &dj, &fno);
if (fr) {
fr = f_closedir_i(fs, &dj);
return Post_FS_ERR;
}
}
fr = f_closedir_i(fs, &dj);
return true;
}
FRESULT deleteAllDir(tFs *fs, char *path) {
FRESULT res;
FILINFO fno;
DIR dir;
int i;
char *fn;
res = f_opendir_i(fs, &dir, path); // Открытие директории
if (res == FR_OK) {
i = strlen(path);
for (;;) {
res = f_readdir(&dir, &fno); // Чтение объекта директории
if (res != FR_OK || fno.fname[0] == 0)
break; // Останов цикла при ошибке или при достижении конца списка директории
fn = fno.fname;
if (fno.fattrib & AM_DIR) { // Это директория
//strcat(path, "/");
//strcat(path, fn);
strcat(&path[i], "/");
strcat(&path[i + 1], fn);
res = deleteAllDir(fs, path);
f_unlink_i(fs, path);
if (res != FR_OK) break;
path[i] = 0;
} else { // Это файл
char pathFile[MAX_LEN_PATH_FS];
pathFile[0] = '\0';
strcat(pathFile, path);
strcat(pathFile, "/");
strcat(pathFile, fn);
f_unlink_i(fs, pathFile);
}
}
f_closedir_i(fs, &dir);
}
return res;
}
bool CopyFileFs_crc_md5(tFs *fs, uint32_t typeCrc, md5a_context *md5ctx, char *filenameTo, char *filenameFrom,
uint32_t offset, uint32_t initCrc32) {
FIL fsrc, fdst; // File objects
BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br, bw; // File read/write count
uint32_t crc32 = 0;
uint32_t crc32_update = 0;
uint32_t init = initCrc32;
fr = f_open_i(fs, &fsrc, filenameFrom, FA_READ);
if (fr) return false;
fr = f_lseek_i(fs, &fsrc, offset);
if (fr) return false;
fr = f_open_i(fs, &fdst, filenameTo, FA_OPEN_APPEND | FA_WRITE);
if (fr) return false;
for (;;) {
f_read_i(fs, &fsrc, buffer, sizeof(buffer), &br);
if (br == 0) break;
// crc32
if (typeCrc == 1) {
crc32_update = GonetsCrc32_update(buffer, br, init);
init = crc32_update;
}
// md5
if (typeCrc == 2) {
md5a_update(md5ctx, buffer, (int) br);
}
f_write_i(fs, &fdst, buffer, br, &bw);
if (bw < br) break;
}
// crc32
if (typeCrc == 1) {
crc32 = GonetsCrc32_finish(crc32_update);
fr = f_write_i(fs, &fdst, &crc32, 4, &bw);
}
// md5
if (typeCrc == 2) {
uint8_t md5sum[16];
md5a_finish(md5ctx, md5sum);
f_write_i(fs, &fdst, md5sum, sizeof(md5sum), &bw);
}
f_close_i(fs, &fsrc);
f_close_i(fs, &fdst);
return true;
}
//BYTE buffer_crc[512 * 20];
uint32_t CrcFileFs(tFs *fs, char *filename) {
FIL fsrc; // File objects
// BYTE buffer_crc[512 * 2];
// BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br; // File read/write count
BYTE buffer_crc[512];
uint32_t init = 0xFFFFFFFF;
fr = f_open_i(fs, &fsrc, filename, FA_READ);
for (;;) {
f_read_i(fs, &fsrc, buffer_crc, sizeof(buffer_crc), &br);
if (br == 0) break;
init = GonetsCrc32_noreverse_update(buffer_crc, br, init);
}
f_close_i(fs, &fsrc);
init = GonetsCrc32_noreverse_finish(init);
return init;
}
bool CopyFileFs(tFs *fs, char *filenameTo, char *filenameFrom, uint32_t offset) {
FIL fsrc, fdst; // File objects
BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br, bw; // File read/write count
fr = f_open_i(fs, &fsrc, filenameFrom, FA_READ);
if (fr) return false;
fr = f_lseek_i(fs, &fsrc, offset);
if (fr) return false;
fr = f_open_i(fs, &fdst, filenameTo, FA_OPEN_APPEND | FA_WRITE);
if (fr) return false;
for (;;) {
f_read_i(fs, &fsrc, buffer, sizeof(buffer), &br);
if (br == 0) break;
f_write_i(fs, &fdst, buffer, br, &bw);
if (bw < br) break;
}
f_close_i(fs, &fsrc);
f_close_i(fs, &fdst);
return true;
}
bool
CopyFileTrucSizeFs(tFs *fs, uint32_t typeCrc, md5a_context *md5ctx,
uint32_t *crc32sum, uint8_t *md5sum,
uint32_t *crc32sumFile, uint8_t *md5sumFile,
char *filenameTo, char *filenameFrom,
uint32_t offset, uint32_t truncBytes, uint32_t size) {
FIL fsrc, fdst; // File objects
BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br, bw; // File read/write count
uint32_t crc32_update;
uint32_t init = 0xFFFFFFFF;
uint32_t count = (size - offset - truncBytes) / sizeof(buffer);
uint32_t tail = (size - offset - truncBytes) % sizeof(buffer);
fr = f_open_i(fs, &fsrc, filenameFrom, FA_READ);
if (fr) return false;
fr = f_lseek_i(fs, &fsrc, offset);
if (fr) return false;
fr = f_open_i(fs, &fdst, filenameTo, FA_OPEN_APPEND | FA_WRITE);
if (fr) return false;
for (uint32_t i = 0; i < count; ++i) {
f_read_i(fs, &fsrc, buffer, sizeof(buffer), &br);
// crc32
if (typeCrc == 1) {
crc32_update = GonetsCrc32_update(buffer, br, init);
init = crc32_update;
}
// md5
if (typeCrc == 2) {
md5a_update(md5ctx, buffer, (int) br);
}
if (br == 0) break;
f_write_i(fs, &fdst, buffer, br, &bw);
if (bw < br) break;
}
f_read_i(fs, &fsrc, buffer, tail, &br);
// crc32
if (typeCrc == 1) {
crc32_update = GonetsCrc32_update(buffer, br, init);
init = crc32_update;
}
// md5
if (typeCrc == 2) {
md5a_update(md5ctx, buffer, (int) br);
}
f_write_i(fs, &fdst, buffer, br, &bw);
// crc32
if (typeCrc == 1) {
f_read_i(fs, &fsrc, crc32sumFile, 4, &br);
*crc32sum = GonetsCrc32_finish(crc32_update);
}
// md5
if (typeCrc == 2) {
f_read_i(fs, &fsrc, md5sumFile, 16, &br);
md5a_finish(md5ctx, md5sum);
}
f_close_i(fs, &fsrc);
f_close_i(fs, &fdst);
return true;
}
// Получене crc
uint32_t GetCrcFileisOpenFs(tFs *fs, FIL *fsrc, uint32_t offset) {
BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br; // File read/write count
uint32_t crc = 0;
fr = f_lseek_i(fs, fsrc, offset);
if (fr) return false;
for (;;) {
f_read_i(fs, fsrc, buffer, sizeof(buffer), &br);
for (size_t i = 0; i < br; ++i) {
crc += buffer[i];
}
if (br == 0) break;
}
return crc;
}
// Получене crc
uint32_t GetCrcFileFs(tFs *fs, char *filename, uint32_t offset) {
FIL fsrc; // File objects
BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br; // File read/write count
uint32_t crc = 0;
fr = f_open_i(fs, &fsrc, filename, FA_READ);
if (fr) return 0;
fr = f_lseek_i(fs, &fsrc, offset);
if (fr) return false;
for (;;) {
fr = f_read_i(fs, &fsrc, buffer, sizeof(buffer), &br);
for (size_t i = 0; i < br; ++i) {
crc += buffer[i];
}
if (fr) {
return 0;
}
if (br == 0)
break;
}
f_close_i(fs, &fsrc);
return crc;
}
/*
BYTE bufferSizeMaxCopy[1300]; // File copy buffer
bool CopyFileFsSize(tFs *fs, char *filenameTo, char *filenameFrom, uint32_t offset, uint32_t max) {
FIL fsrc, fdst; // File objects
FRESULT fr; // FatFs function common result code
UINT br, bw; // File read/write count
fr = f_open_i(fs, &fsrc, filenameFrom, FA_READ);
if (fr) return false;
fr = f_lseek_i(fs, &fsrc, offset);
if (fr) return false;
fr = f_open_i(fs, &fdst, filenameTo, FA_OPEN_APPEND | FA_WRITE);
if (fr) return false;
// for (;;) {
f_read_i(fs, &fsrc, bufferSizeMaxCopy, max, &br);
// if (br == 0) break;
f_write_i(fs, &fdst, bufferSizeMaxCopy, br, &bw);
// if (bw < br) break;
// }
f_close_i(fs, &fsrc);
f_close_i(fs, &fdst);
return true;
}
*/