From 7dfebd37ab5461d07ee376013b4ed9802d342911 Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Fri, 23 Dec 2022 22:01:36 +0800 Subject: [PATCH] New api added. --- firmware/application/app/app_cmd.c | 133 ++++++++++++++++++++++++---- firmware/application/app/data_cmd.h | 71 ++++++++++----- 2 files changed, 168 insertions(+), 36 deletions(-) diff --git a/firmware/application/app/app_cmd.c b/firmware/application/app/app_cmd.c index dbb9c6e..bd7880b 100644 --- a/firmware/application/app/app_cmd.c +++ b/firmware/application/app/app_cmd.c @@ -213,16 +213,22 @@ data_frame_tx_t* cmd_processor_write_em410x_2_t57(uint16_t cmd, uint16_t status, return data_frame_make(cmd, status, 0, NULL); } +// 封装一个自动切换卡槽的调用函数 +static void change_slot_auto(uint8_t slot) { + device_mode_t mode = get_device_mode(); + // 读卡器模式下不需要禁用模拟卡再进行切换 + tag_emulation_change_slot(slot, mode != DEVICE_MODE_READER); + // 重新亮灯 + light_up_by_slot(); + // 默认亮起RGB + set_slot_light_color(0); +} + data_frame_tx_t* cmd_processor_set_slot_activated(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { // 需要确保传过来的卡槽号码不要超过支持的上限 if (length == 1 && data[0] < TAG_MAX_SLOT_NUM) { - uint8_t slot = data[0]; - device_mode_t mode = get_device_mode(); - // 读卡器模式下不需要禁用模拟卡再进行切换 - tag_emulation_change_slot(slot, mode != DEVICE_MODE_READER); - light_up_by_slot(); - set_slot_ligth_color(0); - status = STATUS_DEVICE_SUCCESS; + change_slot_auto(data[0]); + status = STATUS_DEVICE_SUCCESS; } else { status = STATUS_PAR_ERR; } @@ -231,13 +237,11 @@ data_frame_tx_t* cmd_processor_set_slot_activated(uint16_t cmd, uint16_t status, data_frame_tx_t* cmd_processor_set_slot_tag_type(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { // 需要确保传过来的标签类型是有效的 - if (length == 1 && data[0] != TAG_TYPE_UNKNOWN) { - // 取出上位机传过来的标签类型 - tag_specific_type_t tag_type = data[0]; - // 获得当前使能的卡槽 - uint8_t slot_index_now = tag_emulation_get_slot(); + if (length == 2 && data[0] < TAG_MAX_SLOT_NUM && data[1] != TAG_TYPE_UNKNOWN) { + uint8_t num_slot = data[0]; // 获得要操作的卡槽 + uint8_t tag_type = data[1]; // 取出上位机传过来的标签类型 // 将当前的卡槽切换到指定的模拟卡类型 - tag_emulation_change_type(slot_index_now, tag_type); + tag_emulation_change_type(num_slot, (tag_specific_type_t)tag_type); status = STATUS_DEVICE_SUCCESS; } else { status = STATUS_PAR_ERR; @@ -248,16 +252,107 @@ data_frame_tx_t* cmd_processor_set_slot_tag_type(uint16_t cmd, uint16_t status, data_frame_tx_t* cmd_processor_set_slot_data_default(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { // 需要确保传过来的标签类型是有效的 if (length == 2 && data[0] < TAG_MAX_SLOT_NUM && data[1] != TAG_TYPE_UNKNOWN) { - uint8_t target_init_slot_num = data[0]; // 获得要操作的卡槽 - tag_specific_type_t tag_type = data[1]; // 取出上位机传过来的标签类型 + uint8_t num_slot = data[0]; // 获得要操作的卡槽 + uint8_t tag_type = data[1]; // 取出上位机传过来的标签类型 // 重置当前的卡槽为缺省数据,如果失败,则可能是并未实现此API的缺省 - status = tag_emulation_factory_data(target_init_slot_num, tag_type) ? STATUS_DEVICE_SUCCESS : STATUS_NOT_IMPLEMENTED; + status = tag_emulation_factory_data(num_slot, (tag_specific_type_t)tag_type) ? STATUS_DEVICE_SUCCESS : STATUS_NOT_IMPLEMENTED; } else { status = STATUS_PAR_ERR; } return data_frame_make(cmd, status, 0, NULL); } +data_frame_tx_t* cmd_processor_set_slot_enable(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { + // 需要确保传过来的标签类型是有效的 + if (length == 2 && data[0] < TAG_MAX_SLOT_NUM && (data[1] == 0 || data[1] == 1)) { + uint8_t slot_now = data[0]; // 获得要操作的卡槽 + bool enable = data[1]; // 获得要操作的卡槽的状态 + tag_emulation_slot_set_enable(slot_now, enable); + if (!enable) { + // 禁用了当前卡槽后,重新找一个能用的卡槽,切换到那个卡槽上 + uint8_t slot_prev = tag_emulation_slot_find_next(slot_now); + NRF_LOG_INFO("slot_now = %d, slot_prev = %d", slot_now, slot_prev); + if (slot_prev == slot_now) { + // 找了一圈,发现并没有找到使能的卡槽,那么说明全部的卡槽都被禁用了 + // 此时我们应当灭掉卡槽灯 + set_slot_light_color(3); + } else { + change_slot_auto(slot_prev); + } + } + status = STATUS_DEVICE_SUCCESS; + } else { + status = STATUS_PAR_ERR; + } + return data_frame_make(cmd, status, 0, NULL); +} + +data_frame_tx_t* cmd_processor_set_em410x_emu_id(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { + // 需要确保传过来的ID长度是对的 + if (length == LF_EM410X_TAG_ID_SIZE) { + // 获取EM410x的缓冲区 + tag_data_buffer_t* buffer = get_buffer_by_tag_type(TAG_TYPE_EM410X); + // 设置卡号进去 + memcpy(buffer->buffer, data, LF_EM410X_TAG_ID_SIZE); + // 重新通知加载数据 + tag_emulation_load_by_buffer(TAG_TYPE_EM410X, false); + status = STATUS_DEVICE_SUCCESS; + } else { + status = STATUS_PAR_ERR; + } + return data_frame_make(cmd, status, 0, NULL); +} + +data_frame_tx_t* cmd_processor_set_mf1_detection_enable(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { + if (length == 1 && (data[0] == 0 || data[0] == 1)) { + nfc_tag_mf1_detection_log_clear(); // 无论如何,操作日志的记录状态都要清除日志的历史记录 + nfc_tag_mf1_set_detection_enable(data[0]); + status = STATUS_DEVICE_SUCCESS; + } else { + status = STATUS_PAR_ERR; + } + return data_frame_make(cmd, status, 0, NULL); +} + +data_frame_tx_t* cmd_processor_get_mf1_detection_count(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { + uint32_t count = nfc_tag_mf1_detection_log_count(); + if (count == 0xFFFFFFFF) { + count = 0; + } + status = STATUS_DEVICE_SUCCESS; + return data_frame_make(cmd, status, sizeof(uint32_t), (uint8_t *)&count); +} + +data_frame_tx_t* cmd_processor_get_mf1_detection_log(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { + uint32_t count; + uint32_t index; + uint8_t *resp = NULL; + nfc_tag_mf1_auth_log_t* logs = get_mf1_auth_log(&count); + if (length == 4) { + if (count == 0xFFFFFFFF) { + length = 0; + status = STATUS_PAR_ERR; + } else { + index = bytes_to_num(data, 4); + NRF_LOG_INFO("index = %d", index); + if (index < count) { + // 直接使用头部地址+index作为数据源 + resp = (uint8_t *)(logs + index); + // 计算当前还能传输多少个日志 + length = MIN(count - index, DATA_PACK_MAX_DATA_LENGTH / sizeof(nfc_tag_mf1_auth_log_t)) * sizeof(nfc_tag_mf1_auth_log_t); + status = STATUS_DEVICE_SUCCESS; + } else { + length = 0; + status = STATUS_PAR_ERR; + } + } + } else { + length = 0; + status = STATUS_PAR_ERR; + } + return data_frame_make(cmd, status, length, resp); +} + /** * before reader run, reset reader and on antenna, * we must to wait some time, to init picc(power). @@ -310,7 +405,13 @@ static cmd_data_map_t m_data_cmd_map[] = { { DATA_CMD_SET_SLOT_ACTIVATED, NULL, cmd_processor_set_slot_activated, NULL }, { DATA_CMD_SET_SLOT_TAG_TYPE, NULL, cmd_processor_set_slot_tag_type, NULL }, { DATA_CMD_SET_SLOT_DATA_DEFAULT, NULL, cmd_processor_set_slot_data_default, NULL }, + { DATA_CMD_SET_SLOT_ENABLE, NULL, cmd_processor_set_slot_enable, NULL }, + { DATA_CMD_SET_EM410X_EMU_ID, NULL, cmd_processor_set_em410x_emu_id, NULL }, + + { DATA_CMD_SET_MF1_DETECTION_ENABLE, NULL, cmd_processor_set_mf1_detection_enable, NULL }, + { DATA_CMD_GET_MF1_DETECTION_COUNT, NULL, cmd_processor_get_mf1_detection_count, NULL }, + { DATA_CMD_GET_MF1_DETECTION_RESULT, NULL, cmd_processor_get_mf1_detection_log, NULL }, }; diff --git a/firmware/application/app/data_cmd.h b/firmware/application/app/data_cmd.h index b539977..b0139fd 100644 --- a/firmware/application/app/data_cmd.h +++ b/firmware/application/app/data_cmd.h @@ -5,12 +5,15 @@ // ****************************************************************** // CMD for device // Range from 1000 -> 1999 -#define DATA_CMD_GET_APP_VERSION (1000) -#define DATA_CMD_CHANGE_DEVICE_MODE (1001) -#define DATA_CMD_GET_DEVICE_MODE (1002) -#define DATA_CMD_SET_SLOT_ACTIVATED (1003) -#define DATA_CMD_SET_SLOT_TAG_TYPE (1004) -#define DATA_CMD_SET_SLOT_DATA_DEFAULT (1005) +// ****************************************************************** +// +#define DATA_CMD_GET_APP_VERSION (1000) +#define DATA_CMD_CHANGE_DEVICE_MODE (1001) +#define DATA_CMD_GET_DEVICE_MODE (1002) +#define DATA_CMD_SET_SLOT_ACTIVATED (1003) +#define DATA_CMD_SET_SLOT_TAG_TYPE (1004) +#define DATA_CMD_SET_SLOT_DATA_DEFAULT (1005) +#define DATA_CMD_SET_SLOT_ENABLE (1006) // // ****************************************************************** @@ -18,27 +21,55 @@ // ****************************************************************** // CMD for hf reader // Range from 2000 -> 2999 -// #define DATA_CMD_XXXX (xxxx) +// ****************************************************************** +// +#define DATA_CMD_SCAN_14A_TAG (2000) +#define DATA_CMD_MF1_SUPPORT_DETECT (2001) +#define DATA_CMD_MF1_NT_LEVEL_DETECT (2002) +#define DATA_CMD_MF1_DARKSIDE_DETECT (2003) +#define DATA_CMD_MF1_DARKSIDE_ACQUIRE (2004) +#define DATA_CMD_MF1_NT_DIST_DETECT (2005) +#define DATA_CMD_MF1_NESTED_ACQUIRE (2006) +#define DATA_CMD_MF1_CHECK_ONE_KEY_BLOCK (2007) +#define DATA_CMD_MF1_READ_ONE_BLOCK (2008) +#define DATA_CMD_MF1_WRITE_ONE_BLOCK (2009) // // ****************************************************************** -#define DATA_CMD_SCAN_14A_TAG (2000) -#define DATA_CMD_MF1_SUPPORT_DETECT (2001) -#define DATA_CMD_MF1_NT_LEVEL_DETECT (2002) -#define DATA_CMD_MF1_DARKSIDE_DETECT (2003) -#define DATA_CMD_MF1_DARKSIDE_ACQUIRE (2004) -#define DATA_CMD_MF1_NT_DIST_DETECT (2005) -#define DATA_CMD_MF1_NESTED_ACQUIRE (2006) -#define DATA_CMD_MF1_CHECK_ONE_KEY_BLOCK (2007) -#define DATA_CMD_MF1_READ_ONE_BLOCK (2008) -#define DATA_CMD_MF1_WRITE_ONE_BLOCK (2009) + // ****************************************************************** // CMD for lf reader // Range from 3000 -> 3999 -// #define DATA_CMD_XXXX (xxxx) +// ****************************************************************** +// +#define DATA_CMD_SCAN_EM410X_TAG (3000) +#define DATA_CMD_WRITE_EM410X_TO_T5577 (3001) // // ****************************************************************** -#define DATA_CMD_SCAN_EM410X_TAG (3000) -#define DATA_CMD_WRITE_EM410X_TO_T5577 (3001) + +// ****************************************************************** +// CMD for hf emulator +// Range from 4000 -> 4999 +// ****************************************************************** +// +#define DATA_CMD_UPLOAD_MF1_DATA (4000) +// +// ****************************************************************** + + +// ****************************************************************** +// CMD for lf emulator +// Range from 5000 -> 5999 +// ****************************************************************** +// + +// +// ****************************************************************** +#define DATA_CMD_SET_EM410X_EMU_ID (5000) +#define DATA_CMD_SET_MF1_ANTICOLLISION_INFO (5001) +#define DATA_CMD_SET_MF1_ATS_RESOURCE (5002) +#define DATA_CMD_SET_MF1_DETECTION_ENABLE (5003) +#define DATA_CMD_GET_MF1_DETECTION_COUNT (5004) +#define DATA_CMD_GET_MF1_DETECTION_RESULT (5005) #endif