goodixmoc: Add identify function
this device support verify and identify both, actually call the same interface.
This commit is contained in:
parent
d5f7f4dfaa
commit
f67f61c638
1 changed files with 80 additions and 40 deletions
|
@ -72,6 +72,12 @@ typedef struct
|
|||
SynCmdMsgCallback callback;
|
||||
} CommandData;
|
||||
|
||||
static gboolean parse_print_data (GVariant *data,
|
||||
guint8 *finger,
|
||||
const guint8 **tid,
|
||||
gsize *tid_len,
|
||||
const guint8 **user_id,
|
||||
gsize *user_id_len);
|
||||
/******************************************************************************
|
||||
*
|
||||
* fp_cmd_xxx Function
|
||||
|
@ -340,30 +346,74 @@ fp_verify_capture_cb (FpiDeviceGoodixMoc *self,
|
|||
}
|
||||
|
||||
static void
|
||||
fp_verify_identify_cb (FpiDeviceGoodixMoc *self,
|
||||
fp_verify_cb (FpiDeviceGoodixMoc *self,
|
||||
gxfp_cmd_response_t *resp,
|
||||
GError *error)
|
||||
{
|
||||
FpDevice *device = FP_DEVICE (self);
|
||||
FpPrint *print = NULL;
|
||||
GPtrArray *templates = NULL;
|
||||
gint cnt = 0;
|
||||
gboolean find = false;
|
||||
|
||||
if (error)
|
||||
{
|
||||
fpi_ssm_mark_failed (self->task_ssm, error);
|
||||
return;
|
||||
}
|
||||
if (!resp->verify.match)
|
||||
if (resp->verify.match)
|
||||
{
|
||||
fpi_device_verify_report (device, FPI_MATCH_FAIL, NULL, error);
|
||||
}
|
||||
else if (memcmp (&resp->verify.template.tid, &self->template_id, TEMPLATE_ID_SIZE) != 0)
|
||||
if (fpi_device_get_current_action (device) == FPI_DEVICE_ACTION_VERIFY)
|
||||
{
|
||||
fpi_device_verify_report (device, FPI_MATCH_FAIL, NULL, error);
|
||||
|
||||
templates = g_ptr_array_new_with_free_func (g_object_unref);
|
||||
fpi_device_get_verify_data (device, &print);
|
||||
g_ptr_array_add (templates, g_object_ref_sink (print));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
fp_info ("Verify successful! for user: %s finger: %d",
|
||||
resp->verify.template.payload.data, resp->verify.template.finger_index);
|
||||
fpi_device_verify_report (device, FPI_MATCH_SUCCESS, NULL, NULL);
|
||||
fpi_device_get_identify_data (device, &templates);
|
||||
}
|
||||
for (cnt = 0; cnt < templates->len; cnt++)
|
||||
{
|
||||
g_autoptr(GVariant) data = NULL;
|
||||
guint8 finger;
|
||||
const guint8 *user_id;
|
||||
gsize user_id_len = 0;
|
||||
const guint8 *tid;
|
||||
gsize tid_len = 0;
|
||||
print = g_ptr_array_index (templates, cnt);
|
||||
g_object_get (print, "fpi-data", &data, NULL);
|
||||
if (!parse_print_data (data, &finger, &tid, &tid_len, &user_id, &user_id_len))
|
||||
{
|
||||
fpi_ssm_mark_failed (self->task_ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_DATA_INVALID,
|
||||
"Parse print error"));
|
||||
return;
|
||||
}
|
||||
if (memcmp (&resp->verify.template.tid, tid, TEMPLATE_ID_SIZE) == 0)
|
||||
{
|
||||
find = true;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
if (find)
|
||||
{
|
||||
if (fpi_device_get_current_action (device) == FPI_DEVICE_ACTION_VERIFY)
|
||||
fpi_device_verify_report (device, FPI_MATCH_SUCCESS, NULL, error);
|
||||
else
|
||||
fpi_device_identify_report (device, print, print, error);
|
||||
}
|
||||
}
|
||||
|
||||
if (!find)
|
||||
{
|
||||
if (fpi_device_get_current_action (device) == FPI_DEVICE_ACTION_VERIFY)
|
||||
fpi_device_verify_report (device, FPI_MATCH_FAIL, NULL, error);
|
||||
else
|
||||
fpi_device_identify_report (device, NULL, NULL, error);
|
||||
}
|
||||
|
||||
fpi_ssm_mark_completed (self->task_ssm);
|
||||
|
@ -375,6 +425,7 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||
{
|
||||
FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device);
|
||||
guint8 param[3] = { 0 };
|
||||
guint8 nonce[TEMPLATE_ID_SIZE] = { 0 };
|
||||
|
||||
param[0] = 0x01;
|
||||
param[1] = self->sensorcfg->config[10];
|
||||
|
@ -393,9 +444,9 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||
case FP_VERIFY_IDENTIFY:
|
||||
goodix_sensor_cmd (self, MOC_CMD0_IDENTIFY, MOC_CMD1_DEFAULT,
|
||||
false,
|
||||
(const guint8 *) &self->template_id,
|
||||
(const guint8 *) nonce,
|
||||
TEMPLATE_ID_SIZE,
|
||||
fp_verify_identify_cb);
|
||||
fp_verify_cb);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -409,10 +460,19 @@ fp_verify_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
|
|||
fp_info ("Verify complete!");
|
||||
|
||||
if (error && error->domain == FP_DEVICE_RETRY)
|
||||
{
|
||||
if (fpi_device_get_current_action (dev) == FPI_DEVICE_ACTION_VERIFY)
|
||||
fpi_device_verify_report (dev, FPI_MATCH_ERROR, NULL, error);
|
||||
else
|
||||
fpi_device_identify_report (dev, NULL, NULL, error);
|
||||
}
|
||||
|
||||
if (fpi_device_get_current_action (dev) == FPI_DEVICE_ACTION_VERIFY)
|
||||
fpi_device_verify_complete (dev, error);
|
||||
|
||||
else
|
||||
fpi_device_identify_complete (dev, error);
|
||||
|
||||
self->task_ssm = NULL;
|
||||
}
|
||||
|
||||
|
@ -1252,30 +1312,9 @@ gx_fp_exit (FpDevice *device)
|
|||
|
||||
|
||||
static void
|
||||
gx_fp_verify (FpDevice *device)
|
||||
gx_fp_verify_identify (FpDevice *device)
|
||||
{
|
||||
|
||||
FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device);
|
||||
FpPrint *print = NULL;
|
||||
|
||||
g_autoptr(GVariant) data = NULL;
|
||||
guint8 finger;
|
||||
const guint8 *user_id;
|
||||
gsize user_id_len = 0;
|
||||
const guint8 *tid;
|
||||
gsize tid_len = 0;
|
||||
|
||||
fpi_device_get_verify_data (device, &print);
|
||||
|
||||
g_object_get (print, "fpi-data", &data, NULL);
|
||||
|
||||
if (!parse_print_data (data, &finger, &tid, &tid_len, &user_id, &user_id_len))
|
||||
{
|
||||
fpi_device_verify_complete (device,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID));
|
||||
return;
|
||||
}
|
||||
memcpy (&self->template_id, tid, tid_len);
|
||||
|
||||
self->task_ssm = fpi_ssm_new (device, fp_verify_sm_run_state,
|
||||
FP_VERIFY_NUM_STATES);
|
||||
|
@ -1405,9 +1444,10 @@ fpi_device_goodixmoc_class_init (FpiDeviceGoodixMocClass *klass)
|
|||
dev_class->open = gx_fp_init;
|
||||
dev_class->close = gx_fp_exit;
|
||||
dev_class->probe = gx_fp_probe;
|
||||
dev_class->verify = gx_fp_verify;
|
||||
dev_class->enroll = gx_fp_enroll;
|
||||
dev_class->delete = gx_fp_template_delete;
|
||||
dev_class->list = gx_fp_template_list;
|
||||
dev_class->cancel = gx_fp_cancel;
|
||||
dev_class->verify = gx_fp_verify_identify;
|
||||
dev_class->identify = gx_fp_verify_identify;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue