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