修改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; int mounted_status;
}STRG_CB_PARAM; }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) void SF_StrgInit(void)
{ {
@ -37,6 +37,7 @@ void SF_StrgInit(void)
// 处理内存分配失败的情况 // 处理内存分配失败的情况
} }
sf_mmc_dev[i]->dcf_handle = -1; 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]->node = MMC_DEV_NODE_STATE_NO;
sf_mmc_dev[i]->moumted_state = MMC_DEV_MOUNT_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]->space_state = MMC_DEV_SPACE_STATE_NO;
@ -79,11 +80,11 @@ static UINT32 SF_StrgSpaceCheckFull(MMC_DEV_TYPE mmc_dev)
if(diskFree < 30) /* 30MB */ if(diskFree < 30) /* 30MB */
{ {
ret = TRUE; ret = 1;
} }
else else
{ {
ret = FALSE; ret = 0;
} }
MLOGD("[%s:%d]sd card diskFree=%lluM\n", __FUNCTION__, __LINE__, diskFree); MLOGD("[%s:%d]sd card diskFree=%lluM\n", __FUNCTION__, __LINE__, diskFree);
return ret; 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; MMC_DEV_TYPE workable_dev = MMC_DEV_NO;
MLOGD("sf mmc check workable dev start!!!\n"); 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); MLOGD("sf mmc check workable dev end, dev_id = %d!!!\n", workable_dev);
for(int i = 0; i < 2; i++) 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", 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]->node, sf_mmc_dev[i]->moumted_state,
sf_mmc_dev[i]->space_state, sf_mmc_dev[i]->loop_state); sf_mmc_dev[i]->space_state, sf_mmc_dev[i]->loop_state);
} }
if(workable_dev != MMC_DEV_NO) if(workable_dev != MMC_DEV_NO)
{ {
MLOGD("dcf_handle = %d\n", sf_mmc_dev[workable_dev]->dcf_handle); 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 else
return NULL; return -1;
} }

View File

@ -70,6 +70,7 @@ typedef enum
typedef struct typedef struct
{ {
MMC_DEV_TYPE dev_type;
MMC_DEV_NODE_STATE node; MMC_DEV_NODE_STATE node;
MMC_DEV_MOUNT_STATE moumted_state; MMC_DEV_MOUNT_STATE moumted_state;
MMC_DEV_SPACE_STATE space_state; MMC_DEV_SPACE_STATE space_state;
@ -82,7 +83,7 @@ void SF_StrgInit(void);
void SF_StrgUnInit(void); void SF_StrgUnInit(void);
void SF_StrgSetDcfHandle(UINT32 strg_id, UINT32 handle); void SF_StrgSetDcfHandle(UINT32 strg_id, UINT32 handle);
void SF_StrgRegister(SF_MESSAGE_BUF_S *pMessageBuf); 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_ #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) DCF_HANDLE System_Get_DCF_Handle(void)
{ {
SF_ST_MMC_DEV *mmc_dev = SF_StrgCheckWorkableDev(); int dcf_handle = SF_StrgCheckWorkableDev();
if(mmc_dev->dcf_handle < 0) if(dcf_handle < 0)
{ {
DBG_ERR("No MMC_Dev Can use!\n"); DBG_ERR("No MMC_Dev Can use!\n");
return -1; return -1;
} }
DBG_WRN("DCF_GET_HANDLE, %d\n", mmc_dev->dcf_handle); DBG_WRN("DCF_GET_HANDLE, %d\n", dcf_handle);
return mmc_dev->dcf_handle; return dcf_handle;
} }
CHAR System_Get_DCF_Disk_Drive(DCF_HANDLE handle) CHAR System_Get_DCF_Disk_Drive(DCF_HANDLE handle)

View File

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

View File

@ -1127,9 +1127,24 @@ static void MovieFast_UserEventCb(UINT32 id, MOVIE_USER_CB_EVENT event_id, UINT3
char tmp[256] = {'\0'}; char tmp[256] = {'\0'};
#if HUNTING_CAMERA_MCU == ENABLE #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 #else
snprintf(tmp, sizeof(tmp), "%s%s", MOVIE_THUMB_PATH, (thumb_current_path + (length - 12))); /* DCF 8.3 naming rule */ 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"); snprintf(tmp + strlen(tmp) - 3, sizeof(tmp), "%s", "JPG");

View File

@ -21,6 +21,7 @@
#include "sys_usrmem.h" #include "sys_usrmem.h"
#if HUNTING_CAMERA_MCU == ENABLE #if HUNTING_CAMERA_MCU == ENABLE
#include <sf_mcu.h> #include <sf_mcu.h>
#include "sf_sd_common.h"
#endif #endif
#define VDO_YUV_BUFSIZE(w, h, pxlfmt) ALIGN_CEIL_4(((w) * (h) * HD_VIDEO_PXLFMT_BPP(pxlfmt)) / 8) #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 #endif
#if HUNTING_CAMERA_MCU == ENABLE #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 #else
UINT32 length = strlen(file_path); UINT32 length = strlen(file_path);
snprintf(tmp, sizeof(tmp), "%s%s", PHOTO_THUMB_PATH, file_path + length - 12); /* DCF 8.3 naming rule */ 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 typedef struct
{ {
//MMC_DEV_NODE_STATE node; MMC_DEV_TYPE dev_type;
MMC_DEV_MOUNT_STATE moumted_state; MMC_DEV_MOUNT_STATE moumted_state;
MMC_DEV_SPACE_STATE space_state; MMC_DEV_SPACE_STATE space_state;
//MMC_DEV_LOOP_STATE loop_state;
int dcf_handle; int dcf_handle;
}SF_RTOS_ST_MMC_DEV; }SF_RTOS_ST_MMC_DEV;

View File

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