From bf8d9d93668d09d513c22a53d062529b6e3c3690 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sun, 28 Jan 2024 14:19:12 +0800 Subject: [PATCH] =?UTF-8?q?sample=5Fdata=5Fmgr=5Fwrite=20=E5=86=99?= =?UTF-8?q?=E5=85=A5=E6=B5=8B=E8=AF=95ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +- app/config/sdk_config.h | 12 ++--- app/src/one_conduction/one_conduction_main.c | 61 ++++++++-------------- app/src/one_conduction/sample_data_manager.c | 32 +++++------- app/src/one_conduction/sample_data_manager.h | 5 +- app/src/one_conduction/zeeprom_fs.c | 76 +++++++++++++--------------- app/src/one_conduction/zeeprom_fs.h | 27 ++++++---- libznordic | 2 +- 8 files changed, 97 insertions(+), 121 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f7bbcc6..ecdd629 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -83,7 +83,8 @@ "font.h": "c", "display_manager.h": "c", "wave_drawer.h": "c", - "sample_data_manager.h": "c" + "sample_data_manager.h": "c", + "zeeprom_fs.h": "c" }, "files.encoding": "gbk" } \ No newline at end of file diff --git a/app/config/sdk_config.h b/app/config/sdk_config.h index f064baa..9311c24 100644 --- a/app/config/sdk_config.h +++ b/app/config/sdk_config.h @@ -7743,7 +7743,7 @@ // longer one will be fragmented. #ifndef NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE -#define NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE 64 +#define NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE 1024 #endif // NRF_LOG_BACKEND_RTT_TX_RETRY_DELAY_MS - Period before retrying writing to RTT @@ -7759,7 +7759,7 @@ // and scheme with retry is applied again. #ifndef NRF_LOG_BACKEND_RTT_TX_RETRY_CNT -#define NRF_LOG_BACKEND_RTT_TX_RETRY_CNT 3 +#define NRF_LOG_BACKEND_RTT_TX_RETRY_CNT 10 #endif // @@ -7767,7 +7767,7 @@ // NRF_LOG_BACKEND_UART_ENABLED - nrf_log_backend_uart - Log UART backend //========================================================== #ifndef NRF_LOG_BACKEND_UART_ENABLED -#define NRF_LOG_BACKEND_UART_ENABLED 0 +#define NRF_LOG_BACKEND_UART_ENABLED 1 #endif // NRF_LOG_BACKEND_UART_TX_PIN - UART TX pin #ifndef NRF_LOG_BACKEND_UART_TX_PIN @@ -7834,7 +7834,7 @@ // RAM memory usage. #ifndef NRF_LOG_MSGPOOL_ELEMENT_COUNT -#define NRF_LOG_MSGPOOL_ELEMENT_COUNT 20 +#define NRF_LOG_MSGPOOL_ELEMENT_COUNT 40 #endif // @@ -7865,7 +7865,7 @@ // <16384=> 16384 #ifndef NRF_LOG_BUFSIZE -#define NRF_LOG_BUFSIZE 2048 +#define NRF_LOG_BUFSIZE 4096 #endif // NRF_LOG_CLI_CMDS - Enable CLI commands for the module. @@ -7925,7 +7925,7 @@ // <1024=> 1024 #ifndef NRF_LOG_STR_PUSH_BUFFER_SIZE -#define NRF_LOG_STR_PUSH_BUFFER_SIZE 256 +#define NRF_LOG_STR_PUSH_BUFFER_SIZE 512 #endif // NRF_LOG_STR_PUSH_BUFFER_SIZE - Size of the buffer dedicated for strings stored using @ref NRF_LOG_PUSH. diff --git a/app/src/one_conduction/one_conduction_main.c b/app/src/one_conduction/one_conduction_main.c index f839fa2..55c4c15 100644 --- a/app/src/one_conduction/one_conduction_main.c +++ b/app/src/one_conduction/one_conduction_main.c @@ -7,7 +7,7 @@ #include "sample_data_manager.h" #include "znordic.h" -ZDATACHANNEL_DEF(m_zhrs, 2 /*回调事件优先??*/, 1 /*client num*/); +ZDATACHANNEL_DEF(m_zhrs, 2 /*鍥炶皟浜嬩欢浼樺厛??*/, 1 /*client num*/); /******************************************************************************* * TOOLS * @@ -15,7 +15,7 @@ ZDATACHANNEL_DEF(m_zhrs, 2 /* void zdatachannel_data_handler(zdatachannel_evt_t* p_evt) { /** - * @brief 接收到指令数?? + * @brief 鎺ユ敹鍒版寚浠ゆ暟?? */ if (p_evt->type == ZDATACHANNEL_EVT_RX_DATA) { ZLOGI("rx:%s", hex2str(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length)); @@ -25,28 +25,22 @@ void zdatachannel_data_handler(zdatachannel_evt_t* p_evt) { #define SAMPLES 100 #define AMPLITUDE 50 static void test_tx_timer_cb(void* p_context) { - // static int i; - // float val = 50 + AMPLITUDE * sin(2 * PI * i / SAMPLES); - // // NRF_LOG_FLOAT(val); - - // ZLOGI("tx:" NRF_LOG_FLOAT_MARKER, NRF_LOG_FLOAT(val)); - // i++; - // dsp_mgr_draw_point(val); - - // SingleLeadECG_eeprom_init(); - // static uint8_t eepromw_test_data[256]; - // static uint8_t eepromw_rx_data[256]; - // for (size_t i = 0; i < 256; i++) { - // eepromw_test_data[i] = i; - // } - // SingleLeadECG_eeprom_write(0, eepromw_test_data, 256); - // SingleLeadECG_eeprom_read(0, eepromw_rx_data, 256); - // NRF_LOG_HEXDUMP_INFO(eepromw_rx_data, 48); - // NRF_LOG_HEXDUMP_INFO(eepromw_rx_data+64, 64); - - // for (size_t i = 0; i < 256; i++) { - // ZLOGI_BLOCK("eepromw_rx_data[%d] = %d", i, eepromw_rx_data[i]); - // } + sample_data_mgr_init(); + static sample_data_filename_t filename = {0x00, 0x02, 0x03, 0x04, 0x05}; + static uint8_t wd[256]; + for (size_t i = 0; i < 256; i++) wd[i] = i; + int fd; + for (size_t i = 0; i < 20; i++) { + filename.year += 1; + fd = sample_data_mgr_open(&filename, kwrflag_write_only); + for (size_t i = 0; i < 10; i++) { + sample_data_mgr_write(fd, wd, 256); + } + sample_data_mgr_close(fd); + } + ZLOGI_BLOCK("write end...."); + sample_data_mgr_dump_fileinfo_list(); + sample_data_mgr_uninit(); } extern uint32_t g_nrf_log_tx_pin; @@ -56,9 +50,6 @@ APP_TIMER_DEF(m_drawpoint_timer); * INIT * *******************************************************************************/ void on_service_init(void) { - /** - * @brief 数据通道初始?? - */ ZLOGI("init zdatachannel service"); zdatachannel_init_t zdatachannle_init; memset(&zdatachannle_init, 0, sizeof(zdatachannle_init)); @@ -67,6 +58,8 @@ void on_service_init(void) { } void one_conduction_main() { + g_nrf_log_tx_pin = 41; + APP_SCHED_INIT(APP_TIMER_SCHED_EVENT_DATA_SIZE, 20); znordic_init(0, 20); NRF_LOG_INFO("compile time :%s", __TIME__); @@ -86,20 +79,6 @@ void one_conduction_main() { dsp_mgr_poweron(); dsp_mgr_change_to_sampling(); - sample_data_mgr_init(); - static sample_data_filename_t filename = {0x01, 0x02, 0x03, 0x04, 0x05}; - - static uint8_t wd[256]; - for (size_t i = 0; i < 256; i++) wd[i] = i; - - int fd = sample_data_mgr_open(&filename); - sample_data_mgr_write(fd, wd, 256); - sample_data_mgr_close(fd); - - zeeprom_fs_dump_sector_state(); - // sample_data_mgr_dump_fileinfo_list(); - sample_data_mgr_uninit(); - // SingleLeadECG_eeprom_write(0, eepromw_test_data, 256); ZERROR_CHECK(app_timer_create(&m_drawpoint_timer, APP_TIMER_MODE_SINGLE_SHOT, test_tx_timer_cb)); diff --git a/app/src/one_conduction/sample_data_manager.c b/app/src/one_conduction/sample_data_manager.c index abcb226..caaad30 100644 --- a/app/src/one_conduction/sample_data_manager.c +++ b/app/src/one_conduction/sample_data_manager.c @@ -13,29 +13,27 @@ void sample_data_mgr_uninit() { zeeprom_fs_uinit(); } sample_data_fileinfo_list_t* sample_data_mgr_get_fileinfo_list() { // static sample_data_fileinfo_list_t fileinfo_list; + memset(&fileinfo_list, 0, sizeof(fileinfo_list)); // 读取所有记录信息 zeeprom_header_t* header = zeeprom_fs_get_header(); - uint16_t fileoff = 0; - for (uint16_t i = 0; i < ZARRAY_SIZE(header->sectorinfos); i++) { zeeprom_sector_info_t* sectorinfo = &header->sectorinfos[i]; if (sectorinfo->usage == 1 && sectorinfo->sector_index_in_file == 0) { // 读取文件信息 - sample_data_fileinfo_t* fileinfo = &fileinfocache[fileoff]; + sample_data_fileinfo_t* fileinfo = &fileinfocache[i]; fileinfo->fileuuid = sectorinfo->fileuuid; memcpy(fileinfo->filename, sectorinfo->filename, sizeof(fileinfo->filename)); fileinfo->size = zeeprom_fs_get_filesize(fileinfo->fileuuid); - fileoff += sectorinfo->datalen; - fileinfo_list.fileinfo[fileoff] = fileinfo; + fileinfo_list.fileinfo[fileinfo_list.count] = fileinfo; fileinfo_list.count++; } } // 根据文件uuid排序,uuid最大的排在最前面 - for (uint16_t i = 0; i < fileoff; i++) { - for (uint16_t j = i + 1; j < fileoff; j++) { + for (uint16_t i = 0; i < fileinfo_list.count; i++) { + for (uint16_t j = i + 1; j < fileinfo_list.count; j++) { if (fileinfo_list.fileinfo[i]->fileuuid < fileinfo_list.fileinfo[j]->fileuuid) { sample_data_fileinfo_t* tmp = fileinfo_list.fileinfo[i]; fileinfo_list.fileinfo[i] = fileinfo_list.fileinfo[j]; @@ -47,18 +45,14 @@ sample_data_fileinfo_list_t* sample_data_mgr_get_fileinfo_list() { // } #if 1 static const char* filename2str(uint8_t* filename) { - static char filename_str[17]; - for (size_t i = 0; i < 8; i++) { - filename_str[i * 2] = (filename[i] >> 4) + '0'; - filename_str[i * 2 + 1] = (filename[i] & 0x0f) + '0'; - } - + static char filename_str[32]; + sprintf(filename_str, "%02x%02x%02x%02x%02x%02x%02x%02x", filename[0], filename[1], filename[2], filename[3], filename[4], filename[5], filename[6], filename[7]); return filename_str; } - #endif void sample_data_mgr_dump_fileinfo_list() { + zeeprom_fs_dump_sector_state(); sample_data_fileinfo_list_t* fileinfo_list = sample_data_mgr_get_fileinfo_list(); ZLOGI_BLOCK("fileinfo_list->count=%d\n", fileinfo_list->count); for (uint16_t i = 0; i < fileinfo_list->count; i++) { @@ -67,14 +61,16 @@ void sample_data_mgr_dump_fileinfo_list() { } } -int32_t sample_data_mgr_open(sample_data_filename_t* filename) { +int32_t sample_data_mgr_open(sample_data_filename_t* filename, wrflag_t flag) { /** * @brief 查看文件数量 */ - if (zeeprom_fs_get_file_num() >= FILE_MAX_COUNT) { - zeeprom_fs_delete_the_oldest_file(); + if (flag == kwrflag_write_only) { + if (zeeprom_fs_get_file_num() >= FILE_MAX_COUNT) { + zeeprom_fs_delete_the_oldest_file(); + } } - return zeeprom_fs_open((uint8_t*)filename, NULL, 0); + return zeeprom_fs_open((uint8_t*)filename, flag); } int32_t sample_data_mgr_close(int32_t fileId) { return zeeprom_fs_close(fileId); } int32_t sample_data_mgr_write(int32_t fileId, const uint8_t* data, int32_t size) { return zeeprom_fs_write(fileId, data, size); } diff --git a/app/src/one_conduction/sample_data_manager.h b/app/src/one_conduction/sample_data_manager.h index ebb3121..9daebd2 100644 --- a/app/src/one_conduction/sample_data_manager.h +++ b/app/src/one_conduction/sample_data_manager.h @@ -1,5 +1,6 @@ #pragma once #include +#include "zeeprom_fs.h" void sample_data_mgr_init(); @@ -16,7 +17,7 @@ typedef struct { } sample_data_filename_t; typedef struct { - uint8_t filename[8]; + uint8_t filename[8]; int32_t fileuuid; int32_t size; } sample_data_fileinfo_t; @@ -31,7 +32,7 @@ void sample_data_mgr_uninit(); sample_data_fileinfo_list_t* sample_data_mgr_get_fileinfo_list(); -int32_t sample_data_mgr_open(sample_data_filename_t* filename); +int32_t sample_data_mgr_open(sample_data_filename_t* filename, wrflag_t flag); int32_t sample_data_mgr_close(int32_t fileId); int32_t sample_data_mgr_write(int32_t fileId, const uint8_t* data, int32_t size); diff --git a/app/src/one_conduction/zeeprom_fs.c b/app/src/one_conduction/zeeprom_fs.c index 22ffcae..4e21ed3 100644 --- a/app/src/one_conduction/zeeprom_fs.c +++ b/app/src/one_conduction/zeeprom_fs.c @@ -59,7 +59,7 @@ int zeeprom_fs_uinit() { // zeeprom_header_t* zeeprom_fs_get_header() { return &m_eeprom_header; } -int zeeprom_fs_open(uint8_t* filename, uint8_t* usrdata[], uint8_t usrdata_len) { +int zeeprom_fs_open(uint8_t* filename, wrflag_t wrflag) { ZASSERT(m_is_init); /** * @brief @@ -77,25 +77,12 @@ int zeeprom_fs_open(uint8_t* filename, uint8_t* usrdata[], uint8_t usrdata_len) return -1; } - zeeprom_sector_info_t* sectorHeaderInfo = sector_mgr_find_fileheader_by_filename(filename); - if (sectorHeaderInfo) { - /** - * @brief 文件已存在 - */ - // 打开后文件定位到第一个扇区 - fileHander->fileuuid = sectorHeaderInfo->fileuuid; - fileHander->file_offset = 0; - fileHander->fd = fileHander->fd; - fileHander->sector_header = sectorHeaderInfo; - fileHander->file_size = sector_mgr_file_get_size(fileHander->fileuuid); - memcpy(fileHander->filename, filename, 8); - memcpy(fileHander->usrdata, sectorHeaderInfo->usrdata, sizeof(sectorHeaderInfo->usrdata)); - sector_mgr_open_sector(fileHander->fileuuid); - return fileHander->fd; - } else { - /** - * @brief 文件不存在 - */ + if (wrflag == kwrflag_write_only) { + /******************************************************************************* + * 写文件 * + *******************************************************************************/ + zeeprom_sector_info_t* sectorHeaderInfo = NULL; + zeeprom_fs_delete_by_name(filename); sectorHeaderInfo = sector_mgr_force_find_idle_sector(); if (!sectorHeaderInfo) { @@ -111,13 +98,31 @@ int zeeprom_fs_open(uint8_t* filename, uint8_t* usrdata[], uint8_t usrdata_len) sectorHeaderInfo->sector_index_in_file = 0; sectorHeaderInfo->datalen = 0; sectorHeaderInfo->fileuuid = m_eeprom_header.fileuuid++; - if (usrdata) memcpy(sectorHeaderInfo->usrdata, usrdata, usrdata_len); - - fileHander->fileuuid = sectorHeaderInfo->fileuuid; - fileHander->sector_header = sectorHeaderInfo; - fileHander->file_offset = 0; - fileHander->file_size = 0; + fileHander->fileuuid = sectorHeaderInfo->fileuuid; + fileHander->sector_header = sectorHeaderInfo; + fileHander->file_offset = 0; + fileHander->file_size = 0; return fileHander->fd; + + } else { + /******************************************************************************* + * 读文件 * + *******************************************************************************/ + zeeprom_sector_info_t* sectorHeaderInfo = sector_mgr_find_fileheader_by_filename(filename); + if (sectorHeaderInfo) { + fileHander->fileuuid = sectorHeaderInfo->fileuuid; + fileHander->file_offset = 0; + fileHander->fd = fileHander->fd; + fileHander->sector_header = sectorHeaderInfo; + fileHander->file_size = sector_mgr_file_get_size(fileHander->fileuuid); + memcpy(fileHander->filename, filename, 8); + memcpy(fileHander->usrdata, sectorHeaderInfo->usrdata, sizeof(sectorHeaderInfo->usrdata)); + sector_mgr_open_sector(fileHander->fileuuid); + return fileHander->fd; + } else { + filehandler_rlease(fileHander->fd); + return -1; + } } } @@ -159,7 +164,6 @@ int zeeprom_fs_write(int fileid, const uint8_t* data, int32_t size) { ZLOGE("sector_mgr_get_sector_rom_add fail"); return -1; } - ZLOGI("wadd=%d", wadd); ZASSERT(wadd % 256 == 0); ZASSERT(wadd >= EEPROM_SECTOR_SIZE); zeeprom_write(wadd + endsector->datalen, data, size); @@ -171,6 +175,7 @@ int zeeprom_fs_write(int fileid, const uint8_t* data, int32_t size) { if (endsector->datalen == EEPROM_SECTOR_SIZE) { zeeprom_sector_info_t* newsector = sector_mgr_force_find_idle_sector(); if (!newsector) { + ZLOGE("sector_mgr_force_find_idle_sector fail"); return -1; } @@ -349,7 +354,7 @@ static void filehandler_rlease(int fd) { // 查找最早创建的文件的file_created_index static int32_t sector_mgr_find_earliest_file_created_index() { - int32_t earliest_file_created_index = 0xFFFFFFFF; + int32_t earliest_file_created_index = INT32_MAX; for (int i = 0; i < MAX_SECTOR_NUM; i++) { zeeprom_sector_info_t* sinfo = &m_eeprom_header.sectorinfos[i]; if (sinfo->usage == 1) { @@ -400,7 +405,6 @@ static zeeprom_sector_info_t* sector_mgr_force_find_idle_sector() { * @brief 查找最早创建的文件 */ int32_t earliest_file_created_index = sector_mgr_find_earliest_file_created_index(); - if (sector_mgr_sector_is_open(earliest_file_created_index)) { return NULL; } @@ -518,21 +522,11 @@ int zeeprom_fs_dump_sector_state() { ZLOGI_BLOCK("zeeprom_fs_dump_sector_state\n"); for (int i = 0; i < MAX_SECTOR_NUM; i++) { zeeprom_sector_info_t* sinfo = &m_eeprom_header.sectorinfos[i]; -#if 0 - uint8_t usage; - uint8_t opened; - uint8_t filename[8]; // 注意文件名为固定八个字节的二进制数据,不是字符串 - int32_t sector_index_in_file; // 当前扇区中文件数据的起始地址 - int32_t datalen; // 当前扇区中文件数据的长度 - int32_t fileuuid; // 递增,根据这个index判断文件创建的先后顺序,同时也相当于文件唯一标识 - uint8_t usrdata[20]; -#endif - if (sinfo->usage == 1) { ZLOGI_BLOCK("[%d]: usage=%d opened=%d", i, sinfo->usage, sinfo->opened); - ZLOGI_BLOCK(" fname=%s, index_in_file=%d, datalen=%d, fileuuid=%d\n", filename2str(sinfo->filename), sinfo->sector_index_in_file, sinfo->datalen, sinfo->fileuuid); + ZLOGI_BLOCK(" fname=%s, index_in_file=%d, datalen=%d, fileuuid=%d", filename2str(sinfo->filename), sinfo->sector_index_in_file, sinfo->datalen, sinfo->fileuuid); } else { - ZLOGI_BLOCK("[%d]: usage=%d\n", i, sinfo->usage); + ZLOGI_BLOCK("[%d]: usage=%d", i, sinfo->usage); } } return 0; diff --git a/app/src/one_conduction/zeeprom_fs.h b/app/src/one_conduction/zeeprom_fs.h index 360dea2..6f3489a 100644 --- a/app/src/one_conduction/zeeprom_fs.h +++ b/app/src/one_conduction/zeeprom_fs.h @@ -10,13 +10,13 @@ // #pragma pack(1) typedef struct { - uint8_t usage; - uint8_t opened; - uint8_t filename[8]; // 注意文件名为固定八个字节的二进制数据,不是字符串 + uint8_t usage; + uint8_t opened; + uint8_t filename[8]; // 注意文件名为固定八个字节的二进制数据,不是字符串 int32_t sector_index_in_file; // 当前扇区中文件数据的起始地址 int32_t datalen; // 当前扇区中文件数据的长度 int32_t fileuuid; // 递增,根据这个index判断文件创建的先后顺序,同时也相当于文件唯一标识 - uint8_t usrdata[20]; + uint8_t usrdata[20]; } zeeprom_sector_info_t; typedef struct { @@ -24,26 +24,32 @@ typedef struct { uint8_t usrdata[20]; zeeprom_sector_info_t* sector_header; - int32_t file_offset; - int32_t file_size; + int32_t file_offset; + int32_t file_size; - int fd; + int fd; int32_t fileuuid; } filehandler_t; typedef struct { zeeprom_sector_info_t sectorinfos[MAX_SECTOR_NUM]; - int32_t fileuuid; - int32_t checksum; + int32_t fileuuid; + int32_t checksum; } zeeprom_header_t; #pragma pack() int zeeprom_fs_init(); int zeeprom_fs_uinit(); +typedef enum { + kwrflag_read_only, + kwrflag_write_only, +} wrflag_t; + zeeprom_header_t* zeeprom_fs_get_header(); -int zeeprom_fs_open(uint8_t* filename, uint8_t* usrdata[], uint8_t usrdata_len); +int zeeprom_fs_open(uint8_t* filename, wrflag_t flag); + int zeeprom_fs_close(int fileid); int zeeprom_fs_write(int fileid, const uint8_t* data, int32_t size); @@ -57,4 +63,3 @@ int zeeprom_fs_delete(int32_t fileuuid); int zeeprom_fs_delete_by_name(uint8_t* filename); int zeeprom_fs_dump_sector_state(); - diff --git a/libznordic b/libznordic index c019696..e16602d 160000 --- a/libznordic +++ b/libznordic @@ -1 +1 @@ -Subproject commit c0196969d9981245400057e8c8ef8567fc6c93ab +Subproject commit e16602d90ecda24a2033df814b5aabf86f360e8b