#include "sample_data_manager_service.h" #include "board/board.h" #include "board/board_sdcard_driver.h" #include "znordic.h" /******************************************************************************* * 全局变量 * *******************************************************************************/ static FIL m_default_file_handler; static sample_data_fileinfo_list_t m_sample_fileinfo_list; static sample_data_fileinfo_t m_sample_fileinfo[FILE_MAX_COUNT]; /******************************************************************************* * 接口层 * *******************************************************************************/ static void read_file_info() { /** * @brief * * fdate: * bit15:9 * Year origin from 1980 (0..127) * bit8:5 * Month (1..12) * bit4:0 * Day of the month(1..31) * ftime: * bit15:11 * Hour (0..23) * bit10:5 * Minute (0..59) * bit4:0 * Second / 2 (0..29) */ FILINFO fno; FRESULT ff_result = f_stat("0.bin", &fno); m_sample_fileinfo_list.fileinfo[0] = &m_sample_fileinfo[0]; if (ff_result == FR_OK) { static sample_data_filename_t _filename; _filename.year = (fno.fdate >> 9) + 1980 - 2000; _filename.month = (fno.fdate >> 5) & 0x0F; _filename.day = fno.fdate & 0x1F; _filename.hour = (fno.ftime >> 11); _filename.min = (fno.ftime >> 5) & 0x3F; _filename.sec = (fno.ftime & 0x1F) * 2; memcpy(m_sample_fileinfo_list.fileinfo[0]->filename, &_filename, sizeof(sample_data_filename_t)); m_sample_fileinfo_list.fileinfo[0]->size = fno.fsize; m_sample_fileinfo_list.count = 1; ZLOGI("filelist:"); ZLOGI(" name:%s", "0.bin"); ZLOGI(" size:%d", fno.fsize); } else { m_sample_fileinfo_list.fileinfo[0]->size = 0; m_sample_fileinfo_list.count = 0; } } /** * @brief 文件驱动管理 */ void SampleDataMgr_init() { Board_sdcardInit(); // 先连接到单片机,读取下文件状态信息 SampleDataMgr_changeToLocalMode(); SampleDataMgr_changeToExtMode(); } void SampleDataMgr_loadDriver() { // donothing } void SampleDataMgr_unloadDriver() { // donothin } typedef struct { uint8_t filename[8]; uint32_t filesize; } disk_state_t; /** * @brief 存储器连接单片机 */ void SampleDataMgr_changeToLocalMode() { ZLOGI("change to local mode"); Board_sdcardConnectToInternal(); read_file_info(); } /** * @brief 存储器连接外部typec */ void SampleDataMgr_changeToExtMode() { ZLOGI("change to ext mode"); if (Board_sdcardGetConnectTo() == kConnectToInternal) { read_file_info(); } Board_sdcardConnectToExt(); } /** * @brief 打开文件 * * @param filename * @param flag * @return int32_t */ static FIL m_default_file_handler; static bool m_is_open; int32_t SampleDataMgr_open(sample_data_filename_t* filename, wrflag_t flag) { if (flag == kwrflag_write_only) { FRESULT ff_result = f_open(&m_default_file_handler, (const TCHAR*)"0.bin", FA_CREATE_ALWAYS | FA_READ | FA_WRITE); ZASSERT(ff_result == FR_OK); m_is_open = true; return 1; } else { FRESULT ff_result = f_open(&m_default_file_handler, (const TCHAR*)"0.bin", FA_READ); if (ff_result != FR_OK) { return -1; } m_is_open = true; return 1; } } int32_t SampleDataMgr_close(int32_t fd) { ZASSERT(m_is_open); FRESULT ff_result = f_close(&m_default_file_handler); ZASSERT(ff_result == FR_OK); m_is_open = false; return 0; } int32_t SampleDataMgr_write(int32_t fd, const uint8_t* data, int32_t size) { ZASSERT(m_is_open); UINT write_size; FRESULT ff_result = f_write(&m_default_file_handler, data, size, &write_size); ZASSERT(ff_result == FR_OK); return write_size; } int32_t SampleDataMgr_read(int32_t fd, uint8_t* data, int32_t size) { ZASSERT(m_is_open); UINT read_size; FRESULT ff_result = f_read(&m_default_file_handler, data, size, &read_size); ZASSERT(ff_result == FR_OK); return read_size; } uint32_t SampleDataMgr_getFileSizeByFd(int32_t fd) { ZASSERT(m_is_open); return f_size(&m_default_file_handler); } int32_t SampleDataMgr_deleteFile(sample_data_filename_t* filename) { if (Board_sdcardGetConnectTo() == kConnectToExt) { /** * @brief * 由于设备空闲阶段,SD卡连接的是外部读卡器,所以无法删除文件 */ ZLOGW("unsupport now"); return 0; } f_unlink((const TCHAR*)"0.bin"); return 0; } sample_data_fileinfo_list_t* SampleDataMgr_getFileinfoList() { // return &m_sample_fileinfo_list; } bool SampleDataMgr_storageIsFull() { return m_sample_fileinfo_list.count >= FILE_MAX_COUNT; } int32_t SampleDataMgr_getFileNum() { return m_sample_fileinfo_list.count; }