You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

171 lines
4.8 KiB

#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; }