diff --git a/code/application/source/sf_app/code/include/sf_mmc_dev.h b/code/application/source/sf_app/code/include/sf_mmc_dev.h new file mode 100755 index 000000000..16cbb8c7a --- /dev/null +++ b/code/application/source/sf_app/code/include/sf_mmc_dev.h @@ -0,0 +1,82 @@ +/************************************************************************** + * + * Copyright (c) 2015-2021 by WuYuan Technology, Inc. + * + * This software is copyrighted by and is the property of SiFar + * Technology, Inc.. All rights are reserved by SiFar Technology, Inc.. + * This software may only be used in accordance with the corresponding + * license agreement. Any unauthorized use, duplication, distribution, + * or disclosure of this software is expressly forbidden. + * + * This Copyright notice MUST not be removed or modified without prior + * written consent of SiFar Technology, Inc.. + * + * WuYuan Technology, Inc. reserves the right to modify this software without notice. + * + * Author: Sober + * Ver: 1.0.0 2023.12.23 + * Description: Creat +**************************************************************************/ +#ifndef _SF_MMC_DEV_H_ +#define _SF_MMC_DEV_H_ +#include "sf_type.h" +#include "sf_param_common.h" + +#define MMC_DEV_MAX_NUM (2) + +#define SD_NODES_NAME "/dev/mmcblk0" +#define SD_DEVICE_NAME "/dev/mmcblk0p1" +#define SD_MOUNT_ROOT "/mnt/sd" + +#define EMMC_NODES_NAME "/dev/mmcblk1" +#define EMMC_DEVICE_NAME "/dev/mmcblk1p1" +#define EMMC_MOUNT_ROOT "/mnt/sd2" + + +typedef enum +{ + MMC_DEV_SD = 0, + MMC_DEV_EMMC = 1, + MMC_DEV_NO = 2, +}MMC_DEV_TYPE; + +typedef enum +{ + MMC_DEV_NODE_STATE_NO = 0, + MMC_DEV_NODE_STATE_EXIST = 1, + MMC_DEV_NODE_STATE_NO_EXIST = 2, +}MMC_DEV_NODE_STATE; + +typedef enum +{ + MMC_DEV_MOUNT_STATE_NO = 0, + MMC_DEV_MOUNT_STATE_MOUNTED = 1, + MMC_DEV_MOUNT_STATE_UNMOUNTED = 2, +}MMC_DEV_MOUNT_STATE; + +typedef enum +{ + MMC_DEV_SPACE_STATE_NO = 0, + MMC_DEV_SPACE_STATE_ENOUGH = 1, + MMC_DEV_SPACE_STATE_NO_ENOUGH = 2, +}MMC_DEV_SPACE_STATE; + +typedef enum +{ + MMC_DEV_LOOP_STATE_NO = 0, + MMC_DEV_LOOP_STATE_ON = 1, + MMC_DEV_LOOP_STATE_OFF = 2, +}MMC_DEV_LOOP_STATE; + +typedef struct +{ + MMC_DEV_NODE_STATE node; + MMC_DEV_MOUNT_STATE moumted_state; + MMC_DEV_SPACE_STATE space_state; + MMC_DEV_LOOP_STATE loop_state; +}SF_ST_MMC_DEV; + + + +#endif + diff --git a/code/application/source/sf_app/code/source/app/sf_common.c b/code/application/source/sf_app/code/source/app/sf_common.c index 5ac84f093..82b740490 100755 --- a/code/application/source/sf_app/code/source/app/sf_common.c +++ b/code/application/source/sf_app/code/source/app/sf_common.c @@ -596,6 +596,9 @@ static SINT32 sf_app_process_cmd_SD(SF_MESSAGE_BUF_S *pMessageBuf) SINT16 startup = sf_poweron_type_get(); MLOGD("[%d,%s]\n",pMessageBuf->arg1,app_process_SD_getstatusstring(pMessageBuf->arg1)); + + sf_mmc_dev_register(pMessageBuf); + switch(pMessageBuf->arg1) { case CMD_SD_STRG_CB_UNKNOWN: diff --git a/code/application/source/sf_app/code/source/storeMng/sf_mmc_dev.c b/code/application/source/sf_app/code/source/storeMng/sf_mmc_dev.c new file mode 100755 index 000000000..852a6462a --- /dev/null +++ b/code/application/source/sf_app/code/source/storeMng/sf_mmc_dev.c @@ -0,0 +1,277 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "DCF.h" +#include "sf_type.h" +#include "sf_log.h" +#include "sf_fileMng.h" +#include "sf_storeMng.h" + +typedef struct +{ + int event; + int dev_id; + int mounted_status; +}STRG_CB_PARAM; + + +static SF_ST_MMC_DEV sf_mmc_dev[SF_ST_MMC_DEV] = {0}; + +SINT32 sf_mmc_dev_space_check_full(const char *mountPath, SF_STORE_ATTR_S *pstoreattrs) +{ + SF_COMM_CHECK_POINTER(pstoreattrs,SF_FAILURE); + + SINT32 fd = -1; + UINT32 Isfull = 0; + fd = open(mountPath, O_RDONLY,0); + if(fd >= 0) + { + struct statfs diskInfo; + statfs(mountPath, &diskInfo); + + if(diskInfo.f_bsize > 1024) + { + pstoreattrs->SDTotalSize = (diskInfo.f_blocks * (diskInfo.f_bsize >> 10)) >> 10 ; //blocks * 4096 / 1024 /1024 = MB + pstoreattrs->SDFree = (diskInfo.f_bavail * (diskInfo.f_bsize >> 10)) >> 10 ; + } + else + { + pstoreattrs->SDTotalSize = (diskInfo.f_blocks * diskInfo.f_bsize) >> 10 ; //blocks * 4096 / 1024 /1024 = MB + pstoreattrs->SDFree = (diskInfo.f_bavail * diskInfo.f_bsize) >> 10 ; + } + close(fd); + + if(pstoreattrs->SDTotalSize > 0) + pstoreattrs->SDStatus = 0; //SD card SUCESS + else + pstoreattrs->SDStatus = 2; //SD card ERROR + } + else + { + pstoreattrs->SDStatus = 1; //SD card not insert + pstoreattrs->SDFree = 0; + pstoreattrs->SDTotalSize = 0; + return SF_FAILURE; + } + + MLOGD("SDStatus = %d,SDFree = %d MB,SDTotalSize = %d MB\n", pstoreattrs->SDStatus, pstoreattrs->SDFree,pstoreattrs->SDTotalSize); + + if(pstoreattrs.SDStatus != 0) + return pstoreattrs.SDStatus; + + Isfull = (pstoreattrs.SDFree <= SD_WARNING_SPACE)?1:0; + return Isfull; + +} + + +static int sf_mmc_dev_node_check(const char *devName) +{ + int tryCnt = 200; + int ret = access(devName, F_OK); + while (ret != 0 && tryCnt--) + { + usleep(10*1000); + ret = access(devName, F_OK); + } + + if (tryCnt < 0) + { + HAL_MMC_LOG("no found %s\n", devName); + return -1; + } + return ret; +} + +void sf_mmc_dev_register(SF_MESSAGE_BUF_S *pMessageBuf) +{ + STRG_CB_PARAM strg_cb_param; + + UIMenuStoreInfo *puiPara = sf_ui_para_get(); + strg_cb_param.event = pMessageBuf->arg1; + strg_cb_param.dev_id = pMessageBuf->arg2; + strg_cb_param.mounted_status = pMessageBuf->arg3; + + if(strg_cb_param.dev_id == MMC_DEV_SD) + { + if(strg_cb_param.event == CMD_SD_STRG_CB_INSERTED) + { + sf_mmc_dev[MMC_DEV_SD].node == MMC_DEV_NODE_STATE_EXIST; + } + else if(strg_cb_param.event == CMD_SD_STRG_CB_REMOVED) + { + sf_mmc_dev[MMC_DEV_SD].node == MMC_DEV_NODE_STATE_NO_EXIST; + } + else if(strg_cb_param.event == CMD_SD_STRG_CB_MOUNT_FINISH) + { + sf_mmc_dev[MMC_DEV_SD].moumted_state = MMC_DEV_MOUNT_STATE_MOUNTED; + } + else if(strg_cb_param.event == CMD_SD_STRG_CB_UNMOUNT_FINISH) + { + sf_mmc_dev[MMC_DEV_SD].moumted_state = MMC_DEV_MOUNT_STATE_UNMOUNTED; + } + + UINT32 isfull = sf_mmc_dev_space_check_full(SD_MOUNT_ROOT); + if(isfull == 1) + { + sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_NO_ENOUGH; + } + else if(isfull == 0) + { + sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH; + } + + if(puiPara->SdLoopSwitch == 1) + { + sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON; + } + else if(puiPara->SdLoopSwitch == 0) + { + sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_OFF; + } + + } + else if(strg_cb_param.dev_id == MMC_DEV_EMMC) + { + if(sf_mmc_dev_node_check(EMMC_DEVICE_NAME) == 0) + { + sf_mmc_dev[MMC_DEV_EMMC].node == MMC_DEV_NODE_STATE_EXIST; + } + else + { + sf_mmc_dev[MMC_DEV_EMMC].node == MMC_DEV_NODE_STATE_NO_EXIST; + } + + if(strg_cb_param.event == CMD_SD_STRG_CB_MOUNT_FINISH) + { + sf_mmc_dev[MMC_DEV_EMMC].moumted_state = MMC_DEV_MOUNT_STATE_MOUNTED; + } + else if(strg_cb_param.event == CMD_SD_STRG_CB_UNMOUNT_FINISH) + { + sf_mmc_dev[MMC_DEV_EMMC].moumted_state = MMC_DEV_MOUNT_STATE_UNMOUNTED; + } + + UINT32 isfull = sf_mmc_dev_space_check_full(EMMC_MOUNT_ROOT); + if(isfull == 1) + { + sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_NO_ENOUGH; + } + else if(isfull == 0) + { + sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH; + } + + if(puiPara->SdLoopSwitch == 1) + { + sf_mmc_dev[MMC_DEV_EMMC].loop_state == MMC_DEV_LOOP_STATE_ON; + } + else if(puiPara->SdLoopSwitch == 0) + { + sf_mmc_dev[MMC_DEV_EMMC].loop_state == MMC_DEV_LOOP_STATE_OFF; + } + } +} + +MMC_DEV_TYPE sf_mmc_check_workable_dev(void) +{ + MMC_DEV_TYPE workable_dev = MMC_DEV_NO; + + if(sf_mmc_dev[MMC_DEV_EMMC].node == MMC_DEV_NODE_STATE_NO_EXIST) //EMMC节点不存在 + { + if(sf_mmc_dev[MMC_DEV_EMMC].moumted_state == MMC_DEV_MOUNT_STATE_MOUNTED) + { + if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_EMMC; + } + else if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_NO_ENOUGH) + { + if(sf_mmc_dev[MMC_DEV_EMMC].loop_state == MMC_DEV_LOOP_STATE_ON) + { + workable_dev = MMC_DEV_EMMC; + } + } + } + } + else if(sf_mmc_dev[MMC_DEV_SD].node == MMC_DEV_NODE_STATE_NO_EXIST) //SD节点不存在 + { + if(sf_mmc_dev[MMC_DEV_SD].moumted_state == MMC_DEV_MOUNT_STATE_MOUNTED) + { + if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_SD; + } + else if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_NO_ENOUGH) + { + if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON) + { + workable_dev = MMC_DEV_SD; + } + } + } + } + else //MMC节点都存在 + { + if(sf_mmc_dev[MMC_DEV_SD].moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED) + { + if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_EMMC; + } + else + { + if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON) + { + workable_dev = MMC_DEV_EMMC; + } + } + } + else if(sf_mmc_dev[MMC_DEV_EMMC].moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED) + { + if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_SD; + } + else + { + if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON) + { + workable_dev = MMC_DEV_SD; + } + } + } + else + { + if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH && + sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_EMMC; + } + else if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_EMMC; + } + else if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_SD; + } + else + { + if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON) + { + workable_dev = MMC_DEV_EMMC; + } + } + } + } + return workable_dev; +} diff --git a/rtos/code/application/source/cardv/SrcCode/System/sys_filesys.c b/rtos/code/application/source/cardv/SrcCode/System/sys_filesys.c index ae1dc14be..ce0bf9376 100755 --- a/rtos/code/application/source/cardv/SrcCode/System/sys_filesys.c +++ b/rtos/code/application/source/cardv/SrcCode/System/sys_filesys.c @@ -105,18 +105,20 @@ static void card_insert_job(void) // call the function to wait init finish FileSys_WaitFinishEx('A'); FileSys_SetParamEx('A', FST_PARM_UPDATE_FSINFO , TRUE); + + sf_rtos_mmc_dev_register(0, ret); #if HUNTING_CAMERA_MCU == ENABLE - if(TRUE == sf_check_card_full()) - { - DBG_WRN("ERR card full\r\n"); - fastboot_set_done(BOOT_INIT_FILESYSOK); - } - else - { - fastboot_set_done(BOOT_INIT_FILESYSOK); + //if(TRUE == sf_check_card_full()) + //{ + //DBG_WRN("ERR card full\r\n"); + //fastboot_set_done(BOOT_INIT_FILESYSOK); + //} + //else + //{ + // sf_log_confg(); // sf_log_open(); - } + //} #endif #if FS_MULTI_STRG_FUNC @@ -139,10 +141,11 @@ static void card_insert_job(void) } // call the function to wait init finish FileSys_WaitFinishEx('B'); + sf_rtos_mmc_dev_register(1, ret); // FileSys_SetParamEx('B', FST_PARM_UPDATE_FSINFO , TRUE); #endif - //fastboot_set_done(BOOT_INIT_FILESYSOK); + fastboot_set_done(BOOT_INIT_FILESYSOK); DBG_WRN("filesys_init e\r\n"); } diff --git a/rtos/code/application/source/cardv/SrcCode/UIApp/MovieFast/MovieFast.c b/rtos/code/application/source/cardv/SrcCode/UIApp/MovieFast/MovieFast.c index 6252c77a2..fc41998b8 100644 --- a/rtos/code/application/source/cardv/SrcCode/UIApp/MovieFast/MovieFast.c +++ b/rtos/code/application/source/cardv/SrcCode/UIApp/MovieFast/MovieFast.c @@ -102,6 +102,7 @@ static lfqueue_t write_queue = {0}; //local variable static DCF_HANDLE g_dcf_hdl = 0; +static DCF_HANDLE g_dcf_hdl2 = 0; static ID MOVIEFAST_FLG_ID = 0; static UINT32 g_moviefast_tsk_run = 1; static UINT32 g_moviefast_poweroff_tsk_run = 1; @@ -119,6 +120,11 @@ static VOS_TICK g_vprc_trigger_frm_time= 0; static UINT32 g_vprc_trigger_frm_count= 0; UINT32 Movie2_nextFolderID = 0, Movie2_nextFileID = 0; + +#if FS_MULTI_STRG_FUNC +CHAR FilePath2[NMC_TOTALFILEPATH_MAX_LEN]; +#endif + //local function static void MovieFast_OnRecStart(void); static void MovieFast_OnRecStop(void); @@ -308,6 +314,7 @@ static void MovieFast_ShutDown(void) fastboot_msg_en(ENABLE); #endif sf_file_thumb_cfg_sava(); + printf("%s %d\n", __FUNCTION__, __LINE__); sf_para_print(); #if (LOGFILE_FUNC==ENABLE) UIMenuStoreInfo *puiPara = sf_ui_para_get(); @@ -859,6 +866,8 @@ static void MovieFast_FileNamingCB(MOVIE_CFG_REC_ID id, char *pFileName) //3. If the working mode is normal and it is cyclic recording, please judge the DirID and FileID by yourself before enering next new file recording. UINT32 nextFolderID = 0, nextFileID = 0; UINT32 max_cnt = 0; + + if (DCF_GetDBInfo(DCF_INFO_IS_9999)) { DBG_ERR("Exceed max dcf file!\r\n"); pFileName[0] = '\0'; @@ -903,6 +912,20 @@ static void MovieFast_FileNamingCB(MOVIE_CFG_REC_ID id, char *pFileName) DCF_MakeObjPath(nextFolderID, nextFileID, DCF_FILE_TYPE_MP4, pFileName); DCF_AddDBfile(pFileName); DBG_DUMP("%s added to DCF\r\n", pFileName); + +#if FS_MULTI_STRG_FUNC + printf("%s %d\n", __FUNCTION__, __LINE__); + if (DCF_GetDBInfoEx(g_dcf_hdl2, DCF_INFO_IS_9999)) { + printf("Exceed max dcf file!\r\n"); + } + else { + //DCF_GetNextIDEx(g_dcf_hdl2, &nextFolderID,&nextFileID); + DCF_MakeObjPathEx(g_dcf_hdl2, nextFolderID, nextFileID, DCF_FILE_TYPE_MP4, FilePath2); + DCF_AddDBfileEx(g_dcf_hdl2, FilePath2); + printf("%s added to DCF2\r\n", FilePath2); + } +#endif + #if HUNTING_CAMERA_MCU == ENABLE char tmp[NMC_TOTALFILEPATH_MAX_LEN] = {'\0'}; sprintf(tmp, "S%03ld%04ld.JPG", nextFolderID, nextFileID); @@ -992,10 +1015,14 @@ static void MovieFast_WriteFile_Task(void* arg) { lfqueue_t* queue = (lfqueue_t*)arg; MOVIEFAST_WRITE_QUEUE_PARAM* param; + INT32 rt; + printf("%s %d\n", __FUNCTION__, __LINE__); fastboot_wait_done(BOOT_INIT_FILESYSOK); #if HUNTING_CAMERA_MCU == ENABLE - if(TRUE == sf_is_card_full()) + //if(TRUE == sf_is_card_full()) + MMC_DEV_TYPE mmc_dev = sf_rtos_mmc_check_workable_dev(); + if(mmc_dev == MMC_DEV_NO) { DBG_ERR("ERR card full\r\n"); //return ; @@ -1012,26 +1039,71 @@ static void MovieFast_WriteFile_Task(void* arg) if(param->va){ DBG_DUMP("Write %s\n", param->path); #if HUNTING_CAMERA_MCU == ENABLE - if(TRUE != sf_is_card_full()) + //if(TRUE != sf_is_card_full()) + if(mmc_dev == MMC_DEV_SD) #endif { FST_FILE fp = FileSys_OpenFile(param->path, FST_OPEN_ALWAYS | FST_OPEN_WRITE); FileSys_WriteFile(fp, (UINT8*)param->va, ¶m->size, 0, NULL); FileSys_CloseFile(fp); } - +#if FS_MULTI_STRG_FUNC + if(mmc_dev == MMC_DEV_EMMC) + { + DBG_WRN("write %s\n", FilePath2); + FST_FILE fp = FileSys_OpenFile(FilePath2, FST_OPEN_ALWAYS | FST_OPEN_WRITE); + if ((fp != NULL)) { + rt = FileSys_WriteFile(fp, (UINT8*)param->va, ¶m->size, 0, NULL); + //FileSys_FlushFile(fp); + FileSys_CloseFile(fp); + if (rt == FST_STA_OK) { + // DCF_AddDBfile(FilePath); + // DBG_DUMP("%s added to DCF\r\n", FilePath); + } else { + DBG_ERR("Addr=0x%x,Size=0x%x\r\n", (UINT8*)param->va, ¶m->size); + } + } + else { + DBG_ERR("FileSys_OpenFile fail\r\n"); + } + } +#endif free(param->va); } else if(param->frame.phy_addr[0]){ DBG_DUMP("Write %s\n", param->path); #if HUNTING_CAMERA_MCU == ENABLE - if(TRUE != sf_is_card_full()) + //if(TRUE != sf_is_card_full()) + if(mmc_dev == MMC_DEV_SD) #endif { FST_FILE fp = FileSys_OpenFile(param->path, FST_OPEN_ALWAYS | FST_OPEN_WRITE); FileSys_WriteFile(fp, (UINT8*)param->frame.phy_addr[0], ¶m->size, 0, NULL); FileSys_CloseFile(fp); } + +#if FS_MULTI_STRG_FUNC + if(mmc_dev == MMC_DEV_EMMC) + { + DBG_WRN("write %s\n", FilePath2); + FST_FILE fp = FileSys_OpenFile(FilePath2, FST_OPEN_ALWAYS | FST_OPEN_WRITE); + if ((fp != NULL)) { + rt = FileSys_WriteFile(fp, (UINT8*)param->frame.phy_addr[0], ¶m->size, 0, NULL); + //FileSys_FlushFile(fp); + FileSys_CloseFile(fp); + if (rt == FST_STA_OK) { + // DCF_AddDBfile(FilePath); + // DBG_DUMP("%s added to DCF\r\n", FilePath); + } else { + DBG_ERR("Addr=0x%x,Size=0x%x\r\n", (UINT8*)param->frame.phy_addr[0], ¶m->size); + } + } + else { + DBG_ERR("FileSys_OpenFile fail\r\n"); + } + } + +#endif hd_videoproc_release_out_buf(param->vprc_path_id, ¶m->frame); } @@ -1198,6 +1270,31 @@ THREAD_RETTYPE MovieFast_InitFileNamingThread(void *arg) DCF_SetDirFreeChars(DCF_DIR_NAME); DCF_SetFileFreeChars(DCF_FILE_TYPE_ANYFORMAT, DCF_FILE_NAME); DCF_ScanObj(); + +#if (FS_MULTI_STRG_FUNC) + { + DCF_OPEN_PARM dcfParm = { + .Drive = 'B', + .WorkbuffAddr = mempool_dcf + POOL_SIZE_DCF_BUFFER, + .WorkbuffSize = POOL_SIZE_DCF_BUFFER, + }; + g_dcf_hdl2 = DCF_Open(&dcfParm); + if(g_dcf_hdl2 < 0){ + DBG_ERR("get dcf handle error!\n"); + } + + + printf("DCF_ScanObjEx emmc handle=%d\n", g_dcf_hdl2); + // DCF_SetParm(DCF_PRMID_REMOVE_DUPLICATE_FOLDER, TRUE); + // DCF_SetParm(DCF_PRMID_REMOVE_DUPLICATE_FILE, TRUE); + // DCF_SetParm(DCF_PRMID_SET_VALID_FILE_FMT, DCF_FILE_TYPE_JPG|DCF_FILE_TYPE_MP4|DCF_FILE_TYPE_MOV); + // DCF_SetParm(DCF_PRMID_SET_DEP_FILE_FMT, DCF_FILE_TYPE_JPG|DCF_FILE_TYPE_WAV|DCF_FILE_TYPE_MPO); + // DCF_SetDirFreeChars(DCF_DIR_NAME); + // DCF_SetFileFreeChars(DCF_FILE_TYPE_ANYFORMAT, DCF_FILE_NAME); + DCF_ScanObjEx(g_dcf_hdl2); + } +#endif + #if HUNTING_CAMERA_MCU == ENABLE if(TRUE != sf_is_card_full()) #endif @@ -1894,6 +1991,12 @@ static void MovieFast_Close(void) EXIT: DCF_Close(g_dcf_hdl); + g_dcf_hdl = -1; + +#if (FS_MULTI_STRG_FUNC) + DCF_Close(g_dcf_hdl2); + g_dcf_hdl2 = -1; +#endif DCF_UnInstallID(); vos_flag_destroy(MOVIEFAST_FLG_ID); diff --git a/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.c b/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.c index 4b9102435..c847c3385 100644 --- a/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.c +++ b/rtos/code/application/source/cardv/SrcCode/UIApp/PhotoFast/PhotoFast.c @@ -938,7 +938,7 @@ INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId, DBG_DUMP("%s added to DCF\r\n", FilePath); } -#if 0//FS_MULTI_STRG_FUNC +#if FS_MULTI_STRG_FUNC if (DCF_GetDBInfoEx(g_dcf_hdl2, DCF_INFO_IS_9999)) { DBG_ERR("Exceed max dcf file!\r\n"); @@ -973,7 +973,9 @@ INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId, //sprintf(tmp, "W%03ld%04ld.JPG", nextFolderID, nextFileID); strncpy(g_photo_fast_write_file_Path, tmp, sizeof(g_photo_fast_write_file_Path) - 1); DBG_IND("last send file:%s\r\n", tmp); - if(TRUE == sf_is_card_full()) + //if(TRUE == sf_is_card_full()) + MMC_DEV_TYPE mmc_dev = sf_rtos_mmc_check_workable_dev(); + if(mmc_dev == MMC_DEV_NO) { DBG_ERR("ERR Addr=0x%x,Size=0x%x,Fmt=%d card full\r\n", Addr, Size, Fmt); rt =FST_STA_ERROR; @@ -988,7 +990,9 @@ INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId, open_flag = FST_CREATE_ALWAYS | FST_OPEN_WRITE; - if ((fp = FileSys_OpenFile(FilePath, open_flag)) != NULL) { + if(mmc_dev == MMC_DEV_SD) + { + if ((fp = FileSys_OpenFile(FilePath, open_flag)) != NULL) { Length = Size; rt = FileSys_WriteFile(fp, (UINT8 *)Addr, &Length, 0, NULL); @@ -1000,34 +1004,34 @@ INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId, } else { DBG_ERR("Addr=0x%x,Size=0x%x,Fmt=%d\r\n", Addr, Size, Fmt); } - }else{ - DBG_ERR("FileSys_OpenFile fail\r\n"); - rt =FST_STA_ERROR; + }else{ + DBG_ERR("FileSys_OpenFile fail\r\n"); + rt =FST_STA_ERROR; + } } - #if FS_MULTI_STRG_FUNC + if(mmc_dev == MMC_DEV_EMMC) + { + DBG_WRN("write %s\n", FilePath2); + if ((fp = FileSys_OpenFile(FilePath2, open_flag)) != NULL) { + Length = Size; - DBG_WRN("write %s\n", FilePath2); - if ((fp = FileSys_OpenFile(FilePath2, open_flag)) != NULL) { - Length = Size; - - rt = FileSys_WriteFile(fp, (UINT8 *)Addr, &Length, 0, NULL); - FileSys_FlushFile(fp); - FileSys_CloseFile(fp); - if (rt == FST_STA_OK) { - // DCF_AddDBfile(FilePath); - // DBG_DUMP("%s added to DCF\r\n", FilePath); - } else { - DBG_ERR("Addr=0x%x,Size=0x%x,Fmt=%d\r\n", Addr, Size, Fmt); + rt = FileSys_WriteFile(fp, (UINT8 *)Addr, &Length, 0, NULL); + FileSys_FlushFile(fp); + FileSys_CloseFile(fp); + if (rt == FST_STA_OK) { + // DCF_AddDBfile(FilePath); + // DBG_DUMP("%s added to DCF\r\n", FilePath); + } else { + DBG_ERR("Addr=0x%x,Size=0x%x,Fmt=%d\r\n", Addr, Size, Fmt); + } + }else{ + DBG_ERR("FileSys_OpenFile fail\r\n"); + rt =FST_STA_ERROR; } - }else{ - DBG_ERR("FileSys_OpenFile fail\r\n"); - rt =FST_STA_ERROR; } #endif - - return rt; } diff --git a/rtos/code/driver/na51089/include/sf_sd_common.h b/rtos/code/driver/na51089/include/sf_sd_common.h new file mode 100755 index 000000000..1789534b8 --- /dev/null +++ b/rtos/code/driver/na51089/include/sf_sd_common.h @@ -0,0 +1,66 @@ +/************************************************************************** + * + * Copyright (c) 2015-2021 by WuYuan Technology, Inc. + * + * This software is copyrighted by and is the property of SiFar + * Technology, Inc.. All rights are reserved by SiFar Technology, Inc.. + * This software may only be used in accordance with the corresponding + * license agreement. Any unauthorized use, duplication, distribution, + * or disclosure of this software is expressly forbidden. + * + * This Copyright notice MUST not be removed or modified without prior + * written consent of SiFar Technology, Inc.. + * + * WuYuan Technology, Inc. reserves the right to modify this software without notice. + * + * Author: Sober + * Ver: 1.0.0 2023.12.23 + * Description: Creat +**************************************************************************/ +#ifndef _SF_SD_COMM_H_ +#define _SF_SD_COMM_H_ + +typedef enum +{ + MMC_DEV_SD = 0, + MMC_DEV_EMMC = 1, + MMC_DEV_NO = 2, +}MMC_DEV_TYPE; + +typedef enum +{ + MMC_DEV_NODE_STATE_NO = 0, + MMC_DEV_NODE_STATE_EXIST = 1, + MMC_DEV_NODE_STATE_NO_EXIST = 2, +}MMC_DEV_NODE_STATE; + +typedef enum +{ + MMC_DEV_MOUNT_STATE_NO = 0, + MMC_DEV_MOUNT_STATE_MOUNTED = 1, + MMC_DEV_MOUNT_STATE_UNMOUNTED = 2, +}MMC_DEV_MOUNT_STATE; + +typedef enum +{ + MMC_DEV_SPACE_STATE_NO = 0, + MMC_DEV_SPACE_STATE_ENOUGH = 1, + MMC_DEV_SPACE_STATE_NO_ENOUGH = 2, +}MMC_DEV_SPACE_STATE; + +typedef enum +{ + MMC_DEV_LOOP_STATE_NO = 0, + MMC_DEV_LOOP_STATE_ON = 1, + MMC_DEV_LOOP_STATE_OFF = 2, +}MMC_DEV_LOOP_STATE; + +typedef struct +{ + //MMC_DEV_NODE_STATE node; + MMC_DEV_MOUNT_STATE moumted_state; + MMC_DEV_SPACE_STATE space_state; + //MMC_DEV_LOOP_STATE loop_state; +}SF_RTOS_ST_MMC_DEV; + +#endif \ No newline at end of file diff --git a/rtos/code/driver/na51089/source/mcu/sf_sd_common.c b/rtos/code/driver/na51089/source/mcu/sf_sd_common.c index 1c4df5db2..eaa2ef96b 100755 --- a/rtos/code/driver/na51089/source/mcu/sf_sd_common.c +++ b/rtos/code/driver/na51089/source/mcu/sf_sd_common.c @@ -90,6 +90,49 @@ UINT32 sf_check_card_full(void) return ret; } +static UINT32 sf_mmc_dev_space_check_full(MMC_DEV_TYPE mmc_dev) +{ + UINT64 diskFree = 0; + UINT32 ret = 0; + + //UIMenuStoreInfo *puiPara = sf_ui_para_get(); + if(!sf_in_card_exist()) + { + return 1; + } + + /*check disk free size*/ + if(mmc_dev == MMC_DEV_SD) + { + diskFree = FileSys_GetDiskInfo(FST_INFO_FREE_SPACE); + } + else + { + diskFree = FileSys_GetEMMCDiskInfo(FST_INFO_FREE_SPACE); + } + + diskFree = diskFree/1024/1024; + + if(diskFree < 30) /* 30MB */ + { + ret = TRUE; + //if(0 == puiPara->SdLoopSwitch) + { + IsCardFull = TRUE; + } + //printf("%s:%d sd card is full diskFree=%lu",__FUNCTION__,__LINE__,diskFree); + } + else + { + ret = FALSE; + + } + + printf("[%s:%d]sd card diskFree=%lluM\n", __FUNCTION__, __LINE__, diskFree); + + return ret; +} + void sf_sd_exist_reg_cb(SF_CALLBACK_SD_CMD fpCB) { g_fpSd_Exist_CB = fpCB; @@ -110,6 +153,84 @@ BOOL sf_in_card_exist(void) } - +int sf_rtos_mmc_dev_register(int devid, int mounted_state) +{ + if(mounted_state == FST_STA_OK) + { + sf_mmc_dev[devid].moumted_state = MMC_DEV_MOUNT_STATE_MOUNTED; + } + else + { + sf_mmc_dev[devid].moumted_state = MMC_DEV_MOUNT_STATE_UNMOUNTED; + } + + int isfull = sf_mmc_dev_space_check_full(devid); + if(isfull) + { + sf_mmc_dev[devid].space_state = MMC_DEV_SPACE_STATE_ENOUGH; + } + else{ + sf_mmc_dev[devid].space_state = MMC_DEV_SPACE_STATE_NO_ENOUGH; + } +} + +MMC_DEV_TYPE sf_rtos_mmc_check_workable_dev(void) +{ + MMC_DEV_TYPE workable_dev = MMC_DEV_NO; + + if(sf_mmc_dev[MMC_DEV_SD].moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED) + { + if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_EMMC; + } + else + { + if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON) + { + workable_dev = MMC_DEV_EMMC; + } + } + } + else if(sf_mmc_dev[MMC_DEV_EMMC].moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED) + { + if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_SD; + } + else + { + if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON) + { + workable_dev = MMC_DEV_SD; + } + } + } + else + { + if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH && + sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_EMMC; + } + else if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_EMMC; + } + else if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH) + { + workable_dev = MMC_DEV_SD; + } + else + { + if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON) + { + workable_dev = MMC_DEV_EMMC; + } + } + } + + return workable_dev; +} diff --git a/rtos/code/lib/include/FileSysTsk.h b/rtos/code/lib/include/FileSysTsk.h index efaf12657..edab30250 100755 --- a/rtos/code/lib/include/FileSysTsk.h +++ b/rtos/code/lib/include/FileSysTsk.h @@ -1722,5 +1722,9 @@ extern int FileSys_SearchFileRewind(FS_SEARCH_HDL pSearch); #define fs_SearchFile FileSys_SearchFile #define fs_SearchFileClose FileSys_SearchFileClose #define fs_SearchFileRewind FileSys_SearchFileRewind + +#define FileSys_GetEMMCDiskInfo(parm1) FileSys_GetDiskInfoEx('B', parm1) + + //@} #endif