[fprint] [PATCH] imgdev: add support for FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS flag
Vasily Khoruzhick
anarsoul at gmail.com
Fri Feb 16 19:07:09 UTC 2018
On Thu, Feb 15, 2018 at 11:58 PM, Igor Filatov <ia.filatov at gmail.com> wrote:
> I think it would be better if libfprint simply called dev_activate each time
> it needed an image, including each enroll step, and then called
> dev_deactivate when it's done. Drivers should know whether they need to
> reactivate or not. But this will require changes to all the drivers of the
> devices that return images... which should actually amount to a few deleted
> lines.
And that'll result in breakage of older drivers.
> On Fri, Feb 16, 2018 at 3:57 AM 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.
>> ---
>> 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
>
>
> _______________________________________________
> fprint mailing list
> fprint at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/fprint
>
More information about the fprint
mailing list