From 6743c0a6eddd1b6680759bc6c8ed39da68ecd649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=86=AFSir?= Date: Sat, 4 May 2024 17:47:26 +0800 Subject: [PATCH] fix some bug & add checkDirExist() & count_files_in_dir() & createOrderFile() --- Firmware/Core/apps/src/meter.c | 126 ++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 3 deletions(-) diff --git a/Firmware/Core/apps/src/meter.c b/Firmware/Core/apps/src/meter.c index f05d473..552d6d6 100644 --- a/Firmware/Core/apps/src/meter.c +++ b/Firmware/Core/apps/src/meter.c @@ -65,7 +65,7 @@ uint8_t checkInitFile() { if (fre == FR_OK) { f_close(&SDFile); return 0; - } else if(fre == FR_NO_FILE){ + } else if (fre == FR_NO_FILE) { createConfigFile(); } f_close(&SDFile); @@ -78,6 +78,7 @@ void taxiSystemInit() { uint8_t *data; cJSON *json, *item; uint8_t res = checkInitFile(); + RTC_DateTypeDef sDate; if (res == 0) { printf("config.txt exists\r\n"); } @@ -114,6 +115,14 @@ void taxiSystemInit() { item = cJSON_GetObjectItemCaseSensitive(json, "Date"); if (item && cJSON_IsString(item)) { date = item->valuestring; + int year, month, day; + uint8_t ret = parsedate(date, &year, &month, &day); + if (ret == 0) { + sDate.Year = (uint8_t)(year % 100); + sDate.Month = (uint8_t)month; + sDate.Date = (uint8_t)day; + HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN); + } printf("Date: %s\r\n", date); } else { printf("Not find name\r\n"); @@ -161,7 +170,8 @@ void setMileage(float km) { Mileage = km; } -uint8_t writePriceToConfig(float tempPrice) { +//将价格写入到config.txt文件中 +uint8_t writePriceToConfig(const float tempPrice) { DWORD file_size; long length; FRESULT fre; @@ -220,8 +230,118 @@ uint8_t writePriceToConfig(float tempPrice) { } -void createOrderFile(){ +//检查目录是否存在,如果不存在将会创建 +uint8_t checkDirExist(const char *dir) { + FILINFO fno; + FRESULT fre; + fre = f_stat(dir, &fno); + if (fre != FR_OK) { + printf("%s dir is not exist\r\n", dir); + printf("Will create %s dir\r\n", dir); + fre = f_mkdir(dir); + if (fre != FR_OK) { + printf("create %s dir fail\r\n", dir); + return 0; + } else { + printf("create %s dir successful\r\n", dir); + return 1; + } + } + printf("%s dir exist\r\n", dir); + return 1; +} +//统计该目录下的文件个数 +int count_files_in_dir(const char *path) { + DIR dir; + FILINFO fno; + int count = 0; + FRESULT res; + res = f_opendir(&dir, path); + if (res != FR_OK) { + return -1; + } + while (1) { + res = f_readdir(&dir, &fno); + if (res != FR_OK || fno.fname[0] == 0) { + break; + } + if (fno.fname[0] == '.' && (fno.fname[1] == 0 || (fno.fname[2] == 0))) { + continue; + } + count++; + } + f_closedir(&dir); + return count; +} +//创建订单文件 +uint8_t createOrderFile() { + RTC_DateTypeDef sDate; + RTC_TimeTypeDef sTime; + char dateDir[15]; + FRESULT fre; + //检查order目录是否存在 + uint8_t ret = checkDirExist("order"); + if (ret == 0) { + printf("order dir create fail\r\n"); + return 0; + } + //检查年月日目录是否存在 + HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); + sprintf(dateDir, "order/20%02u%02u%02u", sDate.Year, sDate.Month, sDate + .Date); + ret = checkDirExist(dateDir); + if (ret == 0) { + printf("%s create fail\r\n", dateDir); + return 0; + } + //统计order/20%02u%02u%02u 下的文件个数 + int count = count_files_in_dir(dateDir); + count += 1; + + char tempString[20]; + + sprintf(tempString, "20%02u-%02u-%02u", sDate.Year, sDate.Month, sDate + .Date); + //创建JSON格式的数据 + cJSON *root = cJSON_CreateObject(); + cJSON_AddStringToObject(root, "date", tempString); + HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); + sprintf(tempString, "%02u:%02u:%02u", sTime.Hours, sTime.Minutes, sTime + .Seconds); + cJSON_AddNumberToObject(root, "id", count); + cJSON_AddStringToObject(root, "time", tempString); + sprintf(tempString, "%.2f", getPrice()); + cJSON_AddStringToObject(root, "price", tempString); + sprintf(tempString, "%.2f", getMileage()); + cJSON_AddStringToObject(root, "Mileage", tempString); + sprintf(tempString, "%.2f", (getPrice() * getMileage())); + cJSON_AddStringToObject(root, "totalPrice", tempString); + char *data = cJSON_Print(root); + + //创建文件 + char fileDir_name[25]; + sprintf(fileDir_name, "%s/%d.txt", dateDir, count); + fre = f_open(&SDFile, fileDir_name, FA_READ | FA_WRITE | FA_CREATE_NEW); + if (fre != FR_OK) { + printf("create %d.txt fail\r\n", count); + f_close(&SDFile); + return 0; + } + UINT bw; + if (f_write(&SDFile, data, strlen(data), &bw) == FR_OK) { + printf("Write %d.txt ok\r\n", count); + f_close(&SDFile); + free(data); + cJSON_Delete(root); + return 1; + } else { + printf("Write %d.txt fail\r\n", count); + f_close(&SDFile); + free(data); + cJSON_Delete(root); + return 0; + } } //定时器中断回调函数