Enrollment tweaks
upekts will need to know when the first enrollment stage is attempted for the first time, so add an __enroll_stage counter which actually indicates the next stage to enroll. -1 is a special value and it means 0 is next *and* it is the initial attemt. Added more debug output to the enroll handler. Added new fp_enroll_status codes for too short or uncentered scans. Changed the print_data allocator to consider the device rather than the driver, this feels more natural. Added missing return value. Make fp_enroll_status codes start at 1. 0 can now be used as a special/temporary value by the drivers. Also check that we aren't exceeding the number of enroll stages. Also add a missing exit() call to the verify example and update for the above.
This commit is contained in:
parent
e6624fe508
commit
50e2de0730
5 changed files with 69 additions and 8 deletions
|
@ -60,6 +60,13 @@ struct fp_print_data *enroll(struct fp_dev *dev) {
|
||||||
case FP_ENROLL_RETRY:
|
case FP_ENROLL_RETRY:
|
||||||
printf("Didn't quite catch that. Please try again.\n");
|
printf("Didn't quite catch that. Please try again.\n");
|
||||||
break;
|
break;
|
||||||
|
case FP_ENROLL_RETRY_TOO_SHORT:
|
||||||
|
printf("Your swipe was too short, please try again.\n");
|
||||||
|
break;
|
||||||
|
case FP_ENROLL_RETRY_CENTER_FINGER:
|
||||||
|
printf("Didn't catch that, please center your finger on the "
|
||||||
|
"sensor and try again.\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} while (status != FP_ENROLL_COMPLETE);
|
} while (status != FP_ENROLL_COMPLETE);
|
||||||
|
|
||||||
|
@ -103,6 +110,7 @@ int main(void)
|
||||||
fp_dscv_devs_free(discovered_devs);
|
fp_dscv_devs_free(discovered_devs);
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
fprintf(stderr, "Could not open device.\n");
|
fprintf(stderr, "Could not open device.\n");
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Opened device. It's now time to enroll your finger.\n\n");
|
printf("Opened device. It's now time to enroll your finger.\n\n");
|
||||||
|
|
|
@ -178,6 +178,7 @@ API_EXPORTED struct fp_dev *fp_dev_open(struct fp_dscv_dev *ddev)
|
||||||
dev = g_malloc0(sizeof(*dev));
|
dev = g_malloc0(sizeof(*dev));
|
||||||
dev->drv = drv;
|
dev->drv = drv;
|
||||||
dev->udev = udevh;
|
dev->udev = udevh;
|
||||||
|
dev->__enroll_stage = -1;
|
||||||
|
|
||||||
if (drv->init) {
|
if (drv->init) {
|
||||||
r = drv->init(dev);
|
r = drv->init(dev);
|
||||||
|
@ -226,13 +227,58 @@ API_EXPORTED enum fp_enroll_status fp_enroll_finger(struct fp_dev *dev,
|
||||||
struct fp_print_data **print_data)
|
struct fp_print_data **print_data)
|
||||||
{
|
{
|
||||||
const struct fp_driver *drv = dev->drv;
|
const struct fp_driver *drv = dev->drv;
|
||||||
|
enum fp_enroll_status ret;
|
||||||
|
int stage = dev->__enroll_stage;
|
||||||
|
gboolean initial = FALSE;
|
||||||
|
|
||||||
if (!dev->nr_enroll_stages || !drv->enroll) {
|
if (!dev->nr_enroll_stages || !drv->enroll) {
|
||||||
fp_err("driver %s has 0 enroll stages or no enroll func",
|
fp_err("driver %s has 0 enroll stages or no enroll func",
|
||||||
dev->drv->name);
|
dev->drv->name);
|
||||||
return FP_ENROLL_FAIL;
|
return FP_ENROLL_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return drv->enroll(dev, print_data);
|
if (stage == -1) {
|
||||||
|
initial = TRUE;
|
||||||
|
dev->__enroll_stage = ++stage;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stage >= dev->nr_enroll_stages) {
|
||||||
|
fp_err("exceeding number of enroll stages for device claimed by "
|
||||||
|
"driver %s (%d stages)", dev->drv->name, dev->nr_enroll_stages);
|
||||||
|
return FP_ENROLL_FAIL;
|
||||||
|
}
|
||||||
|
fp_dbg("%s will handle enroll stage %d/%d%s", drv->name, stage,
|
||||||
|
dev->nr_enroll_stages - 1, initial ? " (initial)" : "");
|
||||||
|
|
||||||
|
ret = drv->enroll(dev, initial, stage, print_data);
|
||||||
|
switch (ret) {
|
||||||
|
case FP_ENROLL_PASS:
|
||||||
|
fp_dbg("enroll stage passed");
|
||||||
|
dev->__enroll_stage = stage + 1;
|
||||||
|
break;
|
||||||
|
case FP_ENROLL_COMPLETE:
|
||||||
|
fp_dbg("enroll complete");
|
||||||
|
dev->__enroll_stage = -1;
|
||||||
|
break;
|
||||||
|
case FP_ENROLL_RETRY:
|
||||||
|
fp_dbg("enroll should retry");
|
||||||
|
break;
|
||||||
|
case FP_ENROLL_RETRY_TOO_SHORT:
|
||||||
|
fp_dbg("swipe was too short, enroll should retry");
|
||||||
|
break;
|
||||||
|
case FP_ENROLL_RETRY_CENTER_FINGER:
|
||||||
|
fp_dbg("finger was not centered, enroll should retry");
|
||||||
|
break;
|
||||||
|
case FP_ENROLL_FAIL:
|
||||||
|
fp_err("enroll failed");
|
||||||
|
dev->__enroll_stage = -1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fp_err("unrecognised return code %d", ret);
|
||||||
|
dev->__enroll_stage = -1;
|
||||||
|
return FP_ENROLL_FAIL;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
API_EXPORTED int fp_init(void)
|
API_EXPORTED int fp_init(void)
|
||||||
|
|
|
@ -24,12 +24,13 @@
|
||||||
|
|
||||||
#include "fp_internal.h"
|
#include "fp_internal.h"
|
||||||
|
|
||||||
struct fp_print_data *fpi_print_data_new(struct fp_driver *drv, size_t length)
|
struct fp_print_data *fpi_print_data_new(struct fp_dev *dev, size_t length)
|
||||||
{
|
{
|
||||||
struct fp_print_data *data = g_malloc(sizeof(*data) + length);
|
struct fp_print_data *data = g_malloc(sizeof(*data) + length);
|
||||||
fp_dbg("length=%z", length);
|
fp_dbg("length=%zd", length);
|
||||||
data->driver_name = drv->name;
|
data->driver_name = dev->drv->name;
|
||||||
data->length = length;
|
data->length = length;
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char *fpi_print_data_get_buffer(struct fp_print_data *data)
|
unsigned char *fpi_print_data_get_buffer(struct fp_print_data *data)
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
#include <usb.h>
|
#include <usb.h>
|
||||||
|
|
||||||
#ifdef __DARWIN_NULL
|
#ifdef __DARWIN_NULL
|
||||||
|
@ -65,6 +66,9 @@ struct fp_dev {
|
||||||
void *priv;
|
void *priv;
|
||||||
|
|
||||||
int nr_enroll_stages;
|
int nr_enroll_stages;
|
||||||
|
|
||||||
|
/* drivers should not mess with these */
|
||||||
|
int __enroll_stage;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct usb_id {
|
struct usb_id {
|
||||||
|
@ -81,8 +85,8 @@ struct fp_driver {
|
||||||
/* Device operations */
|
/* Device operations */
|
||||||
int (*init)(struct fp_dev *dev);
|
int (*init)(struct fp_dev *dev);
|
||||||
void (*exit)(struct fp_dev *dev);
|
void (*exit)(struct fp_dev *dev);
|
||||||
enum fp_enroll_status (*enroll)(struct fp_dev *dev,
|
enum fp_enroll_status (*enroll)(struct fp_dev *dev, gboolean initial,
|
||||||
struct fp_print_data **print_data);
|
int stage, struct fp_print_data **print_data);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const struct fp_driver upekts_driver;
|
extern const struct fp_driver upekts_driver;
|
||||||
|
@ -98,7 +102,7 @@ struct fp_print_data {
|
||||||
unsigned char buffer[0];
|
unsigned char buffer[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fp_print_data *fpi_print_data_new(struct fp_driver *drv, size_t length);
|
struct fp_print_data *fpi_print_data_new(struct fp_dev *dev, size_t length);
|
||||||
unsigned char *fpi_print_data_get_buffer(struct fp_print_data *data);
|
unsigned char *fpi_print_data_get_buffer(struct fp_print_data *data);
|
||||||
int fpi_print_data_compatible(struct fp_dev *dev, struct fp_print_data *data);
|
int fpi_print_data_compatible(struct fp_dev *dev, struct fp_print_data *data);
|
||||||
|
|
||||||
|
|
|
@ -43,10 +43,12 @@ const char *fp_driver_get_full_name(const struct fp_driver *drv);
|
||||||
|
|
||||||
/* Enrolment */
|
/* Enrolment */
|
||||||
enum fp_enroll_status {
|
enum fp_enroll_status {
|
||||||
FP_ENROLL_COMPLETE,
|
FP_ENROLL_COMPLETE = 1,
|
||||||
FP_ENROLL_FAIL,
|
FP_ENROLL_FAIL,
|
||||||
FP_ENROLL_PASS,
|
FP_ENROLL_PASS,
|
||||||
FP_ENROLL_RETRY,
|
FP_ENROLL_RETRY,
|
||||||
|
FP_ENROLL_RETRY_TOO_SHORT,
|
||||||
|
FP_ENROLL_RETRY_CENTER_FINGER,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum fp_enroll_status fp_enroll_finger(struct fp_dev *dev,
|
enum fp_enroll_status fp_enroll_finger(struct fp_dev *dev,
|
||||||
|
|
Loading…
Add table
Reference in a new issue