[fprint] [PATCH] imgdev: add support for FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS flag

Marco Trevisan (TreviƱo) mail at 3v1n0.net
Fri Feb 16 01:56:32 UTC 2018


When a device has this flag set, it has to be re-activated at
each enroll step, without performing any other cleanup.

This allows to solve this such case in a cleaner way inside
drivers.
---
 libfprint/fp_internal.h |  1 +
 libfprint/imgdev.c      | 30 +++++++++++++++++++++++++++---
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h
index 74c5f7f..ea46b1e 100644
--- a/libfprint/fp_internal.h
+++ b/libfprint/fp_internal.h
@@ -232,6 +232,7 @@ enum fp_print_data_type
fpi_driver_get_data_type(struct fp_driver *drv);
  /* flags for fp_img_driver.flags */
 #define FP_IMGDRV_SUPPORTS_UNCONDITIONAL_CAPTURE (1 << 0)
+#define FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS (1 << 1)
  struct fp_img_driver {
 	struct fp_driver driver;
diff --git a/libfprint/imgdev.c b/libfprint/imgdev.c
index 4408c23..20a1559 100644
--- a/libfprint/imgdev.c
+++ b/libfprint/imgdev.c
@@ -27,6 +27,9 @@
 #define BOZORTH3_DEFAULT_THRESHOLD 40
 #define IMG_ENROLL_STAGES 5
 +static int dev_activate(struct fp_img_dev *imgdev, enum
fp_imgdev_state state);
+static void dev_deactivate(struct fp_img_dev *imgdev);
+
 static int img_dev_open(struct fp_dev *dev, unsigned long driver_data)
 {
 	struct fp_img_dev *imgdev = g_malloc0(sizeof(*imgdev));
@@ -124,6 +127,7 @@ void fpi_imgdev_report_finger_status(struct
fp_img_dev *imgdev,
 	int r = imgdev->action_result;
 	struct fp_print_data *data = imgdev->acquire_data;
 	struct fp_img *img = imgdev->acquire_img;
+	struct fp_img_driver *imgdrv = fpi_driver_to_img_driver(imgdev->dev->drv);
  	fp_dbg(present ? "finger on sensor" : "finger removed");
 @@ -158,8 +162,14 @@ void fpi_imgdev_report_finger_status(struct
fp_img_dev *imgdev,
 		if (imgdev->action == IMG_ACTION_ENROLL &&
 		    r > 0 && r != FP_ENROLL_COMPLETE && r != FP_ENROLL_FAIL) {
 			imgdev->action_result = 0;
-			imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_ON;
-			dev_change_state(imgdev, IMGDEV_STATE_AWAIT_FINGER_ON);
+
+			if (imgdrv->flags & FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS) {
+				imgdev->action_state = IMG_ACQUIRE_STATE_DEACTIVATING;
+				dev_deactivate(imgdev);
+			} else {
+				imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_ON;
+				dev_change_state(imgdev, IMGDEV_STATE_AWAIT_FINGER_ON);
+			}
 		}
 		break;
 	case IMG_ACTION_VERIFY:
@@ -332,11 +342,16 @@ void fpi_imgdev_session_error(struct fp_img_dev
*imgdev, int error)
  void fpi_imgdev_activate_complete(struct fp_img_dev *imgdev, int status)
 {
+	struct fp_img_driver *imgdrv = fpi_driver_to_img_driver(imgdev->dev->drv);
+
 	fp_dbg("status %d", status);
  	switch (imgdev->action) {
 	case IMG_ACTION_ENROLL:
-		fpi_drvcb_enroll_started(imgdev->dev, status);
+		if (!(imgdrv->flags & FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS) ||
+		    imgdev->dev->state != DEV_STATE_ENROLLING) {
+			fpi_drvcb_enroll_started(imgdev->dev, status);
+		}
 		break;
 	case IMG_ACTION_VERIFY:
 		fpi_drvcb_verify_started(imgdev->dev, status);
@@ -360,10 +375,19 @@ void fpi_imgdev_activate_complete(struct
fp_img_dev *imgdev, int status)
  void fpi_imgdev_deactivate_complete(struct fp_img_dev *imgdev)
 {
+	struct fp_img_driver *imgdrv = fpi_driver_to_img_driver(imgdev->dev->drv);
+
 	fp_dbg("");
  	switch (imgdev->action) {
 	case IMG_ACTION_ENROLL:
+		if ((imgdrv->flags & FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS) &&
+			imgdev->dev->state == DEV_STATE_ENROLLING) {
+			imgdev->action_state = IMG_ACQUIRE_STATE_ACTIVATING;
+			dev_activate(imgdev, IMGDEV_STATE_AWAIT_FINGER_ON);
+			return;
+		}
+
 		fpi_drvcb_enroll_stopped(imgdev->dev);
 		break;
 	case IMG_ACTION_VERIFY:
-- 
2.7.4



More information about the fprint mailing list