修改RTOS下无法保存缩略图到EMMC问题和优化存储设备切换逻辑

This commit is contained in:
sober.song 2023-12-27 13:41:11 +08:00
parent 8bbe9651b2
commit 49b78482b1
10 changed files with 104 additions and 66 deletions

View File

@ -26,7 +26,7 @@ typedef struct
int mounted_status;
}STRG_CB_PARAM;
static SF_ST_MMC_DEV *sf_mmc_dev[MMC_DEV_MAX_NUM] = {NULL};
SF_ST_MMC_DEV *sf_mmc_dev[MMC_DEV_MAX_NUM] = {NULL};
void SF_StrgInit(void)
{
@ -37,6 +37,7 @@ void SF_StrgInit(void)
// 处理内存分配失败的情况
}
sf_mmc_dev[i]->dcf_handle = -1;
sf_mmc_dev[i]->dev_type = MMC_DEV_NO;
sf_mmc_dev[i]->node = MMC_DEV_NODE_STATE_NO;
sf_mmc_dev[i]->moumted_state = MMC_DEV_MOUNT_STATE_NO;
sf_mmc_dev[i]->space_state = MMC_DEV_SPACE_STATE_NO;
@ -79,11 +80,11 @@ static UINT32 SF_StrgSpaceCheckFull(MMC_DEV_TYPE mmc_dev)
if(diskFree < 30) /* 30MB */
{
ret = TRUE;
ret = 1;
}
else
{
ret = FALSE;
ret = 0;
}
MLOGD("[%s:%d]sd card diskFree=%lluM\n", __FUNCTION__, __LINE__, diskFree);
return ret;
@ -200,7 +201,7 @@ void SF_StrgRegister(SF_MESSAGE_BUF_S *pMessageBuf)
}
}
SF_ST_MMC_DEV *SF_StrgCheckWorkableDev(void)
int SF_StrgCheckWorkableDev(void)
{
MMC_DEV_TYPE workable_dev = MMC_DEV_NO;
MLOGD("sf mmc check workable dev start!!!\n");
@ -302,19 +303,20 @@ SF_ST_MMC_DEV *SF_StrgCheckWorkableDev(void)
}
}
}
MLOGD("sf mmc check workable dev end, dev_id = %d!!!\n", workable_dev);
for(int i = 0; i < 2; i++)
{
sf_mmc_dev[i]->dev_type = workable_dev;
MLOGD("node:%d, mount:%d, space:%d, loop:%d\n",
sf_mmc_dev[i]->node, sf_mmc_dev[i]->moumted_state,
sf_mmc_dev[i]->space_state, sf_mmc_dev[i]->loop_state);
}
if(workable_dev != MMC_DEV_NO)
{
MLOGD("dcf_handle = %d\n", sf_mmc_dev[workable_dev]->dcf_handle);
return sf_mmc_dev[workable_dev];
return sf_mmc_dev[workable_dev]->dcf_handle;
}
else
return NULL;
return -1;
}

View File

