From 384114d2ef2db75723a6942707a9b0c85111a83d Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Fri, 10 Feb 2023 11:19:44 +0800 Subject: [PATCH] Add CMD for set and get card slot data nicknames. --- firmware/application/src/app_cmd.c | 53 +++++++++++++++++++++++++++ firmware/application/src/app_main.c | 15 ++++---- firmware/application/src/app_status.h | 2 + firmware/application/src/data_cmd.h | 2 + 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/firmware/application/src/app_cmd.c b/firmware/application/src/app_cmd.c index d57ed5b..33e92f7 100644 --- a/firmware/application/src/app_cmd.c +++ b/firmware/application/src/app_cmd.c @@ -9,6 +9,7 @@ #include "hex_utils.h" #include "data_cmd.h" #include "app_cmd.h" +#include "tag_persistence.h" #define NRF_LOG_MODULE_NAME app_cmd @@ -405,6 +406,56 @@ data_frame_tx_t* cmd_processor_set_mf1_anti_collision_res(uint16_t cmd, uint16_t return data_frame_make(cmd, status, 0, NULL); } +data_frame_tx_t* cmd_processor_set_slot_tag_nick_name(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { + // one chinese have 2byte(gbk). + if (length > 34 || length < 3) { + status = STATUS_PAR_ERR; + } else { + uint8_t slot = data[0]; + uint8_t sense_type = data[1]; + fds_slot_record_map_t map_info; + + get_fds_map_by_slot_sense_type_for_nick(slot, sense_type, &map_info); + + uint8_t buffer[36]; + buffer[0] = length - 2; // 减去开头的两个字节,剩下的就是昵称的字节流 + memcpy(buffer + 1, data + 2, buffer[0]); // 拷贝一份昵称到缓冲区中,这样子缓冲区里就有 一个字节开头的长度 + 昵称字节流 + + bool ret = fds_write_sync(map_info.id, map_info.key, sizeof(buffer) / 4, buffer); + if (ret) { + status = STATUS_DEVICE_SUCCESS; + } else { + status = STATUS_FLASH_WRITE_FAIL; + } + } + return data_frame_make(cmd, status, 0, NULL); +} + +data_frame_tx_t* cmd_processor_get_slot_tag_nick_name(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { + // one chinese have 2byte(gbk). + if (length != 2) { + status = STATUS_PAR_ERR; + } else { + uint8_t buffer[36]; + uint8_t slot = data[0]; + uint8_t sense_type = data[1]; + fds_slot_record_map_t map_info; + + get_fds_map_by_slot_sense_type_for_nick(slot, sense_type, &map_info); + bool ret = fds_read_sync(map_info.id, map_info.key, sizeof(buffer), buffer); + if (ret) { + status = STATUS_DEVICE_SUCCESS; + length = buffer[0]; + data = &buffer[1]; + } else { + status = STATUS_FLASH_READ_FAIL; + length = 0; + data = NULL; + } + } + return data_frame_make(cmd, status, length, data); +} + /** * before reader run, reset reader and on antenna, @@ -480,6 +531,8 @@ static cmd_data_map_t m_data_cmd_map[] = { { DATA_CMD_LOAD_MF1_BLOCK_DATA, NULL, cmd_processor_set_mf1_emulator_block, NULL }, { DATA_CMD_SET_MF1_ANTI_COLLISION_RES, NULL, cmd_processor_set_mf1_anti_collision_res, NULL }, + { DATA_CMD_SET_SLOT_TAG_NICK, NULL, cmd_processor_set_slot_tag_nick_name, NULL }, + { DATA_CMD_GET_SLOT_TAG_NICK, NULL, cmd_processor_get_slot_tag_nick_name, NULL }, }; diff --git a/firmware/application/src/app_main.c b/firmware/application/src/app_main.c index f88d749..f8b7c80 100644 --- a/firmware/application/src/app_main.c +++ b/firmware/application/src/app_main.c @@ -392,9 +392,9 @@ int main(void) { button_init(); // 鎸夐挳鍒濆鍖 init_leds(); // LED鍒濆鍖 sleep_timer_init(); // 浼戠湢鐢ㄧ殑杞畾鏃跺櫒鍒濆鍖 - usb_cdc_init(); // USB cdc妯℃嫙鍒濆鍖 rng_drv_and_srand_init(); // 闅忔満鏁扮敓鎴愬櫒鍒濆鍖 power_management_init(); // 鐢垫簮绠$悊鍒濆鍖 + usb_cdc_init(); // USB cdc妯℃嫙鍒濆鍖 ble_slave_init(); // 钃濈墮鍗忚鏍堝垵濮嬪寲 check_wakeup_src(); // 妫娴嬪敜閱掓簮锛屾牴鎹敜閱掓簮鍐冲畾BLE骞挎挱涓庡悗缁紤鐪犲姩浣 @@ -405,21 +405,20 @@ int main(void) { // cmd callback register on_data_frame_complete(on_data_frame_received); + // usbd event listener + APP_ERROR_CHECK(app_usbd_power_events_enable()); + // Enter main loop. - NRF_LOG_INFO("NFC TAG & Reader Started"); + NRF_LOG_INFO("NFC TAG & Reader Started 1"); while (1) { // Button event process button_press_process(); // Data pack process data_frame_process(); // Log print process - while (NRF_LOG_PROCESS()) { - __NOP(); - } + while (NRF_LOG_PROCESS()); // USB event process - while (app_usbd_event_queue_process()) { - __NOP(); - } + while (app_usbd_event_queue_process()); // No task to process, system sleep enter. sleep_system_run( system_off_enter, // If system idle sometime, we can enter deep sleep state. diff --git a/firmware/application/src/app_status.h b/firmware/application/src/app_status.h index 707bf2b..90125b0 100644 --- a/firmware/application/src/app_status.h +++ b/firmware/application/src/app_status.h @@ -41,4 +41,6 @@ #define STATUS_INVALID_CMD (0x67) // 鏃犳晥鐨勬寚浠 #define STATUS_DEVICE_SUCCESS (0x68) // 璁惧鐩稿叧鎿嶄綔鎴愬姛鎵ц #define STATUS_NOT_IMPLEMENTED (0x69) // 璋冪敤浜嗘煇浜涙湭瀹炵幇鐨勬搷浣滐紝灞炰簬寮鍙戣呴仐婕忕殑閿欒 +#define STATUS_FLASH_WRITE_FAIL (0x70) // flash鍐欏叆澶辫触 +#define STATUS_FLASH_READ_FAIL (0x71) // flash璇诲彇澶辫触 #endif diff --git a/firmware/application/src/data_cmd.h b/firmware/application/src/data_cmd.h index 8f296b8..6e95e42 100644 --- a/firmware/application/src/data_cmd.h +++ b/firmware/application/src/data_cmd.h @@ -14,6 +14,8 @@ #define DATA_CMD_SET_SLOT_TAG_TYPE (1004) #define DATA_CMD_SET_SLOT_DATA_DEFAULT (1005) #define DATA_CMD_SET_SLOT_ENABLE (1006) +#define DATA_CMD_SET_SLOT_TAG_NICK (1007) +#define DATA_CMD_GET_SLOT_TAG_NICK (1008) // // ******************************************************************