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

Vasily Khoruzhick anarsoul at gmail.com
Fri Feb 16 19:07:49 UTC 2018


On Thu, Feb 15, 2018 at 5:56 PM, Marco Trevisan (TreviƱo)
<mail at 3v1n0.net> wrote:
> 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.

What's the purpose of this change?

> ---
>  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
>
> _______________________________________________
> fprint mailing list
> fprint at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/fprint


More information about the fprint mailing list