From b4e6aef2c85fa0f81a21e90a7ccb8c833b63cd55 Mon Sep 17 00:00:00 2001 From: Andrey Perminov Date: Wed, 29 Apr 2020 10:57:37 -0700 Subject: [PATCH] Added functions for template upload/download Change-Id: Ia2560c4419c456d8f0292c52b5ff9405146bf58b --- BMLite_example/inc/bep_host_if.h | 3 ++ BMLite_example/src/bep_host_if.c | 65 ++++++++++++++++++++++++++++++-- BMLite_example/src/main.c | 42 ++++++++++++++++++++- 3 files changed, 106 insertions(+), 4 deletions(-) diff --git a/BMLite_example/inc/bep_host_if.h b/BMLite_example/inc/bep_host_if.h index b05033d..273e6b2 100644 --- a/BMLite_example/inc/bep_host_if.h +++ b/BMLite_example/inc/bep_host_if.h @@ -173,4 +173,7 @@ fpc_bep_result_t bep_sensor_wait_for_finger(fpc_com_chain_t *chain, uint16_t tim */ fpc_bep_result_t bep_sensor_wait_finger_not_present(fpc_com_chain_t *chain, uint16_t timeout); +fpc_bep_result_t bep_template_get(fpc_com_chain_t *chain, uint16_t template_id, uint8_t *data, uint32_t size, uint16_t *tmplsize); +fpc_bep_result_t bep_template_put(fpc_com_chain_t *chain, uint16_t template_id, uint8_t *data, uint16_t size); + #endif /* BEP_HOST_IF_H */ diff --git a/BMLite_example/src/bep_host_if.c b/BMLite_example/src/bep_host_if.c index c28dd24..9212593 100644 --- a/BMLite_example/src/bep_host_if.c +++ b/BMLite_example/src/bep_host_if.c @@ -130,9 +130,9 @@ static fpc_bep_result_t send_command(fpc_com_chain_t *chain, fpc_hcp_cmd_t comma * @param arg_data2_length second argument * @return ::fpc_bep_result_t */ -static fpc_bep_result_t receive_result_args2(fpc_com_chain_t *chain, - fpc_hcp_arg_t arg_key1, void *arg_data1, uint16_t arg_data1_length, - fpc_hcp_arg_t arg_key2, void *arg_data2, uint16_t arg_data2_length) +static fpc_bep_result_t receive_result_args2_sizes(fpc_com_chain_t *chain, + fpc_hcp_arg_t arg_key1, void *arg_data1, uint16_t arg_data1_length, uint16_t *arg1_size, + fpc_hcp_arg_t arg_key2, void *arg_data2, uint16_t arg_data2_length, uint16_t *arg2_size) { fpc_hcp_packet_t response; fpc_hcp_arg_data_t args_rx[10] = {{ 0 }}; @@ -168,6 +168,7 @@ static fpc_bep_result_t receive_result_args2(fpc_com_chain_t *chain, if (arg_key1 != ARG_NONE) { arg_data = fpc_hcp_arg_get(&response, arg_key1); if (arg_data && arg_data->size <= arg_data1_length) { + *arg1_size = arg_data->size; memcpy(arg_data1, arg_data->data, arg_data->size); } else { log_error("%s %d argument missing\n", __func__, arg_key1); @@ -180,6 +181,7 @@ static fpc_bep_result_t receive_result_args2(fpc_com_chain_t *chain, if (arg_key2 != ARG_NONE) { arg_data = fpc_hcp_arg_get(&response, arg_key2); if (arg_data && arg_data->size <= arg_data2_length) { + *arg2_size = arg_data->size; memcpy(arg_data2, arg_data->data, arg_data->size); } else { /* Not an error since the second argument is optional */ @@ -193,6 +195,16 @@ exit: return bep_result; } +static fpc_bep_result_t receive_result_args2(fpc_com_chain_t *chain, + fpc_hcp_arg_t arg_key1, void *arg_data1, uint16_t arg_data1_length, + fpc_hcp_arg_t arg_key2, void *arg_data2, uint16_t arg_data2_length) +{ + uint16_t arg_size1; + uint16_t arg_size2; + return receive_result_args2_sizes(chain, arg_key1, arg_data1, arg_data1_length, &arg_size1, + arg_key2, arg_data2, arg_data2_length, &arg_size2); +} + static fpc_bep_result_t receive_result_no_args(fpc_com_chain_t *chain) { return receive_result_args2(chain, ARG_NONE, NULL, 0, ARG_NONE, NULL, 0); @@ -531,3 +543,50 @@ fpc_bep_result_t bep_sensor_wait_finger_not_present(fpc_com_chain_t *chain, uint /* Wait for finger to be lifted from sensor */ return receive_result_no_args(chain); } + +fpc_bep_result_t bep_template_get(fpc_com_chain_t *chain, uint16_t template_id, uint8_t *data, uint32_t size, uint16_t *tmplsize) +{ + fpc_bep_result_t bep_result; + uint16_t tmpl_id = template_id; + + + bep_result = send_command_args2(chain, CMD_STORAGE_TEMPLATE, ARG_UPLOAD, 0, 0, ARG_ID, &tmpl_id, + sizeof(tmpl_id)); + if (bep_result != FPC_BEP_RESULT_OK) { + log_error("%s:%u, ERROR\n", __func__, __LINE__); + return bep_result; + } + + bep_result = receive_result_no_args(chain); + if(bep_result != FPC_BEP_RESULT_OK) { + log_error("%s:%u, ERROR\n", __func__, __LINE__); + return bep_result; + } + + bep_result = send_command(chain, CMD_TEMPLATE, ARG_UPLOAD, NULL, 0); + if (bep_result != FPC_BEP_RESULT_OK) { + log_error("Template download failed\n"); + return bep_result; + } + + return receive_result_args2_sizes(chain, ARG_DATA, data, size, tmplsize, ARG_NONE, 0, 0, 0); +} + +fpc_bep_result_t bep_template_put(fpc_com_chain_t *chain, uint16_t template_id, uint8_t *data, uint16_t size) +{ + fpc_bep_result_t bep_result; + + bep_result = send_command_args2(chain, CMD_TEMPLATE, ARG_DOWNLOAD, 0, 0, ARG_DATA, data, size); + if (bep_result != FPC_BEP_RESULT_OK) { + log_error("%s:%u, ERROR\n", __func__, __LINE__); + return bep_result; + } + bep_result = receive_result_no_args(chain); + if(bep_result != FPC_BEP_RESULT_OK) { + log_error("%s:%u, ERROR\n", __func__, __LINE__); + return bep_result; + } + + return bep_save_template(chain, template_id); +} + \ No newline at end of file diff --git a/BMLite_example/src/main.c b/BMLite_example/src/main.c index 8eab909..e24f0c0 100644 --- a/BMLite_example/src/main.c +++ b/BMLite_example/src/main.c @@ -43,7 +43,7 @@ static void help(void) int main (int argc, char **argv) { - char *port = NULL; + char *port = NULL; int baudrate = 921600; int timeout = 5; int index; @@ -139,6 +139,8 @@ int main (int argc, char **argv) printf("c: Remove all templates\n"); printf("d: Save template\n"); printf("e: Remove template\n"); + printf("t: Get template\n"); + printf("T: Put template\n"); printf("f: Capture image\n"); printf("g: Image upload\n"); printf("h: Get version\n"); @@ -168,6 +170,44 @@ int main (int argc, char **argv) template_id = atoi(cmd); res = bep_save_template(&hcp_chain, template_id); break; + case 't': { + printf("Template id: "); + fgets(cmd, sizeof(cmd), stdin); + template_id = atoi(cmd); + uint8_t *buf = malloc(10240); + memset(buf,0,10240); + uint16_t tmpl_size = 0; + res = bep_template_get(&hcp_chain, template_id, buf, 10240, &tmpl_size); + printf("Template size: %d\n", tmpl_size); + if (res == FPC_BEP_RESULT_OK) { + FILE *f = fopen("tmpl.raw", "wb"); + if (f) { + fwrite(buf, tmpl_size, 1, f); + fclose(f); + printf("Template saved as tmpl.raw\n"); + } + } + free(buf); + break; + } + case 'T': { + printf("Template id: "); + fgets(cmd, sizeof(cmd), stdin); + template_id = atoi(cmd); + uint8_t *buf = malloc(10240); + memset(buf,0,10240); + uint16_t tmpl_size = 0; + FILE *f = fopen("tmpl.raw", "rb"); + if (f) { + printf("Read template from tmpl.raw\n"); + tmpl_size = fread(buf, 1, 10240, f); + printf("Template size: %d\n", tmpl_size); + fclose(f); + } + res = bep_template_put(&hcp_chain, template_id, buf, tmpl_size); + free(buf); + break; + } case 'e': printf("Template id: "); fgets(cmd, sizeof(cmd), stdin);