@ -70,6 +70,7 @@ typedef enum
typedef struct
{
MMC_DEV_TYPE dev_type;
MMC_DEV_NODE_STATE node;
MMC_DEV_MOUNT_STATE moumted_state;
MMC_DEV_SPACE_STATE space_state;
@ -82,7 +83,7 @@ void SF_StrgInit(void);
void SF_StrgUnInit(void);
void SF_StrgSetDcfHandle(UINT32 strg_id, UINT32 handle);
void SF_StrgRegister(SF_MESSAGE_BUF_S *pMessageBuf);
SF_ST_MMC_DEV *SF_StrgCheckWorkableDev(void);
int SF_StrgCheckWorkableDev(void);
#endif //_SF_SYS_STRG_MNG_H_

View File

@ -760,14 +760,14 @@ INT32 System_Set_Storage_Act_Drive(char drive)
DCF_HANDLE System_Get_DCF_Handle(void)
{
SF_ST_MMC_DEV *mmc_dev = SF_StrgCheckWorkableDev();
if(mmc_dev->dcf_handle < 0)
int dcf_handle = SF_StrgCheckWorkableDev();
if(dcf_handle < 0)
{
DBG_ERR("No MMC_Dev Can use!\n");
return -1;
}
DBG_WRN("DCF_GET_HANDLE, %d\n", mmc_dev->dcf_handle);
return mmc_dev->dcf_handle;
DBG_WRN("DCF_GET_HANDLE, %d\n", dcf_handle);
return dcf_handle;
}
CHAR System_Get_DCF_Disk_Drive(DCF_HANDLE handle)

View File

@ -948,8 +948,8 @@
#define SF_BASE_VERSION "7MR5RCwDC05"
#define DCF_DIR_NAME "MEDIA" /* 100MEDIA */
#define DCF_FILE_NAME "SYGW" /* SYFW0001.JPG */
#define PHOTO_THUMB_PATH "A:\\THUMB\\"
#define MOVIE_THUMB_PATH "A:\\THUMB\\"
#define PHOTO_THUMB_PATH ":\\THUMB\\"
#define MOVIE_THUMB_PATH ":\\THUMB\\"
#define SF_SEND_LIST_DIR "/mnt/sd/THUMB"
#define SF_THUMB_SEND_LIST PHOTO_THUMB_PATH"send.list"
#define SF_THUMB_SEND_AUTO PHOTO_THUMB_PATH"auto.list"

View File

@ -866,7 +866,7 @@ static DCF_HANDLE MovieFast_Get_DCF_Handle(void)
//#else
//return g_dcf_hdl;
//#endif
SF_RTOS_ST_MMC_DEV *mmc_dev = SF_RtosStrgCheckWorkableDev();
SF_RTOS_ST_MMC_DEV *mmc_dev = SF_RtosStrgCheckWorkableDev();
if(mmc_dev->dcf_handle < 0)
{
DBG_ERR("No MMC_Dev Can use!\n");
@ -1127,9 +1127,24 @@ static void MovieFast_UserEventCb(UINT32 id, MOVIE_USER_CB_EVENT event_id, UINT3
char tmp[256] = {'\0'};
#if HUNTING_CAMERA_MCU == ENABLE
snprintf(tmp, sizeof(tmp), "%s%s", MOVIE_THUMB_PATH, thumb_current_path); /* DCF 8.3 naming rule */
SF_RTOS_ST_MMC_DEV *mmc_dev = SF_RtosStrgCheckWorkableDev();
if(mmc_dev->dcf_handle < 0)
{
DBG_ERR("No MMC_Dev Can use!\n");
}
else
{
if(mmc_dev->dev_type == MMC_DEV_SD)
{
snprintf(tmp, sizeof(tmp), "%c%s%s", 'A', MOVIE_THUMB_PATH, thumb_current_path); /* DCF 8.3 naming rule */
}
else
{
snprintf(tmp, sizeof(tmp), "%c%s%s", 'B', MOVIE_THUMB_PATH, thumb_current_path); /* DCF 8.3 naming rule */
}
}
#else
snprintf(tmp, sizeof(tmp), "%s%s", MOVIE_THUMB_PATH, (thumb_current_path + (length - 12))); /* DCF 8.3 naming rule */
snprintf(tmp + strlen(tmp) - 3, sizeof(tmp), "%s", "JPG");

View File

@ -894,7 +894,7 @@ DCF_HANDLE PhotoFast_Get_DCF_Handle()
//#else
//return g_dcf_hdl;
//#endif
SF_RTOS_ST_MMC_DEV *mmc_dev = SF_RtosStrgCheckWorkableDev();
SF_RTOS_ST_MMC_DEV *mmc_dev = SF_RtosStrgCheckWorkableDev();
if(mmc_dev->dcf_handle < 0)
{
DBG_ERR("No MMC_Dev Can use!\n");

View File

@ -21,6 +21,7 @@
#include "sys_usrmem.h"
#if HUNTING_CAMERA_MCU == ENABLE
#include <sf_mcu.h>
#include "sf_sd_common.h"
#endif
#define VDO_YUV_BUFSIZE(w, h, pxlfmt) ALIGN_CEIL_4(((w) * (h) * HD_VIDEO_PXLFMT_BPP(pxlfmt)) / 8)
@ -2384,7 +2385,22 @@ INT32 PhotoFast_SliceEncode_CB3(void* user_data)
#endif
#if HUNTING_CAMERA_MCU == ENABLE
snprintf(tmp, sizeof(tmp), "%s%s", PHOTO_THUMB_PATH, file_path); /* DCF 8.3 naming rule */
SF_RTOS_ST_MMC_DEV *mmc_dev = SF_RtosStrgCheckWorkableDev();
if(mmc_dev->dcf_handle < 0)
{
DBG_ERR("No MMC_Dev Can use!\n");
}
else
{
if(mmc_dev->dev_type == MMC_DEV_SD)
{
snprintf(tmp, sizeof(tmp), "%c%s%s", 'A', PHOTO_THUMB_PATH, file_path); /* DCF 8.3 naming rule */
}
else
{
snprintf(tmp, sizeof(tmp), "%c%s%s", 'B', PHOTO_THUMB_PATH, file_path); /* DCF 8.3 naming rule */
}
}
#else
UINT32 length = strlen(file_path);
snprintf(tmp, sizeof(tmp), "%s%s", PHOTO_THUMB_PATH, file_path + length - 12); /* DCF 8.3 naming rule */

View File

@ -59,10 +59,9 @@ typedef enum
typedef struct
{
//MMC_DEV_NODE_STATE node;
MMC_DEV_TYPE dev_type;
MMC_DEV_MOUNT_STATE moumted_state;
MMC_DEV_SPACE_STATE space_state;
//MMC_DEV_LOOP_STATE loop_state;
int dcf_handle;
}SF_RTOS_ST_MMC_DEV;

View File

@ -49,7 +49,7 @@ static BOOL IsCardFull = FALSE;
SF_CALLBACK_SD_CMD g_fpSd_Exist_CB = NULL;
extern BOOL DrvCARD_DetStrgCard(void);
static SF_RTOS_ST_MMC_DEV *sf_mmc_dev[MMC_DEV_MAX_NUM] = {NULL};
SF_RTOS_ST_MMC_DEV *sf_rtos_mmc_dev[MMC_DEV_MAX_NUM] = {NULL};
BOOL sf_is_card_full(void)
{
@ -117,15 +117,16 @@ void SF_RtosStrgInit(void)
{
for(int i = 0; i < MMC_DEV_MAX_NUM; i++)
{
sf_mmc_dev[i] = (SF_RTOS_ST_MMC_DEV *)malloc(sizeof(SF_RTOS_ST_MMC_DEV));
if(sf_mmc_dev[i] == NULL) {
sf_rtos_mmc_dev[i] = (SF_RTOS_ST_MMC_DEV *)malloc(sizeof(SF_RTOS_ST_MMC_DEV));
if(sf_rtos_mmc_dev[i] == NULL) {
// 处理内存分配失败的情况
}
sf_mmc_dev[i]->dcf_handle = -1;
//sf_mmc_dev[i]->node = MMC_DEV_NODE_STATE_NO;
sf_mmc_dev[i]->moumted_state = MMC_DEV_MOUNT_STATE_NO;
sf_mmc_dev[i]->space_state = MMC_DEV_SPACE_STATE_NO;
//sf_mmc_dev[i]->loop_state = MMC_DEV_LOOP_STATE_NO;
sf_rtos_mmc_dev[i]->dcf_handle = -1;
sf_rtos_mmc_dev[i]->dev_type = MMC_DEV_NO;
//sf_rtos_mmc_dev[i]->node = MMC_DEV_NODE_STATE_NO;
sf_rtos_mmc_dev[i]->moumted_state = MMC_DEV_MOUNT_STATE_NO;
sf_rtos_mmc_dev[i]->space_state = MMC_DEV_SPACE_STATE_NO;
//sf_rtos_mmc_dev[i]->loop_state = MMC_DEV_LOOP_STATE_NO;
}
DBG_WRN("SF_RtosStrgInit!\n");
}
@ -134,15 +135,15 @@ void SF_RtosStrgUnInit(void)
{
for(int i = 0; i < MMC_DEV_MAX_NUM; i++)
{
if(sf_mmc_dev[i] != NULL) {
free(sf_mmc_dev[i]);
sf_mmc_dev[i] = NULL;
if(sf_rtos_mmc_dev[i] != NULL) {
free(sf_rtos_mmc_dev[i]);
sf_rtos_mmc_dev[i] = NULL;
}
}
DBG_WRN("SF_RtosStrgUnInit!\n");
}
static UINT32 sf_mmc_dev_space_check_full(MMC_DEV_TYPE mmc_dev)
static UINT32 sf_rtos_mmc_dev_space_check_full(MMC_DEV_TYPE mmc_dev)
{
UINT64 diskFree = 0;
UINT32 ret = 0;
@ -167,14 +168,14 @@ static UINT32 sf_mmc_dev_space_check_full(MMC_DEV_TYPE mmc_dev)
if(diskFree < 30) /* 30MB */
{
ret = TRUE;
ret = 1;
IsCardFull = TRUE;
}
else
{
ret = FALSE;
ret = 0;
}
DBG_WRN("[%s:%d]sd card diskFree=%lluM\n", __FUNCTION__, __LINE__, diskFree);
DBG_WRN("[%d]sd card diskFree=%lluM, ret = %d\n", __LINE__, diskFree, ret);
return ret;
}
@ -182,28 +183,29 @@ int SF_RtosStrgRegister(int devid, int mounted_state)
{
if(mounted_state == FST_STA_OK)
{
sf_mmc_dev[devid]->moumted_state = MMC_DEV_MOUNT_STATE_MOUNTED;
sf_rtos_mmc_dev[devid]->moumted_state = MMC_DEV_MOUNT_STATE_MOUNTED;
}
else
{
sf_mmc_dev[devid]->moumted_state = MMC_DEV_MOUNT_STATE_UNMOUNTED;
sf_rtos_mmc_dev[devid]->moumted_state = MMC_DEV_MOUNT_STATE_UNMOUNTED;
}
int isfull = sf_mmc_dev_space_check_full(devid);
if(isfull)
UINT32 isfull = sf_rtos_mmc_dev_space_check_full(devid);
if(isfull == 1)
{
sf_mmc_dev[devid]->space_state = MMC_DEV_SPACE_STATE_ENOUGH;
sf_rtos_mmc_dev[devid]->space_state = MMC_DEV_SPACE_STATE_NO_ENOUGH;
}
else{
sf_mmc_dev[devid]->space_state = MMC_DEV_SPACE_STATE_NO_ENOUGH;
else if(isfull == 0)
{
sf_rtos_mmc_dev[devid]->space_state = MMC_DEV_SPACE_STATE_ENOUGH;
}
DBG_WRN("devid = %d, state = %d\n", devid, mounted_state);
DBG_WRN("11devid = %d, state = %d\n", devid, mounted_state);
return 0;
}
void SF_RtosStrgSetDcfHandle(UINT32 strg_id, UINT32 handle)
{
sf_mmc_dev[strg_id]->dcf_handle = handle;
sf_rtos_mmc_dev[strg_id]->dcf_handle = handle;
DBG_WRN("strg_id = %d, handle = %d\n", strg_id, handle);
}
@ -212,34 +214,34 @@ SF_RTOS_ST_MMC_DEV *SF_RtosStrgCheckWorkableDev(void)
{
MMC_DEV_TYPE workable_dev = MMC_DEV_NO;
if((sf_mmc_dev[MMC_DEV_SD]->moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED) &&
(sf_mmc_dev[MMC_DEV_EMMC]->moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED))
if((sf_rtos_mmc_dev[MMC_DEV_SD]->moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED) &&
(sf_rtos_mmc_dev[MMC_DEV_EMMC]->moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED))
{
workable_dev = MMC_DEV_NO;
}
else if(sf_mmc_dev[MMC_DEV_SD]->moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED)
else if(sf_rtos_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)
if(sf_rtos_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)
//if(sf_rtos_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)
else if(sf_rtos_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)
if(sf_rtos_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)
//if(sf_rtos_mmc_dev[MMC_DEV_SD]->loop_state == MMC_DEV_LOOP_STATE_ON)
{
//workable_dev = MMC_DEV_SD;
}
@ -247,42 +249,45 @@ SF_RTOS_ST_MMC_DEV *SF_RtosStrgCheckWorkableDev(void)
}
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)
if(sf_rtos_mmc_dev[MMC_DEV_EMMC]->space_state == MMC_DEV_SPACE_STATE_ENOUGH &&
sf_rtos_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)
else if(sf_rtos_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)
else if(sf_rtos_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)
//if(sf_rtos_mmc_dev[MMC_DEV_SD]->loop_state == MMC_DEV_LOOP_STATE_ON)
{
//workable_dev = MMC_DEV_EMMC;
}
}
}
DBG_WRN("dev_id = %d!!!\n", workable_dev);
for(int i = 0; i < 2; i++)
{
DBG_WRN("mount:%d, space:%d\n",
sf_mmc_dev[i]->moumted_state, sf_mmc_dev[i]->space_state);
sf_rtos_mmc_dev[i]->dev_type = workable_dev;
DBG_WRN("mount:%d, space:%d\n", sf_rtos_mmc_dev[i]->moumted_state,
sf_rtos_mmc_dev[i]->space_state);
}
if(workable_dev != MMC_DEV_NO)
if(workable_dev == MMC_DEV_NO)
{
DBG_WRN("dcf_handle = %d\n", sf_mmc_dev[workable_dev]->dcf_handle);
return sf_mmc_dev[workable_dev];
}
else
return NULL;
}
else
{
return sf_rtos_mmc_dev[workable_dev];
}
}