mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2025-11-15 07:38:12 +00:00
Compare commits
1 Commits
v1.90.2
...
benzea/ci-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1528c962fa |
@@ -48,11 +48,6 @@ build:
|
|||||||
<<: *build_one_driver
|
<<: *build_one_driver
|
||||||
<<: *build
|
<<: *build
|
||||||
# <<: *check_abi
|
# <<: *check_abi
|
||||||
artifacts:
|
|
||||||
expose_as: "HTML Documentation"
|
|
||||||
paths:
|
|
||||||
- _build/doc/html/
|
|
||||||
expire_in: 1 week
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
stage: test
|
stage: test
|
||||||
@@ -62,14 +57,13 @@ test:
|
|||||||
script:
|
script:
|
||||||
- meson --werror -Ddrivers=all -Db_coverage=true . _build
|
- meson --werror -Ddrivers=all -Db_coverage=true . _build
|
||||||
- ninja -C _build
|
- ninja -C _build
|
||||||
- meson test -C _build --verbose --no-stdsplit --timeout-multiplier 3
|
- meson test -C _build --verbose --no-stdsplit
|
||||||
- ninja -C _build coverage
|
- ninja -C _build coverage
|
||||||
- cat _build/meson-logs/coverage.txt
|
- cat _build/meson-logs/coverage.txt
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- _build/meson-logs
|
- _build/meson-logs
|
||||||
expire_in: 1 week
|
expire_in: 1 week
|
||||||
coverage: '/^TOTAL.*\s+(\d+\%)$/'
|
|
||||||
|
|
||||||
test_valgrind:
|
test_valgrind:
|
||||||
stage: test
|
stage: test
|
||||||
@@ -81,32 +75,13 @@ test_valgrind:
|
|||||||
- ninja -C _build
|
- ninja -C _build
|
||||||
- meson test -C _build --verbose --no-stdsplit --setup=valgrind
|
- meson test -C _build --verbose --no-stdsplit --setup=valgrind
|
||||||
|
|
||||||
test_scan_build:
|
|
||||||
stage: test
|
|
||||||
except:
|
|
||||||
variables:
|
|
||||||
- $CI_PIPELINE_SOURCE == "schedule"
|
|
||||||
allow_failure: true
|
|
||||||
script:
|
|
||||||
- meson -Ddrivers=all . _build
|
|
||||||
# This is ugly, the wrapper disables the malloc checker
|
|
||||||
- SCANBUILD=$CI_PROJECT_DIR/.gitlab-ci/scan-build ninja -C _build scan-build
|
|
||||||
# Check that the directory is empty
|
|
||||||
- "! ls -A _build/meson-logs/scanbuild | grep -q ."
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- _build/meson-logs
|
|
||||||
expire_in: 1 week
|
|
||||||
|
|
||||||
test_indent:
|
test_indent:
|
||||||
stage: check-source
|
stage: check-source
|
||||||
except:
|
except:
|
||||||
variables:
|
variables:
|
||||||
- $CI_PIPELINE_SOURCE == "schedule"
|
- $CI_PIPELINE_SOURCE == "schedule"
|
||||||
script:
|
script:
|
||||||
- scripts/uncrustify.sh
|
- scripts/uncrustify.sh --check
|
||||||
- git diff
|
|
||||||
- "! git status -s | grep -q ."
|
|
||||||
|
|
||||||
.flatpak_script_template: &flatpak_script
|
.flatpak_script_template: &flatpak_script
|
||||||
script:
|
script:
|
||||||
|
|||||||
@@ -24,4 +24,3 @@
|
|||||||
umockdev
|
umockdev
|
||||||
uncrustify
|
uncrustify
|
||||||
valgrind
|
valgrind
|
||||||
clang-analyzer
|
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# This wrapper just disables the malloc checker
|
|
||||||
exec /usr/bin/scan-build -disable-checker unix.Malloc "$@"
|
|
||||||
13
MAINTAINERS
13
MAINTAINERS
@@ -1,13 +0,0 @@
|
|||||||
Current maintainers of libfprint are:
|
|
||||||
|
|
||||||
* Benjamin Berg <bberg@redhat.com>
|
|
||||||
* Marco Trevisan (Treviño) <mail@3v1n0.net>
|
|
||||||
|
|
||||||
Many drivers are not actively maintained and may not be fully functional.
|
|
||||||
We are happy to receive contributions, but the support we can give is
|
|
||||||
limitted unfortunately. For many drivers we may not even have test devices.
|
|
||||||
|
|
||||||
Maintained drivers are:
|
|
||||||
* synaptics:
|
|
||||||
Contributed and maintained by Synaptics Inc.
|
|
||||||
Contact: Vincent Huang <vincent.huang@tw.synaptics.com>
|
|
||||||
10
NEWS
10
NEWS
@@ -1,16 +1,6 @@
|
|||||||
This file lists notable changes in each release. For the full history of all
|
This file lists notable changes in each release. For the full history of all
|
||||||
changes, see ChangeLog.
|
changes, see ChangeLog.
|
||||||
|
|
||||||
2020-06-08: v1.90.2 release
|
|
||||||
|
|
||||||
This release contains a large amount of bug and regression fixes. These
|
|
||||||
are not listed explicitly, but affect the majority of drivers.
|
|
||||||
|
|
||||||
Highlights:
|
|
||||||
* A patch for nbis required for some sensors was accidentally dropped in
|
|
||||||
an earlier release. Users of these sensors/drivers (aes1610, aes2501,
|
|
||||||
aes2550, aes1660, aes2660, elan, upektc_img) need to re-enroll (#142).
|
|
||||||
|
|
||||||
2019-11-20: v1.90.1 release
|
2019-11-20: v1.90.1 release
|
||||||
|
|
||||||
This release fixes a lot of the regressions introduced in 1.90.0. Please note
|
This release fixes a lot of the regressions introduced in 1.90.0. Please note
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ fpi_image_resize
|
|||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
<FILE>fpi-image-device</FILE>
|
<FILE>fpi-image-device</FILE>
|
||||||
<TITLE>Internal FpImageDevice</TITLE>
|
<TITLE>FpImageDevice</TITLE>
|
||||||
FpiImageDeviceState
|
FpiImageDeviceState
|
||||||
FpImageDeviceClass
|
FpImageDeviceClass
|
||||||
fpi_image_device_session_error
|
fpi_image_device_session_error
|
||||||
@@ -207,8 +207,6 @@ fpi_print_set_type
|
|||||||
fpi_print_set_device_stored
|
fpi_print_set_device_stored
|
||||||
fpi_print_add_from_image
|
fpi_print_add_from_image
|
||||||
fpi_print_bz3_match
|
fpi_print_bz3_match
|
||||||
fpi_print_generate_user_id
|
|
||||||
fpi_print_fill_from_user_id
|
|
||||||
</SECTION>
|
</SECTION>
|
||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Example fingerprint enrollment program
|
* Example fingerprint enrollment program
|
||||||
* Enrolls your chosen finger and saves the print to disk
|
* Enrolls your choosen finger and saves the print to disk
|
||||||
* Copyright (C) 2007 Daniel Drake <dsd@gentoo.org>
|
* Copyright (C) 2007 Daniel Drake <dsd@gentoo.org>
|
||||||
* Copyright (C) 2019 Marco Trevisan <marco.trevisan@canonical.com>
|
* Copyright (C) 2019 Marco Trevisan <marco.trevisan@canonical.com>
|
||||||
*
|
*
|
||||||
@@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <libfprint/fprint.h>
|
#include <libfprint/fprint.h>
|
||||||
#include <glib-unix.h>
|
|
||||||
|
|
||||||
#include "storage.h"
|
#include "storage.h"
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
@@ -31,8 +30,6 @@
|
|||||||
typedef struct _EnrollData
|
typedef struct _EnrollData
|
||||||
{
|
{
|
||||||
GMainLoop *loop;
|
GMainLoop *loop;
|
||||||
GCancellable *cancellable;
|
|
||||||
unsigned int sigint_handler;
|
|
||||||
FpFinger finger;
|
FpFinger finger;
|
||||||
int ret_value;
|
int ret_value;
|
||||||
} EnrollData;
|
} EnrollData;
|
||||||
@@ -40,8 +37,6 @@ typedef struct _EnrollData
|
|||||||
static void
|
static void
|
||||||
enroll_data_free (EnrollData *enroll_data)
|
enroll_data_free (EnrollData *enroll_data)
|
||||||
{
|
{
|
||||||
g_clear_handle_id (&enroll_data->sigint_handler, g_source_remove);
|
|
||||||
g_clear_object (&enroll_data->cancellable);
|
|
||||||
g_main_loop_unref (enroll_data->loop);
|
g_main_loop_unref (enroll_data->loop);
|
||||||
g_free (enroll_data);
|
g_free (enroll_data);
|
||||||
}
|
}
|
||||||
@@ -142,22 +137,11 @@ on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data)
|
|||||||
printf ("Scan your finger now.\n");
|
printf ("Scan your finger now.\n");
|
||||||
|
|
||||||
print_template = print_create_template (dev, enroll_data->finger);
|
print_template = print_create_template (dev, enroll_data->finger);
|
||||||
fp_device_enroll (dev, print_template, enroll_data->cancellable,
|
fp_device_enroll (dev, print_template, NULL, on_enroll_progress, NULL,
|
||||||
on_enroll_progress, NULL, NULL,
|
NULL, (GAsyncReadyCallback) on_enroll_completed,
|
||||||
(GAsyncReadyCallback) on_enroll_completed,
|
|
||||||
enroll_data);
|
enroll_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
sigint_cb (void *user_data)
|
|
||||||
{
|
|
||||||
EnrollData *enroll_data = user_data;
|
|
||||||
|
|
||||||
g_cancellable_cancel (enroll_data->cancellable);
|
|
||||||
|
|
||||||
return G_SOURCE_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
@@ -204,15 +188,8 @@ main (void)
|
|||||||
enroll_data->finger = finger;
|
enroll_data->finger = finger;
|
||||||
enroll_data->ret_value = EXIT_FAILURE;
|
enroll_data->ret_value = EXIT_FAILURE;
|
||||||
enroll_data->loop = g_main_loop_new (NULL, FALSE);
|
enroll_data->loop = g_main_loop_new (NULL, FALSE);
|
||||||
enroll_data->cancellable = g_cancellable_new ();
|
|
||||||
enroll_data->sigint_handler = g_unix_signal_add_full (G_PRIORITY_HIGH,
|
|
||||||
SIGINT,
|
|
||||||
sigint_cb,
|
|
||||||
enroll_data,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
fp_device_open (dev, enroll_data->cancellable,
|
fp_device_open (dev, NULL, (GAsyncReadyCallback) on_device_opened,
|
||||||
(GAsyncReadyCallback) on_device_opened,
|
|
||||||
enroll_data);
|
enroll_data);
|
||||||
|
|
||||||
g_main_loop_run (enroll_data->loop);
|
g_main_loop_run (enroll_data->loop);
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <libfprint/fprint.h>
|
#include <libfprint/fprint.h>
|
||||||
#include <glib-unix.h>
|
|
||||||
|
|
||||||
#include "storage.h"
|
#include "storage.h"
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
@@ -31,8 +30,6 @@
|
|||||||
typedef struct _VerifyData
|
typedef struct _VerifyData
|
||||||
{
|
{
|
||||||
GMainLoop *loop;
|
GMainLoop *loop;
|
||||||
GCancellable *cancellable;
|
|
||||||
unsigned int sigint_handler;
|
|
||||||
FpFinger finger;
|
FpFinger finger;
|
||||||
int ret_value;
|
int ret_value;
|
||||||
} VerifyData;
|
} VerifyData;
|
||||||
@@ -40,8 +37,6 @@ typedef struct _VerifyData
|
|||||||
static void
|
static void
|
||||||
verify_data_free (VerifyData *verify_data)
|
verify_data_free (VerifyData *verify_data)
|
||||||
{
|
{
|
||||||
g_clear_handle_id (&verify_data->sigint_handler, g_source_remove);
|
|
||||||
g_clear_object (&verify_data->cancellable);
|
|
||||||
g_main_loop_unref (verify_data->loop);
|
g_main_loop_unref (verify_data->loop);
|
||||||
g_free (verify_data);
|
g_free (verify_data);
|
||||||
}
|
}
|
||||||
@@ -201,7 +196,7 @@ on_list_completed (FpDevice *dev, GAsyncResult *res, gpointer user_data)
|
|||||||
fp_print_get_description (verify_print));
|
fp_print_get_description (verify_print));
|
||||||
|
|
||||||
g_print ("Print loaded. Time to verify!\n");
|
g_print ("Print loaded. Time to verify!\n");
|
||||||
fp_device_verify (dev, verify_print, verify_data->cancellable,
|
fp_device_verify (dev, verify_print, NULL,
|
||||||
on_match_cb, verify_data, NULL,
|
on_match_cb, verify_data, NULL,
|
||||||
(GAsyncReadyCallback) on_verify_completed,
|
(GAsyncReadyCallback) on_verify_completed,
|
||||||
verify_data);
|
verify_data);
|
||||||
@@ -255,7 +250,7 @@ start_verification (FpDevice *dev, VerifyData *verify_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_print ("Print loaded. Time to verify!\n");
|
g_print ("Print loaded. Time to verify!\n");
|
||||||
fp_device_verify (dev, verify_print, verify_data->cancellable,
|
fp_device_verify (dev, verify_print, NULL,
|
||||||
NULL, NULL, NULL,
|
NULL, NULL, NULL,
|
||||||
(GAsyncReadyCallback) on_verify_completed,
|
(GAsyncReadyCallback) on_verify_completed,
|
||||||
verify_data);
|
verify_data);
|
||||||
@@ -281,16 +276,6 @@ on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data)
|
|||||||
start_verification (dev, verify_data);
|
start_verification (dev, verify_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
sigint_cb (void *user_data)
|
|
||||||
{
|
|
||||||
VerifyData *verify_data = user_data;
|
|
||||||
|
|
||||||
g_cancellable_cancel (verify_data->cancellable);
|
|
||||||
|
|
||||||
return G_SOURCE_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
@@ -321,14 +306,8 @@ main (void)
|
|||||||
verify_data = g_new0 (VerifyData, 1);
|
verify_data = g_new0 (VerifyData, 1);
|
||||||
verify_data->ret_value = EXIT_FAILURE;
|
verify_data->ret_value = EXIT_FAILURE;
|
||||||
verify_data->loop = g_main_loop_new (NULL, FALSE);
|
verify_data->loop = g_main_loop_new (NULL, FALSE);
|
||||||
verify_data->cancellable = g_cancellable_new ();
|
|
||||||
verify_data->sigint_handler = g_unix_signal_add_full (G_PRIORITY_HIGH,
|
fp_device_open (dev, NULL, (GAsyncReadyCallback) on_device_opened,
|
||||||
SIGINT,
|
|
||||||
sigint_cb,
|
|
||||||
verify_data,
|
|
||||||
NULL);
|
|
||||||
fp_device_open (dev, verify_data->cancellable,
|
|
||||||
(GAsyncReadyCallback) on_device_opened,
|
|
||||||
verify_data);
|
verify_data);
|
||||||
|
|
||||||
g_main_loop_run (verify_data->loop);
|
g_main_loop_run (verify_data->loop);
|
||||||
|
|||||||
@@ -614,7 +614,6 @@ capture_read_strip_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
self->strips = g_slist_reverse (self->strips);
|
self->strips = g_slist_reverse (self->strips);
|
||||||
fpi_do_movement_estimation (&assembling_ctx, self->strips);
|
fpi_do_movement_estimation (&assembling_ctx, self->strips);
|
||||||
img = fpi_assemble_frames (&assembling_ctx, self->strips);
|
img = fpi_assemble_frames (&assembling_ctx, self->strips);
|
||||||
img->flags |= FPI_IMAGE_PARTIAL;
|
|
||||||
|
|
||||||
g_slist_free_full (self->strips, g_free);
|
g_slist_free_full (self->strips, g_free);
|
||||||
self->strips = NULL;
|
self->strips = NULL;
|
||||||
|
|||||||
@@ -458,7 +458,6 @@ capture_read_strip_cb (FpiUsbTransfer *transfer, FpDevice *_dev,
|
|||||||
fpi_do_movement_estimation (&assembling_ctx, self->strips);
|
fpi_do_movement_estimation (&assembling_ctx, self->strips);
|
||||||
img = fpi_assemble_frames (&assembling_ctx,
|
img = fpi_assemble_frames (&assembling_ctx,
|
||||||
self->strips);
|
self->strips);
|
||||||
img->flags |= FPI_IMAGE_PARTIAL;
|
|
||||||
g_slist_free_full (self->strips, g_free);
|
g_slist_free_full (self->strips, g_free);
|
||||||
self->strips = NULL;
|
self->strips = NULL;
|
||||||
self->strips_len = 0;
|
self->strips_len = 0;
|
||||||
|
|||||||
@@ -230,7 +230,6 @@ capture_set_idle_reqs_cb (FpiUsbTransfer *transfer,
|
|||||||
|
|
||||||
self->strips = g_slist_reverse (self->strips);
|
self->strips = g_slist_reverse (self->strips);
|
||||||
img = fpi_assemble_frames (&assembling_ctx, self->strips);
|
img = fpi_assemble_frames (&assembling_ctx, self->strips);
|
||||||
img->flags |= FPI_IMAGE_PARTIAL;
|
|
||||||
g_slist_free_full (self->strips, g_free);
|
g_slist_free_full (self->strips, g_free);
|
||||||
self->strips = NULL;
|
self->strips = NULL;
|
||||||
self->strips_len = 0;
|
self->strips_len = 0;
|
||||||
|
|||||||
@@ -331,7 +331,6 @@ capture_set_idle_cmd_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
|
|
||||||
priv->strips = g_slist_reverse (priv->strips);
|
priv->strips = g_slist_reverse (priv->strips);
|
||||||
img = fpi_assemble_frames (cls->assembling_ctx, priv->strips);
|
img = fpi_assemble_frames (cls->assembling_ctx, priv->strips);
|
||||||
img->flags |= FPI_IMAGE_PARTIAL;
|
|
||||||
g_slist_foreach (priv->strips, (GFunc) g_free, NULL);
|
g_slist_foreach (priv->strips, (GFunc) g_free, NULL);
|
||||||
g_slist_free (priv->strips);
|
g_slist_free (priv->strips);
|
||||||
priv->strips = NULL;
|
priv->strips = NULL;
|
||||||
|
|||||||
@@ -207,7 +207,6 @@ elan_save_img_frame (FpiDeviceElan *elandev)
|
|||||||
|
|
||||||
unsigned int frame_size = elandev->frame_width * elandev->frame_height;
|
unsigned int frame_size = elandev->frame_width * elandev->frame_height;
|
||||||
unsigned short *frame = g_malloc (frame_size * sizeof (short));
|
unsigned short *frame = g_malloc (frame_size * sizeof (short));
|
||||||
|
|
||||||
elan_save_frame (elandev, frame);
|
elan_save_frame (elandev, frame);
|
||||||
unsigned int sum = 0;
|
unsigned int sum = 0;
|
||||||
|
|
||||||
@@ -245,7 +244,6 @@ elan_process_frame_linear (unsigned short *raw_frame,
|
|||||||
G_DEBUG_HERE ();
|
G_DEBUG_HERE ();
|
||||||
|
|
||||||
unsigned short min = 0xffff, max = 0;
|
unsigned short min = 0xffff, max = 0;
|
||||||
|
|
||||||
for (int i = 0; i < frame_size; i++)
|
for (int i = 0; i < frame_size; i++)
|
||||||
{
|
{
|
||||||
if (raw_frame[i] < min)
|
if (raw_frame[i] < min)
|
||||||
@@ -257,7 +255,6 @@ elan_process_frame_linear (unsigned short *raw_frame,
|
|||||||
g_assert (max != min);
|
g_assert (max != min);
|
||||||
|
|
||||||
unsigned short px;
|
unsigned short px;
|
||||||
|
|
||||||
for (int i = 0; i < frame_size; i++)
|
for (int i = 0; i < frame_size; i++)
|
||||||
{
|
{
|
||||||
px = raw_frame[i];
|
px = raw_frame[i];
|
||||||
@@ -281,7 +278,6 @@ elan_process_frame_thirds (unsigned short *raw_frame,
|
|||||||
|
|
||||||
unsigned short lvl0, lvl1, lvl2, lvl3;
|
unsigned short lvl0, lvl1, lvl2, lvl3;
|
||||||
unsigned short *sorted = g_malloc (frame_size * sizeof (short));
|
unsigned short *sorted = g_malloc (frame_size * sizeof (short));
|
||||||
|
|
||||||
memcpy (sorted, raw_frame, frame_size * sizeof (short));
|
memcpy (sorted, raw_frame, frame_size * sizeof (short));
|
||||||
qsort (sorted, frame_size, sizeof (short), cmp_short);
|
qsort (sorted, frame_size, sizeof (short), cmp_short);
|
||||||
lvl0 = sorted[0];
|
lvl0 = sorted[0];
|
||||||
@@ -291,7 +287,6 @@ elan_process_frame_thirds (unsigned short *raw_frame,
|
|||||||
g_free (sorted);
|
g_free (sorted);
|
||||||
|
|
||||||
unsigned short px;
|
unsigned short px;
|
||||||
|
|
||||||
for (int i = 0; i < frame_size; i++)
|
for (int i = 0; i < frame_size; i++)
|
||||||
{
|
{
|
||||||
px = raw_frame[i];
|
px = raw_frame[i];
|
||||||
@@ -325,7 +320,6 @@ elan_submit_image (FpImageDevice *dev)
|
|||||||
g_slist_foreach (raw_frames, (GFunc) self->process_frame, &frames);
|
g_slist_foreach (raw_frames, (GFunc) self->process_frame, &frames);
|
||||||
fpi_do_movement_estimation (&assembling_ctx, frames);
|
fpi_do_movement_estimation (&assembling_ctx, frames);
|
||||||
img = fpi_assemble_frames (&assembling_ctx, frames);
|
img = fpi_assemble_frames (&assembling_ctx, frames);
|
||||||
img->flags |= FPI_IMAGE_PARTIAL;
|
|
||||||
|
|
||||||
g_slist_free_full (frames, g_free);
|
g_slist_free_full (frames, g_free);
|
||||||
|
|
||||||
@@ -515,7 +509,6 @@ elan_stop_capture (FpDevice *dev)
|
|||||||
|
|
||||||
FpiSsm *ssm =
|
FpiSsm *ssm =
|
||||||
fpi_ssm_new (dev, stop_capture_run_state, STOP_CAPTURE_NUM_STATES);
|
fpi_ssm_new (dev, stop_capture_run_state, STOP_CAPTURE_NUM_STATES);
|
||||||
|
|
||||||
fpi_ssm_start (ssm, stop_capture_complete);
|
fpi_ssm_start (ssm, stop_capture_complete);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -626,7 +619,6 @@ elan_capture (FpDevice *dev)
|
|||||||
elan_dev_reset_state (self);
|
elan_dev_reset_state (self);
|
||||||
FpiSsm *ssm =
|
FpiSsm *ssm =
|
||||||
fpi_ssm_new (dev, capture_run_state, CAPTURE_NUM_STATES);
|
fpi_ssm_new (dev, capture_run_state, CAPTURE_NUM_STATES);
|
||||||
|
|
||||||
fpi_ssm_start (ssm, capture_complete);
|
fpi_ssm_start (ssm, capture_complete);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -741,7 +733,7 @@ calibrate_run_state (FpiSsm *ssm, FpDevice *dev)
|
|||||||
fp_dbg ("calibration failed");
|
fp_dbg ("calibration failed");
|
||||||
fpi_ssm_mark_failed (ssm,
|
fpi_ssm_mark_failed (ssm,
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
||||||
"Calibration failed!"));
|
"Callibration failed!"));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -805,7 +797,6 @@ elan_calibrate (FpDevice *dev)
|
|||||||
|
|
||||||
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), calibrate_run_state,
|
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), calibrate_run_state,
|
||||||
CALIBRATE_NUM_STATES);
|
CALIBRATE_NUM_STATES);
|
||||||
|
|
||||||
fpi_ssm_start (ssm, calibrate_complete);
|
fpi_ssm_start (ssm, calibrate_complete);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -901,7 +892,6 @@ elan_activate (FpImageDevice *dev)
|
|||||||
FpiSsm *ssm =
|
FpiSsm *ssm =
|
||||||
fpi_ssm_new (FP_DEVICE (dev), activate_run_state,
|
fpi_ssm_new (FP_DEVICE (dev), activate_run_state,
|
||||||
ACTIVATE_NUM_STATES);
|
ACTIVATE_NUM_STATES);
|
||||||
|
|
||||||
fpi_ssm_start (ssm, activate_complete);
|
fpi_ssm_start (ssm, activate_complete);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -998,7 +988,7 @@ static void
|
|||||||
elan_change_state_async (FpDevice *dev,
|
elan_change_state_async (FpDevice *dev,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
fp_dbg ("state change dev: %p", dev);
|
g_message ("state change dev: %p", dev);
|
||||||
elan_change_state (FP_IMAGE_DEVICE (dev));
|
elan_change_state (FP_IMAGE_DEVICE (dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1015,10 +1005,7 @@ dev_change_state (FpImageDevice *dev, FpiImageDeviceState state)
|
|||||||
state = FPI_IMAGE_DEVICE_STATE_INACTIVE;
|
state = FPI_IMAGE_DEVICE_STATE_INACTIVE;
|
||||||
|
|
||||||
if (self->dev_state_next == state)
|
if (self->dev_state_next == state)
|
||||||
{
|
|
||||||
fp_dbg ("change to state %d already queued", state);
|
fp_dbg ("change to state %d already queued", state);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -859,15 +859,13 @@ m_capture_state (FpiSsm *ssm, FpDevice *dev)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
FpImage *img;
|
||||||
|
unsigned int img_size;
|
||||||
/* Remove empty parts 2 times for the 2 frames */
|
/* Remove empty parts 2 times for the 2 frames */
|
||||||
process_removefpi_end (self);
|
process_removefpi_end (self);
|
||||||
process_removefpi_end (self);
|
process_removefpi_end (self);
|
||||||
|
img_size = self->fp_height * FE_WIDTH;
|
||||||
if (self->fp_height >= FE_WIDTH)
|
img = fp_image_new (FE_WIDTH, self->fp_height);
|
||||||
{
|
|
||||||
FpImage *img = fp_image_new (FE_WIDTH, self->fp_height);
|
|
||||||
unsigned int img_size = self->fp_height * FE_WIDTH;
|
|
||||||
|
|
||||||
/* Images received are white on black, so invert it. */
|
/* Images received are white on black, so invert it. */
|
||||||
/* TODO detect sweep direction */
|
/* TODO detect sweep direction */
|
||||||
img->flags = FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_V_FLIPPED;
|
img->flags = FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_V_FLIPPED;
|
||||||
@@ -876,12 +874,6 @@ m_capture_state (FpiSsm *ssm, FpDevice *dev)
|
|||||||
fp_dbg ("Sending the raw fingerprint image (%dx%d)",
|
fp_dbg ("Sending the raw fingerprint image (%dx%d)",
|
||||||
img->width, img->height);
|
img->width, img->height);
|
||||||
fpi_image_device_image_captured (idev, img);
|
fpi_image_device_image_captured (idev, img);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fpi_image_device_retry_scan (idev, FP_DEVICE_RETRY_TOO_SHORT);
|
|
||||||
}
|
|
||||||
|
|
||||||
fpi_image_device_report_finger_status (idev, FALSE);
|
fpi_image_device_report_finger_status (idev, FALSE);
|
||||||
fpi_ssm_mark_completed (ssm);
|
fpi_ssm_mark_completed (ssm);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -206,7 +206,6 @@ parse_get_enrolled_users_report (bmkt_msg_resp_t *msg_resp, bmkt_response_t *res
|
|||||||
get_enroll_templates_resp->query_sequence = extract8 (msg_resp->payload, &offset);
|
get_enroll_templates_resp->query_sequence = extract8 (msg_resp->payload, &offset);
|
||||||
|
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
for (n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++)
|
for (n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++)
|
||||||
{
|
{
|
||||||
if (offset >= msg_resp->payload_len)
|
if (offset >= msg_resp->payload_len)
|
||||||
|
|||||||
@@ -316,7 +316,7 @@ typedef struct bmkt_init_resp
|
|||||||
*/
|
*/
|
||||||
typedef struct bmkt_enroll_resp
|
typedef struct bmkt_enroll_resp
|
||||||
{
|
{
|
||||||
int progress; /**< Shows current progress status [0-100] */
|
int progress; /**< Shows current progress stutus [0-100] */
|
||||||
uint8_t finger_id; /**< User's finger id [1-10] */
|
uint8_t finger_id; /**< User's finger id [1-10] */
|
||||||
uint8_t user_id[BMKT_MAX_USER_ID_LEN]; /**< User name to be enrolled */
|
uint8_t user_id[BMKT_MAX_USER_ID_LEN]; /**< User name to be enrolled */
|
||||||
} bmkt_enroll_resp_t;
|
} bmkt_enroll_resp_t;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ static const FpIdEntry id_table[] = {
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cmd_receive_cb (FpiUsbTransfer *transfer,
|
cmd_recieve_cb (FpiUsbTransfer *transfer,
|
||||||
FpDevice *device,
|
FpDevice *device,
|
||||||
gpointer user_data,
|
gpointer user_data,
|
||||||
GError *error)
|
GError *error)
|
||||||
@@ -234,7 +234,7 @@ synaptics_cmd_run_state (FpiSsm *ssm,
|
|||||||
fpi_usb_transfer_submit (transfer,
|
fpi_usb_transfer_submit (transfer,
|
||||||
5000,
|
5000,
|
||||||
NULL,
|
NULL,
|
||||||
cmd_receive_cb,
|
cmd_recieve_cb,
|
||||||
fpi_ssm_get_data (ssm));
|
fpi_ssm_get_data (ssm));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -321,7 +321,7 @@ synaptics_sensor_cmd (FpiDeviceSynaptics *self,
|
|||||||
g_assert (payload || payload_len == 0);
|
g_assert (payload || payload_len == 0);
|
||||||
|
|
||||||
/* seq_num of 0 means a normal command, -1 means the current commands
|
/* seq_num of 0 means a normal command, -1 means the current commands
|
||||||
* sequence number should not be updated (i.e. second async command which
|
* sequence number should not be udpated (i.e. second async command which
|
||||||
* may only be a cancellation currently). */
|
* may only be a cancellation currently). */
|
||||||
if (seq_num <= 0)
|
if (seq_num <= 0)
|
||||||
{
|
{
|
||||||
@@ -515,7 +515,39 @@ list_msg_cb (FpiDeviceSynaptics *self,
|
|||||||
g_object_set (print, "fpi-data", data, NULL);
|
g_object_set (print, "fpi-data", data, NULL);
|
||||||
g_object_set (print, "description", get_enroll_templates_resp->templates[n].user_id, NULL);
|
g_object_set (print, "description", get_enroll_templates_resp->templates[n].user_id, NULL);
|
||||||
|
|
||||||
fpi_print_fill_from_user_id (print, userid);
|
/* The format has 24 bytes at the start and some dashes in the right places */
|
||||||
|
if (g_str_has_prefix (userid, "FP1-") && strlen (userid) >= 24 &&
|
||||||
|
userid[12] == '-' && userid[14] == '-' && userid[23] == '-')
|
||||||
|
{
|
||||||
|
g_autofree gchar *copy = g_strdup (userid);
|
||||||
|
g_autoptr(GDate) date = NULL;
|
||||||
|
gint32 date_ymd;
|
||||||
|
gint32 finger;
|
||||||
|
gchar *username;
|
||||||
|
/* Try to parse information from the string. */
|
||||||
|
|
||||||
|
copy[12] = '\0';
|
||||||
|
date_ymd = g_ascii_strtod (copy + 4, NULL);
|
||||||
|
if (date_ymd > 0)
|
||||||
|
date = g_date_new_dmy (date_ymd % 100,
|
||||||
|
(date_ymd / 100) % 100,
|
||||||
|
date_ymd / 10000);
|
||||||
|
else
|
||||||
|
date = g_date_new ();
|
||||||
|
|
||||||
|
fp_print_set_enroll_date (print, date);
|
||||||
|
|
||||||
|
copy[14] = '\0';
|
||||||
|
finger = g_ascii_strtoll (copy + 13, NULL, 16);
|
||||||
|
fp_print_set_finger (print, finger);
|
||||||
|
|
||||||
|
/* We ignore the next chunk, it is just random data.
|
||||||
|
* Then comes the username; nobody is the default if the metadata
|
||||||
|
* is unknown */
|
||||||
|
username = copy + 24;
|
||||||
|
if (strlen (username) > 0 && g_strcmp0 (username, "nobody") != 0)
|
||||||
|
fp_print_set_username (print, username);
|
||||||
|
}
|
||||||
|
|
||||||
g_ptr_array_add (self->list_result, g_object_ref_sink (print));
|
g_ptr_array_add (self->list_result, g_object_ref_sink (print));
|
||||||
}
|
}
|
||||||
@@ -603,7 +635,7 @@ verify_msg_cb (FpiDeviceSynaptics *self,
|
|||||||
else if (resp->result == BMKT_FP_NO_MATCH)
|
else if (resp->result == BMKT_FP_NO_MATCH)
|
||||||
{
|
{
|
||||||
fp_info ("Print didn't match");
|
fp_info ("Print didn't match");
|
||||||
fpi_device_verify_report (device, FPI_MATCH_FAIL, NULL, NULL);
|
fpi_device_verify_report (device, FPI_MATCH_FAIL, NULL, error);
|
||||||
verify_complete_after_finger_removal (self);
|
verify_complete_after_finger_removal (self);
|
||||||
}
|
}
|
||||||
else if (resp->result == BMKT_FP_DATABASE_NO_RECORD_EXISTS)
|
else if (resp->result == BMKT_FP_DATABASE_NO_RECORD_EXISTS)
|
||||||
@@ -698,7 +730,7 @@ enroll_msg_cb (FpiDeviceSynaptics *self,
|
|||||||
if (enroll_resp->progress < 100)
|
if (enroll_resp->progress < 100)
|
||||||
done_stages = MIN (done_stages, ENROLL_SAMPLES - 1);
|
done_stages = MIN (done_stages, ENROLL_SAMPLES - 1);
|
||||||
|
|
||||||
/* Emit a retry error if there has been no discernible
|
/* Emit a retry error if there has been no discernable
|
||||||
* progress. Some firmware revisions report more required
|
* progress. Some firmware revisions report more required
|
||||||
* touches. */
|
* touches. */
|
||||||
if (self->enroll_stage == done_stages)
|
if (self->enroll_stage == done_stages)
|
||||||
@@ -763,6 +795,8 @@ enroll_msg_cb (FpiDeviceSynaptics *self,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define TEMPLATE_ID_SIZE 20
|
||||||
|
|
||||||
static void
|
static void
|
||||||
enroll (FpDevice *device)
|
enroll (FpDevice *device)
|
||||||
{
|
{
|
||||||
@@ -770,21 +804,52 @@ enroll (FpDevice *device)
|
|||||||
FpPrint *print = NULL;
|
FpPrint *print = NULL;
|
||||||
GVariant *data = NULL;
|
GVariant *data = NULL;
|
||||||
GVariant *uid = NULL;
|
GVariant *uid = NULL;
|
||||||
|
const gchar *username;
|
||||||
guint finger;
|
guint finger;
|
||||||
g_autofree gchar *user_id = NULL;
|
g_autofree gchar *user_id = NULL;
|
||||||
gssize user_id_len;
|
gssize user_id_len;
|
||||||
g_autofree guint8 *payload = NULL;
|
g_autofree guint8 *payload = NULL;
|
||||||
|
const GDate *date;
|
||||||
|
gint y, m, d;
|
||||||
|
gint32 rand_id = 0;
|
||||||
|
|
||||||
fpi_device_get_enroll_data (device, &print);
|
fpi_device_get_enroll_data (device, &print);
|
||||||
|
|
||||||
G_DEBUG_HERE ();
|
G_DEBUG_HERE ();
|
||||||
|
|
||||||
user_id = fpi_print_generate_user_id (print);
|
date = fp_print_get_enroll_date (print);
|
||||||
|
if (date && g_date_valid (date))
|
||||||
|
{
|
||||||
|
y = g_date_get_year (date);
|
||||||
|
m = g_date_get_month (date);
|
||||||
|
d = g_date_get_day (date);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
y = 0;
|
||||||
|
m = 0;
|
||||||
|
d = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
username = fp_print_get_username (print);
|
||||||
|
if (!username)
|
||||||
|
username = "nobody";
|
||||||
|
|
||||||
|
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
|
||||||
|
rand_id = 0;
|
||||||
|
else
|
||||||
|
rand_id = g_random_int ();
|
||||||
|
|
||||||
|
user_id = g_strdup_printf ("FP1-%04d%02d%02d-%X-%08X-%s",
|
||||||
|
y, m, d,
|
||||||
|
fp_print_get_finger (print),
|
||||||
|
rand_id,
|
||||||
|
username);
|
||||||
|
|
||||||
user_id_len = strlen (user_id);
|
user_id_len = strlen (user_id);
|
||||||
user_id_len = MIN (BMKT_MAX_USER_ID_LEN, user_id_len);
|
user_id_len = MIN (BMKT_MAX_USER_ID_LEN, user_id_len);
|
||||||
|
|
||||||
/* We currently always use finger 1 from the devices point of view */
|
/* We currently always use finger 1 from the devices piont of view */
|
||||||
finger = 1;
|
finger = 1;
|
||||||
|
|
||||||
uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
|
uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
|
||||||
@@ -964,7 +1029,7 @@ dev_probe (FpDevice *device)
|
|||||||
|
|
||||||
if (!read_ok)
|
if (!read_ok)
|
||||||
{
|
{
|
||||||
g_warning ("Transfer in response to version query was too short");
|
g_warning ("Transfer in response to verison query was too short");
|
||||||
error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO);
|
error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO);
|
||||||
goto err_close;
|
goto err_close;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,11 +47,17 @@ enum {
|
|||||||
enum sonly_kill_transfers_action {
|
enum sonly_kill_transfers_action {
|
||||||
NOT_KILLING = 0,
|
NOT_KILLING = 0,
|
||||||
|
|
||||||
|
/* abort a SSM with an error code */
|
||||||
|
ABORT_SSM,
|
||||||
|
|
||||||
/* report an image session error */
|
/* report an image session error */
|
||||||
IMG_SESSION_ERROR,
|
IMG_SESSION_ERROR,
|
||||||
|
|
||||||
/* iterate a SSM to the next state */
|
/* iterate a SSM to the next state */
|
||||||
ITERATE_SSM,
|
ITERATE_SSM,
|
||||||
|
|
||||||
|
/* call a callback */
|
||||||
|
EXEC_CALLBACK,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum sonly_fs {
|
enum sonly_fs {
|
||||||
@@ -91,7 +97,11 @@ struct _FpiDeviceUpeksonly
|
|||||||
|
|
||||||
enum sonly_kill_transfers_action killing_transfers;
|
enum sonly_kill_transfers_action killing_transfers;
|
||||||
GError *kill_error;
|
GError *kill_error;
|
||||||
|
union
|
||||||
|
{
|
||||||
FpiSsm *kill_ssm;
|
FpiSsm *kill_ssm;
|
||||||
|
void (*kill_cb)(FpImageDevice *dev);
|
||||||
|
};
|
||||||
|
|
||||||
struct fpi_line_asmbl_ctx assembling_ctx;
|
struct fpi_line_asmbl_ctx assembling_ctx;
|
||||||
};
|
};
|
||||||
@@ -166,6 +176,11 @@ last_transfer_killed (FpImageDevice *dev)
|
|||||||
|
|
||||||
switch (self->killing_transfers)
|
switch (self->killing_transfers)
|
||||||
{
|
{
|
||||||
|
case ABORT_SSM:
|
||||||
|
fp_dbg ("abort ssm error %s", self->kill_error->message);
|
||||||
|
fpi_ssm_mark_failed (self->kill_ssm, g_steal_pointer (&self->kill_error));
|
||||||
|
return;
|
||||||
|
|
||||||
case ITERATE_SSM:
|
case ITERATE_SSM:
|
||||||
fp_dbg ("iterate ssm");
|
fp_dbg ("iterate ssm");
|
||||||
fpi_ssm_next_state (self->kill_ssm);
|
fpi_ssm_next_state (self->kill_ssm);
|
||||||
@@ -516,14 +531,6 @@ img_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: The old code assume 4096 bytes are received each time
|
|
||||||
* but there is no reason we need to enforce that. However, we
|
|
||||||
* always need full lines. */
|
|
||||||
if (transfer->actual_length % 64 != 0)
|
|
||||||
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
|
||||||
"Data packets need to be multiple of 64 bytes, got %zi bytes",
|
|
||||||
transfer->actual_length);
|
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
fp_warn ("bad status %s, terminating session", error->message);
|
fp_warn ("bad status %s, terminating session", error->message);
|
||||||
@@ -544,7 +551,7 @@ img_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
* the first 2 bytes are a sequence number
|
* the first 2 bytes are a sequence number
|
||||||
* then there are 62 bytes for image data
|
* then there are 62 bytes for image data
|
||||||
*/
|
*/
|
||||||
for (i = 0; i + 64 <= transfer->actual_length; i += 64)
|
for (i = 0; i < 4096; i += 64)
|
||||||
{
|
{
|
||||||
if (!is_capturing (self))
|
if (!is_capturing (self))
|
||||||
return;
|
return;
|
||||||
@@ -553,7 +560,7 @@ img_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
|
|
||||||
if (is_capturing (self))
|
if (is_capturing (self))
|
||||||
{
|
{
|
||||||
fpi_usb_transfer_submit (fpi_usb_transfer_ref (transfer),
|
fpi_usb_transfer_submit (transfer,
|
||||||
0,
|
0,
|
||||||
self->img_cancellable,
|
self->img_cancellable,
|
||||||
img_data_cb,
|
img_data_cb,
|
||||||
@@ -581,8 +588,6 @@ write_regs_finished (struct write_regs_data *wrdata, GError *error)
|
|||||||
fpi_ssm_next_state (wrdata->ssm);
|
fpi_ssm_next_state (wrdata->ssm);
|
||||||
else
|
else
|
||||||
fpi_ssm_mark_failed (wrdata->ssm, error);
|
fpi_ssm_mark_failed (wrdata->ssm, error);
|
||||||
|
|
||||||
g_free (wrdata);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_regs_iterate (struct write_regs_data *wrdata);
|
static void write_regs_iterate (struct write_regs_data *wrdata);
|
||||||
@@ -629,9 +634,9 @@ write_regs_iterate (struct write_regs_data *wrdata)
|
|||||||
1);
|
1);
|
||||||
transfer->short_is_error = TRUE;
|
transfer->short_is_error = TRUE;
|
||||||
transfer->ssm = wrdata->ssm;
|
transfer->ssm = wrdata->ssm;
|
||||||
transfer->buffer[0] = regwrite->value;
|
fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, write_regs_cb, NULL);
|
||||||
|
|
||||||
fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, write_regs_cb, wrdata);
|
transfer->buffer[0] = regwrite->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -670,10 +675,10 @@ sm_write_reg (FpiSsm *ssm,
|
|||||||
1);
|
1);
|
||||||
transfer->short_is_error = TRUE;
|
transfer->short_is_error = TRUE;
|
||||||
transfer->ssm = ssm;
|
transfer->ssm = ssm;
|
||||||
transfer->buffer[0] = value;
|
|
||||||
|
|
||||||
fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL,
|
fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL,
|
||||||
fpi_ssm_usb_transfer_cb, NULL);
|
fpi_ssm_usb_transfer_cb, NULL);
|
||||||
|
|
||||||
|
transfer->buffer[0] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -903,7 +908,7 @@ capsm_fire_bulk (FpiSsm *ssm,
|
|||||||
self->img_cancellable = g_cancellable_new ();
|
self->img_cancellable = g_cancellable_new ();
|
||||||
for (i = 0; i < self->img_transfers->len; i++)
|
for (i = 0; i < self->img_transfers->len; i++)
|
||||||
{
|
{
|
||||||
fpi_usb_transfer_submit (fpi_usb_transfer_ref (g_ptr_array_index (self->img_transfers, i)),
|
fpi_usb_transfer_submit (g_ptr_array_index (self->img_transfers, i),
|
||||||
0,
|
0,
|
||||||
self->img_cancellable,
|
self->img_cancellable,
|
||||||
img_data_cb,
|
img_data_cb,
|
||||||
@@ -1401,12 +1406,8 @@ dev_activate (FpImageDevice *dev)
|
|||||||
self->capturing = FALSE;
|
self->capturing = FALSE;
|
||||||
|
|
||||||
self->num_flying = 0;
|
self->num_flying = 0;
|
||||||
self->img_transfers = g_ptr_array_new_with_free_func ((GFreeFunc) fpi_usb_transfer_unref);
|
|
||||||
|
|
||||||
/* This might seem odd, but we do need multiple in-flight URBs so that
|
for (i = 0; i < self->img_transfers->len; i++)
|
||||||
* we never stop polling the device for more data.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < NUM_BULK_TRANSFERS; i++)
|
|
||||||
{
|
{
|
||||||
FpiUsbTransfer *transfer;
|
FpiUsbTransfer *transfer;
|
||||||
|
|
||||||
|
|||||||
@@ -310,7 +310,6 @@ capture_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
fp_dbg ("Image size is %lu\n",
|
fp_dbg ("Image size is %lu\n",
|
||||||
self->image_size);
|
self->image_size);
|
||||||
img = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT);
|
img = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT);
|
||||||
img->flags |= FPI_IMAGE_PARTIAL;
|
|
||||||
memcpy (img->data, self->image_bits,
|
memcpy (img->data, self->image_bits,
|
||||||
IMAGE_SIZE);
|
IMAGE_SIZE);
|
||||||
fpi_image_device_image_captured (dev, img);
|
fpi_image_device_image_captured (dev, img);
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
#define TIMEOUT 5000
|
#define TIMEOUT 5000
|
||||||
|
|
||||||
#define MSG_READ_BUF_SIZE 0x40
|
#define MSG_READ_BUF_SIZE 0x40
|
||||||
|
#define MAX_DATA_IN_READ_BUF (MSG_READ_BUF_SIZE - 9)
|
||||||
|
|
||||||
struct _FpiDeviceUpekts
|
struct _FpiDeviceUpekts
|
||||||
{
|
{
|
||||||
@@ -235,18 +236,12 @@ __handle_incoming_msg (FpDevice *device,
|
|||||||
{
|
{
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
guint8 *buf = udata->buffer;
|
guint8 *buf = udata->buffer;
|
||||||
guint16 len;
|
guint16 len = ((buf[5] & 0xf) << 8) | buf[6];
|
||||||
guint16 computed_crc;
|
guint16 computed_crc = udf_crc (buf + 4, len + 3);
|
||||||
guint16 msg_crc;
|
guint16 msg_crc = (buf[len + 8] << 8) | buf[len + 7];
|
||||||
|
unsigned char *retdata = NULL;
|
||||||
unsigned char code_a, code_b;
|
unsigned char code_a, code_b;
|
||||||
|
|
||||||
g_assert (udata->buflen >= 6);
|
|
||||||
len = ((buf[5] & 0xf) << 8) | buf[6];
|
|
||||||
|
|
||||||
g_assert (udata->buflen >= len + 9);
|
|
||||||
computed_crc = udf_crc (buf + 4, len + 3);
|
|
||||||
msg_crc = (buf[len + 8] << 8) | buf[len + 7];
|
|
||||||
|
|
||||||
if (computed_crc != msg_crc)
|
if (computed_crc != msg_crc)
|
||||||
{
|
{
|
||||||
fp_err ("CRC failed, got %04x expected %04x", msg_crc, computed_crc);
|
fp_err ("CRC failed, got %04x expected %04x", msg_crc, computed_crc);
|
||||||
@@ -272,7 +267,12 @@ __handle_incoming_msg (FpDevice *device,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
udata->callback (device, READ_MSG_CMD, code_a, 0, buf + 7, len,
|
if (len > 0)
|
||||||
|
{
|
||||||
|
retdata = g_malloc (len);
|
||||||
|
memcpy (retdata, buf + 7, len);
|
||||||
|
}
|
||||||
|
udata->callback (device, READ_MSG_CMD, code_a, 0, retdata, len,
|
||||||
udata->user_data, NULL);
|
udata->user_data, NULL);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -309,8 +309,14 @@ __handle_incoming_msg (FpDevice *device,
|
|||||||
innerlen = innerlen - 3;
|
innerlen = innerlen - 3;
|
||||||
_subcmd = innerbuf[5];
|
_subcmd = innerbuf[5];
|
||||||
fp_dbg ("device responds to subcmd %x with %d bytes", _subcmd, innerlen);
|
fp_dbg ("device responds to subcmd %x with %d bytes", _subcmd, innerlen);
|
||||||
|
if (innerlen > 0)
|
||||||
|
{
|
||||||
|
retdata = g_malloc (innerlen);
|
||||||
|
memcpy (retdata, innerbuf + 6, innerlen);
|
||||||
|
}
|
||||||
udata->callback (device, READ_MSG_RESPONSE, code_b, _subcmd,
|
udata->callback (device, READ_MSG_RESPONSE, code_b, _subcmd,
|
||||||
innerbuf + 6, innerlen, udata->user_data, NULL);
|
retdata, innerlen, udata->user_data, NULL);
|
||||||
|
g_free (retdata);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -352,8 +358,7 @@ read_msg_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
gpointer user_data, GError *error)
|
gpointer user_data, GError *error)
|
||||||
{
|
{
|
||||||
struct read_msg_data *udata = user_data;
|
struct read_msg_data *udata = user_data;
|
||||||
guint16 payload_len;
|
guint16 len;
|
||||||
gsize packet_len;
|
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
@@ -378,15 +383,14 @@ read_msg_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
payload_len = ((udata->buffer[5] & 0xf) << 8) | udata->buffer[6];
|
len = ((udata->buffer[5] & 0xf) << 8) | udata->buffer[6];
|
||||||
packet_len = payload_len + 9;
|
|
||||||
if (transfer->actual_length != MSG_READ_BUF_SIZE &&
|
if (transfer->actual_length != MSG_READ_BUF_SIZE &&
|
||||||
packet_len > transfer->actual_length)
|
(len + 9) > transfer->actual_length)
|
||||||
{
|
{
|
||||||
/* Check that the length claimed inside the message is in line with
|
/* Check that the length claimed inside the message is in line with
|
||||||
* the amount of data that was transferred over USB. */
|
* the amount of data that was transferred over USB. */
|
||||||
fp_err ("msg didn't include enough data, expected=%d recv=%d",
|
fp_err ("msg didn't include enough data, expected=%d recv=%d",
|
||||||
(gint) packet_len, (gint) transfer->actual_length);
|
len + 9, (gint) transfer->actual_length);
|
||||||
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
"Packet from device didn't include data");
|
"Packet from device didn't include data");
|
||||||
goto err;
|
goto err;
|
||||||
@@ -395,14 +399,14 @@ read_msg_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
/* We use a 64 byte buffer for reading messages. However, sometimes
|
/* We use a 64 byte buffer for reading messages. However, sometimes
|
||||||
* messages are longer, in which case we have to do another USB bulk read
|
* messages are longer, in which case we have to do another USB bulk read
|
||||||
* to read the remainder. This is handled below. */
|
* to read the remainder. This is handled below. */
|
||||||
if (packet_len > MSG_READ_BUF_SIZE)
|
if (len > MAX_DATA_IN_READ_BUF)
|
||||||
{
|
{
|
||||||
int needed = packet_len - MSG_READ_BUF_SIZE;
|
int needed = len - MAX_DATA_IN_READ_BUF;
|
||||||
FpiUsbTransfer *etransfer = fpi_usb_transfer_new (device);
|
FpiUsbTransfer *etransfer = fpi_usb_transfer_new (device);
|
||||||
|
|
||||||
fp_dbg ("didn't fit in buffer, need to extend by %d bytes", needed);
|
fp_dbg ("didn't fit in buffer, need to extend by %d bytes", needed);
|
||||||
udata->buffer = g_realloc ((gpointer) udata->buffer, packet_len);
|
udata->buffer = g_realloc ((gpointer) udata->buffer, len);
|
||||||
udata->buflen = packet_len;
|
udata->buflen = len;
|
||||||
|
|
||||||
fpi_usb_transfer_fill_bulk_full (etransfer, EP_IN,
|
fpi_usb_transfer_fill_bulk_full (etransfer, EP_IN,
|
||||||
udata->buffer + MSG_READ_BUF_SIZE,
|
udata->buffer + MSG_READ_BUF_SIZE,
|
||||||
@@ -696,7 +700,7 @@ initsm_run_state (FpiSsm *ssm, FpDevice *dev)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SEND_RESP03:;
|
case SEND_RESP03:;
|
||||||
transfer = alloc_send_cmdresponse_transfer (dev, ++upekdev->seq, init_resp03, sizeof (init_resp03));
|
transfer = alloc_send_cmd28_transfer (dev, ++upekdev->seq, init_resp03, sizeof (init_resp03));
|
||||||
transfer->ssm = ssm;
|
transfer->ssm = ssm;
|
||||||
transfer->short_is_error = TRUE;
|
transfer->short_is_error = TRUE;
|
||||||
fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL);
|
fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL);
|
||||||
@@ -853,15 +857,22 @@ dev_init (FpDevice *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dev_exit (FpDevice *dev)
|
deinitsm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
|
||||||
{
|
{
|
||||||
GError *error = NULL;
|
g_usb_device_release_interface (fpi_device_get_usb_device (dev), 0, 0, NULL);
|
||||||
|
|
||||||
g_usb_device_release_interface (fpi_device_get_usb_device (dev), 0, 0, &error);
|
|
||||||
|
|
||||||
fpi_device_close_complete (dev, error);
|
fpi_device_close_complete (dev, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_exit (FpDevice *dev)
|
||||||
|
{
|
||||||
|
FpiSsm *ssm;
|
||||||
|
|
||||||
|
ssm = fpi_ssm_new (dev, deinitsm_state_handler, DEINITSM_NUM_STATES);
|
||||||
|
fpi_ssm_start (ssm, deinitsm_done);
|
||||||
|
}
|
||||||
|
|
||||||
static const unsigned char enroll_init[] = {
|
static const unsigned char enroll_init[] = {
|
||||||
0x02, 0xc0, 0xd4, 0x01, 0x00, 0x04, 0x00, 0x08
|
0x02, 0xc0, 0xd4, 0x01, 0x00, 0x04, 0x00, 0x08
|
||||||
};
|
};
|
||||||
@@ -972,9 +983,7 @@ enroll_stop_deinit_cb (FpiSsm *ssm, FpDevice *dev, GError *error)
|
|||||||
if (error)
|
if (error)
|
||||||
fp_warn ("Error deinitializing: %s", error->message);
|
fp_warn ("Error deinitializing: %s", error->message);
|
||||||
|
|
||||||
fpi_device_enroll_complete (dev,
|
fpi_device_enroll_complete (dev, data->print, data->error);
|
||||||
g_steal_pointer (&data->print),
|
|
||||||
g_steal_pointer (&data->error));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -983,7 +992,7 @@ do_enroll_stop (FpDevice *dev, FpPrint *print, GError *error)
|
|||||||
EnrollStopData *data = g_new0 (EnrollStopData, 1);
|
EnrollStopData *data = g_new0 (EnrollStopData, 1);
|
||||||
FpiSsm *ssm = deinitsm_new (dev, data);
|
FpiSsm *ssm = deinitsm_new (dev, data);
|
||||||
|
|
||||||
data->print = print;
|
data->print = g_object_ref (print);
|
||||||
data->error = error;
|
data->error = error;
|
||||||
|
|
||||||
fpi_ssm_start (ssm, enroll_stop_deinit_cb);
|
fpi_ssm_start (ssm, enroll_stop_deinit_cb);
|
||||||
@@ -1110,6 +1119,7 @@ e_handle_resp02 (FpDevice *dev, unsigned char *data,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
GVariant *fp_data;
|
GVariant *fp_data;
|
||||||
|
print = fp_print_new (dev);
|
||||||
|
|
||||||
fpi_device_get_enroll_data (dev, &print);
|
fpi_device_get_enroll_data (dev, &print);
|
||||||
|
|
||||||
@@ -1118,7 +1128,6 @@ e_handle_resp02 (FpDevice *dev, unsigned char *data,
|
|||||||
data_len - sizeof (scan_comp),
|
data_len - sizeof (scan_comp),
|
||||||
1);
|
1);
|
||||||
|
|
||||||
fpi_print_set_type (print, FPI_PRINT_RAW);
|
|
||||||
g_object_set (print, "fpi-data", fp_data, NULL);
|
g_object_set (print, "fpi-data", fp_data, NULL);
|
||||||
g_object_ref (print);
|
g_object_ref (print);
|
||||||
}
|
}
|
||||||
@@ -1237,11 +1246,11 @@ verify_stop_deinit_cb (FpiSsm *ssm, FpDevice *dev, GError *error)
|
|||||||
fp_warn ("Error deinitializing: %s", error->message);
|
fp_warn ("Error deinitializing: %s", error->message);
|
||||||
|
|
||||||
if (data->error)
|
if (data->error)
|
||||||
fpi_device_verify_complete (dev, g_steal_pointer (&data->error));
|
fpi_device_verify_complete (dev, data->error);
|
||||||
else
|
else
|
||||||
fpi_device_verify_complete (dev, g_steal_pointer (&error));
|
fpi_device_verify_complete (dev, g_steal_pointer (&error));
|
||||||
|
|
||||||
g_clear_error (&error);
|
g_error_free (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1251,7 +1260,7 @@ do_verify_stop (FpDevice *dev, FpiMatchResult res, GError *error)
|
|||||||
FpiSsm *ssm = deinitsm_new (dev, data);
|
FpiSsm *ssm = deinitsm_new (dev, data);
|
||||||
|
|
||||||
/* Report the error immediately if possible, otherwise delay it. */
|
/* Report the error immediately if possible, otherwise delay it. */
|
||||||
if (error && error->domain == FP_DEVICE_RETRY)
|
if (!error && error->domain != FP_DEVICE_RETRY)
|
||||||
fpi_device_verify_report (dev, res, NULL, error);
|
fpi_device_verify_report (dev, res, NULL, error);
|
||||||
else
|
else
|
||||||
data->error = error;
|
data->error = error;
|
||||||
@@ -1293,7 +1302,7 @@ verify_start_sm_run_state (FpiSsm *ssm, FpDevice *dev)
|
|||||||
|
|
||||||
case VERIFY_INIT:
|
case VERIFY_INIT:
|
||||||
fpi_device_get_verify_data (dev, &print);
|
fpi_device_get_verify_data (dev, &print);
|
||||||
g_object_get (print, "fpi-data", &fp_data, NULL);
|
g_object_get (dev, "fpi-data", &fp_data, NULL);
|
||||||
|
|
||||||
data = g_variant_get_fixed_array (fp_data, &data_len, 1);
|
data = g_variant_get_fixed_array (fp_data, &data_len, 1);
|
||||||
|
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ static const struct uru4k_dev_profile
|
|||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
gboolean auth_cr;
|
gboolean auth_cr;
|
||||||
gboolean image_not_flipped;
|
gboolean encryption;
|
||||||
} uru4k_dev_info[] = {
|
} uru4k_dev_info[] = {
|
||||||
[MS_KBD] = {
|
[MS_KBD] = {
|
||||||
.name = "Microsoft Keyboard with Fingerprint Reader",
|
.name = "Microsoft Keyboard with Fingerprint Reader",
|
||||||
@@ -106,7 +106,7 @@ static const struct uru4k_dev_profile
|
|||||||
[DP_URU4000B] = {
|
[DP_URU4000B] = {
|
||||||
.name = "Digital Persona U.are.U 4000B",
|
.name = "Digital Persona U.are.U 4000B",
|
||||||
.auth_cr = FALSE,
|
.auth_cr = FALSE,
|
||||||
.image_not_flipped = TRUE, /* See comment in the code where it is used. */
|
.encryption = TRUE,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -680,8 +680,8 @@ imaging_run_state (FpiSsm *ssm, FpDevice *_dev)
|
|||||||
fpi_ssm_jump_to_state (ssm, IMAGING_CAPTURE);
|
fpi_ssm_jump_to_state (ssm, IMAGING_CAPTURE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!self->profile->encryption)
|
||||||
/* Detect whether image is encrypted (by checking how noisy it is) */
|
{
|
||||||
dev2 = calc_dev2 (img);
|
dev2 = calc_dev2 (img);
|
||||||
fp_dbg ("dev2: %d", dev2);
|
fp_dbg ("dev2: %d", dev2);
|
||||||
if (dev2 < ENC_THRESHOLD)
|
if (dev2 < ENC_THRESHOLD)
|
||||||
@@ -690,7 +690,7 @@ imaging_run_state (FpiSsm *ssm, FpDevice *_dev)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fp_info ("image seems to be encrypted");
|
fp_info ("image seems to be encrypted");
|
||||||
|
}
|
||||||
buf[0] = img->key_number;
|
buf[0] = img->key_number;
|
||||||
buf[1] = self->img_enc_seed;
|
buf[1] = self->img_enc_seed;
|
||||||
buf[2] = self->img_enc_seed >> 8;
|
buf[2] = self->img_enc_seed >> 8;
|
||||||
@@ -769,13 +769,7 @@ imaging_run_state (FpiSsm *ssm, FpDevice *_dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fpimg->flags = FPI_IMAGE_COLORS_INVERTED;
|
fpimg->flags = FPI_IMAGE_COLORS_INVERTED;
|
||||||
/* NOTE: For some reason all but U4000B (or rather U4500?) flipped the
|
if (!self->profile->encryption)
|
||||||
* image, we retain this behaviour here, but it is not clear whether it
|
|
||||||
* is correct.
|
|
||||||
* It may be that there are different models with the same USB ID that
|
|
||||||
* behave differently.
|
|
||||||
*/
|
|
||||||
if (self->profile->image_not_flipped)
|
|
||||||
fpimg->flags |= FPI_IMAGE_V_FLIPPED | FPI_IMAGE_H_FLIPPED;
|
fpimg->flags |= FPI_IMAGE_V_FLIPPED | FPI_IMAGE_H_FLIPPED;
|
||||||
fpi_image_device_image_captured (dev, fpimg);
|
fpi_image_device_image_captured (dev, fpimg);
|
||||||
|
|
||||||
|
|||||||
@@ -117,10 +117,9 @@ async_abort_callback (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
int ep = transfer->endpoint;
|
int ep = transfer->endpoint;
|
||||||
|
|
||||||
/* In normal case endpoint is empty */
|
/* In normal case endpoint is empty */
|
||||||
if (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT) ||
|
if (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT))
|
||||||
(g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0 && transfer->actual_length == 0))
|
|
||||||
{
|
{
|
||||||
g_clear_error (&error);
|
g_error_free (error);
|
||||||
fpi_ssm_next_state (transfer->ssm);
|
fpi_ssm_next_state (transfer->ssm);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -157,8 +156,6 @@ async_abort (FpDevice *dev, FpiSsm *ssm, int ep)
|
|||||||
else
|
else
|
||||||
fpi_usb_transfer_fill_bulk (transfer, ep, VFS_USB_BUFFER_SIZE);
|
fpi_usb_transfer_fill_bulk (transfer, ep, VFS_USB_BUFFER_SIZE);
|
||||||
|
|
||||||
transfer->ssm = ssm;
|
|
||||||
|
|
||||||
fpi_usb_transfer_submit (transfer, VFS_USB_ABORT_TIMEOUT, NULL,
|
fpi_usb_transfer_submit (transfer, VFS_USB_ABORT_TIMEOUT, NULL,
|
||||||
async_abort_callback, NULL);
|
async_abort_callback, NULL);
|
||||||
}
|
}
|
||||||
@@ -243,7 +240,6 @@ prepare_image (FpDeviceVfs0050 *vdev)
|
|||||||
|
|
||||||
/* Building GSList */
|
/* Building GSList */
|
||||||
GSList *lines = NULL;
|
GSList *lines = NULL;
|
||||||
|
|
||||||
for (int i = height - 1; i >= 0; --i)
|
for (int i = height - 1; i >= 0; --i)
|
||||||
lines = g_slist_prepend (lines, vdev->lines_buffer + i);
|
lines = g_slist_prepend (lines, vdev->lines_buffer + i);
|
||||||
|
|
||||||
@@ -468,8 +464,8 @@ receive_callback (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
if (error)
|
if (error)
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
|
|
||||||
/* Capture is done when there is no more data to transfer or device timed out */
|
/* Check if fingerprint data is over */
|
||||||
if (transfer->actual_length <= 0)
|
if (transfer->actual_length == 0)
|
||||||
{
|
{
|
||||||
fpi_ssm_next_state (transfer->ssm);
|
fpi_ssm_next_state (transfer->ssm);
|
||||||
}
|
}
|
||||||
@@ -477,7 +473,7 @@ receive_callback (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
{
|
{
|
||||||
self->bytes += transfer->actual_length;
|
self->bytes += transfer->actual_length;
|
||||||
|
|
||||||
/* Try reading more data */
|
/* We need more data */
|
||||||
fpi_ssm_jump_to_state (transfer->ssm,
|
fpi_ssm_jump_to_state (transfer->ssm,
|
||||||
fpi_ssm_get_cur_state (transfer->ssm));
|
fpi_ssm_get_cur_state (transfer->ssm));
|
||||||
}
|
}
|
||||||
@@ -599,7 +595,8 @@ activate_ssm (FpiSsm *ssm, FpDevice *dev)
|
|||||||
/* Receive chunk of data */
|
/* Receive chunk of data */
|
||||||
transfer = fpi_usb_transfer_new (dev);
|
transfer = fpi_usb_transfer_new (dev);
|
||||||
fpi_usb_transfer_fill_bulk_full (transfer, 0x82,
|
fpi_usb_transfer_fill_bulk_full (transfer, 0x82,
|
||||||
(guint8 *) self->lines_buffer + self->bytes,
|
(guint8 *)
|
||||||
|
(self->lines_buffer + self->bytes),
|
||||||
VFS_USB_BUFFER_SIZE, NULL);
|
VFS_USB_BUFFER_SIZE, NULL);
|
||||||
transfer->ssm = ssm;
|
transfer->ssm = ssm;
|
||||||
fpi_usb_transfer_submit (transfer, VFS_USB_TIMEOUT, NULL,
|
fpi_usb_transfer_submit (transfer, VFS_USB_TIMEOUT, NULL,
|
||||||
@@ -671,7 +668,6 @@ dev_activate (FpImageDevice *idev)
|
|||||||
self->ssm_active = 1;
|
self->ssm_active = 1;
|
||||||
|
|
||||||
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), activate_ssm, SSM_STATES);
|
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), activate_ssm, SSM_STATES);
|
||||||
|
|
||||||
fpi_ssm_start (ssm, dev_activate_callback);
|
fpi_ssm_start (ssm, dev_activate_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -715,7 +711,6 @@ dev_open (FpImageDevice *idev)
|
|||||||
|
|
||||||
/* Clearing previous device state */
|
/* Clearing previous device state */
|
||||||
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), activate_ssm, SSM_STATES);
|
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), activate_ssm, SSM_STATES);
|
||||||
|
|
||||||
fpi_ssm_start (ssm, dev_open_callback);
|
fpi_ssm_start (ssm, dev_open_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -177,7 +177,6 @@ translate_str (const char **srcL, gssize *len)
|
|||||||
src_len += tmp;
|
src_len += tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert (src_len >= 2);
|
|
||||||
*len = src_len / 2;
|
*len = src_len / 2;
|
||||||
res = g_malloc0 (*len);
|
res = g_malloc0 (*len);
|
||||||
dst = res;
|
dst = res;
|
||||||
@@ -438,7 +437,7 @@ img_process_data (int first_block, FpDeviceVfs301 *dev, const guint8 *buf, int l
|
|||||||
usb_send (dev, data, len, NULL); \
|
usb_send (dev, data, len, NULL); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define RAW_DATA(x) g_memdup (x, sizeof (x)), sizeof (x)
|
#define RAW_DATA(x) x, sizeof (x)
|
||||||
|
|
||||||
#define IS_VFS301_FP_SEQ_START(b) ((b[0] == 0x01) && (b[1] == 0xfe))
|
#define IS_VFS301_FP_SEQ_START(b) ((b[0] == 0x01) && (b[1] == 0xfe))
|
||||||
|
|
||||||
|
|||||||
@@ -381,8 +381,9 @@ submit_image (FpiSsm *ssm,
|
|||||||
{
|
{
|
||||||
FpImage *img;
|
FpImage *img;
|
||||||
|
|
||||||
if (self->lines_recorded < VFS5011_IMAGE_WIDTH)
|
if (self->lines_recorded == 0)
|
||||||
{
|
{
|
||||||
|
/* == FP_ENROLL_RETRY_TOO_SHORT */
|
||||||
fpi_image_device_retry_scan (dev, FP_DEVICE_RETRY_TOO_SHORT);
|
fpi_image_device_retry_scan (dev, FP_DEVICE_RETRY_TOO_SHORT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
/*
|
/*
|
||||||
* This is a virtual driver to debug the image based drivers. A small
|
* This is a virtual driver to debug the image based drivers. A small
|
||||||
* python script is provided to connect to it via a socket, allowing
|
* python script is provided to connect to it via a socket, allowing
|
||||||
* prints to be sent to this device programmatically.
|
* prints to be sent to this device programatically.
|
||||||
* Using this it is possible to test libfprint and fprintd.
|
* Using this it is possible to test libfprint and fprintd.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -252,7 +252,6 @@ dev_init (FpImageDevice *dev)
|
|||||||
g_autoptr(GSocketListener) listener = NULL;
|
g_autoptr(GSocketListener) listener = NULL;
|
||||||
FpDeviceVirtualImage *self = FPI_DEVICE_VIRTUAL_IMAGE (dev);
|
FpDeviceVirtualImage *self = FPI_DEVICE_VIRTUAL_IMAGE (dev);
|
||||||
const char *env;
|
const char *env;
|
||||||
|
|
||||||
g_autoptr(GSocketAddress) addr = NULL;
|
g_autoptr(GSocketAddress) addr = NULL;
|
||||||
G_DEBUG_HERE ();
|
G_DEBUG_HERE ();
|
||||||
|
|
||||||
|
|||||||
@@ -94,21 +94,22 @@ async_device_init_done_cb (GObject *source_object, GAsyncResult *res, gpointer u
|
|||||||
FpContext *context;
|
FpContext *context;
|
||||||
FpContextPrivate *priv;
|
FpContextPrivate *priv;
|
||||||
|
|
||||||
device = FP_DEVICE (g_async_initable_new_finish (G_ASYNC_INITABLE (source_object),
|
device = (FpDevice *) g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, &error);
|
||||||
res, &error));
|
if (!device)
|
||||||
|
{
|
||||||
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
context = FP_CONTEXT (user_data);
|
context = FP_CONTEXT (user_data);
|
||||||
priv = fp_context_get_instance_private (context);
|
priv = fp_context_get_instance_private (context);
|
||||||
priv->pending_devices--;
|
priv->pending_devices--;
|
||||||
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
g_message ("Ignoring device due to initialization error: %s", error->message);
|
g_message ("Ignoring device due to initialization error: %s", error->message);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context = FP_CONTEXT (user_data);
|
||||||
|
priv = fp_context_get_instance_private (context);
|
||||||
|
priv->pending_devices--;
|
||||||
g_ptr_array_add (priv->devices, device);
|
g_ptr_array_add (priv->devices, device);
|
||||||
g_signal_emit (context, signals[DEVICE_ADDED_SIGNAL], 0, device);
|
g_signal_emit (context, signals[DEVICE_ADDED_SIGNAL], 0, device);
|
||||||
}
|
}
|
||||||
@@ -158,7 +159,7 @@ usb_device_added_cb (FpContext *self, GUsbDevice *device, GUsbContext *usb_ctx)
|
|||||||
|
|
||||||
if (found_driver == G_TYPE_NONE)
|
if (found_driver == G_TYPE_NONE)
|
||||||
{
|
{
|
||||||
g_debug ("No driver found for USB device %04X:%04X", vid, pid);
|
g_debug ("No driver found for USB device %04X:%04X", pid, vid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,11 +24,16 @@
|
|||||||
#include "fp-device-private.h"
|
#include "fp-device-private.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION: fp-device
|
* SECTION: fpi-device
|
||||||
* @title: FpDevice
|
* @title: Internal FpDevice
|
||||||
* @short_description: Fingerpint device routines
|
* @short_description: Internal device routines
|
||||||
*
|
*
|
||||||
* These are the public #FpDevice routines.
|
* The methods that are availabe for drivers to manipulate a device. See
|
||||||
|
* #FpDeviceClass for more information. Also note that most of these are
|
||||||
|
* not relevant for image based devices, see #FpImageDeviceClass in that
|
||||||
|
* case.
|
||||||
|
*
|
||||||
|
* Also see the public #FpDevice routines.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void fp_device_async_initable_iface_init (GAsyncInitableIface *iface);
|
static void fp_device_async_initable_iface_init (GAsyncInitableIface *iface);
|
||||||
@@ -334,7 +339,7 @@ fp_device_class_init (FpDeviceClass *klass)
|
|||||||
properties[PROP_OPEN] =
|
properties[PROP_OPEN] =
|
||||||
g_param_spec_boolean ("open",
|
g_param_spec_boolean ("open",
|
||||||
"Opened",
|
"Opened",
|
||||||
"Whether the device is open or not", FALSE,
|
"Wether the device is open or not", FALSE,
|
||||||
G_PARAM_STATIC_STRINGS | G_PARAM_READABLE);
|
G_PARAM_STATIC_STRINGS | G_PARAM_READABLE);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ typedef enum {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* FpDeviceError:
|
* FpDeviceError:
|
||||||
* @FP_DEVICE_ERROR_GENERAL: A general error occurred.
|
* @FP_DEVICE_ERROR_GENERAL: A general error occured.
|
||||||
* @FP_DEVICE_ERROR_NOT_SUPPORTED: The device does not support the requested
|
* @FP_DEVICE_ERROR_NOT_SUPPORTED: The device does not support the requested
|
||||||
* operation.
|
* operation.
|
||||||
* @FP_DEVICE_ERROR_NOT_OPEN: The device needs to be opened to start this
|
* @FP_DEVICE_ERROR_NOT_OPEN: The device needs to be opened to start this
|
||||||
@@ -113,7 +113,7 @@ GQuark fp_device_error_quark (void);
|
|||||||
* FpEnrollProgress:
|
* FpEnrollProgress:
|
||||||
* @device: a #FpDevice
|
* @device: a #FpDevice
|
||||||
* @completed_stages: Number of completed stages
|
* @completed_stages: Number of completed stages
|
||||||
* @print: (nullable) (transfer none): The last scanned print
|
* @print: (nullable) (transfer none): The last scaned print
|
||||||
* @user_data: (nullable) (transfer none): User provided data
|
* @user_data: (nullable) (transfer none): User provided data
|
||||||
* @error: (nullable) (transfer none): #GError or %NULL
|
* @error: (nullable) (transfer none): #GError or %NULL
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -62,34 +62,17 @@ static gboolean
|
|||||||
pending_activation_timeout (gpointer user_data)
|
pending_activation_timeout (gpointer user_data)
|
||||||
{
|
{
|
||||||
FpImageDevice *self = FP_IMAGE_DEVICE (user_data);
|
FpImageDevice *self = FP_IMAGE_DEVICE (user_data);
|
||||||
FpDevice *device = FP_DEVICE (self);
|
|
||||||
FpImageDevicePrivate *priv = fp_image_device_get_instance_private (self);
|
FpImageDevicePrivate *priv = fp_image_device_get_instance_private (self);
|
||||||
FpiDeviceAction action = fpi_device_get_current_action (device);
|
|
||||||
GError *error;
|
|
||||||
|
|
||||||
priv->pending_activation_timeout_id = 0;
|
priv->pending_activation_timeout_id = 0;
|
||||||
|
|
||||||
if (priv->pending_activation_timeout_waiting_finger_off)
|
if (priv->pending_activation_timeout_waiting_finger_off)
|
||||||
error = fpi_device_retry_new_msg (FP_DEVICE_RETRY_REMOVE_FINGER,
|
fpi_device_action_error (FP_DEVICE (self),
|
||||||
"Remove finger before requesting another scan operation");
|
fpi_device_retry_new_msg (FP_DEVICE_RETRY_REMOVE_FINGER,
|
||||||
|
"Remove finger before requesting another scan operation"));
|
||||||
else
|
else
|
||||||
error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL);
|
fpi_device_action_error (FP_DEVICE (self),
|
||||||
|
fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL));
|
||||||
if (action == FPI_DEVICE_ACTION_VERIFY)
|
|
||||||
{
|
|
||||||
fpi_device_verify_report (device, FPI_MATCH_ERROR, NULL, error);
|
|
||||||
fpi_device_verify_complete (device, NULL);
|
|
||||||
}
|
|
||||||
else if (action == FPI_DEVICE_ACTION_IDENTIFY)
|
|
||||||
{
|
|
||||||
fpi_device_identify_report (device, NULL, NULL, error);
|
|
||||||
fpi_device_identify_complete (device, NULL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Can this happen for enroll? */
|
|
||||||
fpi_device_action_error (device, error);
|
|
||||||
}
|
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
@@ -117,7 +100,7 @@ fp_image_device_close (FpDevice *device)
|
|||||||
* 1. We are inactive
|
* 1. We are inactive
|
||||||
* -> immediately close
|
* -> immediately close
|
||||||
* 2. We are waiting for finger off
|
* 2. We are waiting for finger off
|
||||||
* -> immediately deactivate
|
* -> imediately deactivate
|
||||||
* 3. We are deactivating
|
* 3. We are deactivating
|
||||||
* -> handled by deactivate_complete */
|
* -> handled by deactivate_complete */
|
||||||
|
|
||||||
|
|||||||
@@ -184,8 +184,10 @@ fp_image_detect_minutiae_cb (GObject *source_object,
|
|||||||
GTask *task = G_TASK (res);
|
GTask *task = G_TASK (res);
|
||||||
FpImage *image;
|
FpImage *image;
|
||||||
DetectMinutiaeData *data = g_task_get_task_data (task);
|
DetectMinutiaeData *data = g_task_get_task_data (task);
|
||||||
|
GCancellable *cancellable;
|
||||||
|
|
||||||
if (!g_task_had_error (task))
|
cancellable = g_task_get_cancellable (task);
|
||||||
|
if (!cancellable || !g_cancellable_is_cancelled (cancellable))
|
||||||
{
|
{
|
||||||
gint i;
|
gint i;
|
||||||
image = FP_IMAGE (source_object);
|
image = FP_IMAGE (source_object);
|
||||||
@@ -281,7 +283,6 @@ fp_image_detect_minutiae_thread_func (GTask *task,
|
|||||||
gint map_w, map_h;
|
gint map_w, map_h;
|
||||||
gint bw, bh, bd;
|
gint bw, bh, bd;
|
||||||
gint r;
|
gint r;
|
||||||
g_autofree LFSPARMS *lfsparms;
|
|
||||||
|
|
||||||
/* Normalize the image first */
|
/* Normalize the image first */
|
||||||
if (data->flags & FPI_IMAGE_H_FLIPPED)
|
if (data->flags & FPI_IMAGE_H_FLIPPED)
|
||||||
@@ -295,15 +296,12 @@ fp_image_detect_minutiae_thread_func (GTask *task,
|
|||||||
|
|
||||||
data->flags &= ~(FPI_IMAGE_H_FLIPPED | FPI_IMAGE_V_FLIPPED | FPI_IMAGE_COLORS_INVERTED);
|
data->flags &= ~(FPI_IMAGE_H_FLIPPED | FPI_IMAGE_V_FLIPPED | FPI_IMAGE_COLORS_INVERTED);
|
||||||
|
|
||||||
lfsparms = g_memdup (&g_lfsparms_V2, sizeof (LFSPARMS));
|
|
||||||
lfsparms->remove_perimeter_pts = data->flags & FPI_IMAGE_PARTIAL ? TRUE : FALSE;
|
|
||||||
|
|
||||||
timer = g_timer_new ();
|
timer = g_timer_new ();
|
||||||
r = get_minutiae (&minutiae, &quality_map, &direction_map,
|
r = get_minutiae (&minutiae, &quality_map, &direction_map,
|
||||||
&low_contrast_map, &low_flow_map, &high_curve_map,
|
&low_contrast_map, &low_flow_map, &high_curve_map,
|
||||||
&map_w, &map_h, &bdata, &bw, &bh, &bd,
|
&map_w, &map_h, &bdata, &bw, &bh, &bd,
|
||||||
data->image, data->width, data->height, 8,
|
data->image, data->width, data->height, 8,
|
||||||
data->ppmm, lfsparms);
|
data->ppmm, &g_lfsparms_V2);
|
||||||
g_timer_stop (timer);
|
g_timer_stop (timer);
|
||||||
fp_dbg ("Minutiae scan completed in %f secs", g_timer_elapsed (timer, NULL));
|
fp_dbg ("Minutiae scan completed in %f secs", g_timer_elapsed (timer, NULL));
|
||||||
|
|
||||||
@@ -318,14 +316,6 @@ fp_image_detect_minutiae_thread_func (GTask *task,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!data->minutiae || data->minutiae->num == 0)
|
|
||||||
{
|
|
||||||
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"No minutiae found");
|
|
||||||
g_object_unref (task);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_task_return_boolean (task, TRUE);
|
g_task_return_boolean (task, TRUE);
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ enum {
|
|||||||
PROP_IMAGE,
|
PROP_IMAGE,
|
||||||
|
|
||||||
/* The following is metadata that is stored by default for each print.
|
/* The following is metadata that is stored by default for each print.
|
||||||
* Drivers may make use of these during enrollment (e.g. to additionally store
|
* Drivers may make use of these during enrollment (e.g. to additionaly store
|
||||||
* the metadata on the device). */
|
* the metadata on the device). */
|
||||||
PROP_FINGER,
|
PROP_FINGER,
|
||||||
PROP_USERNAME,
|
PROP_USERNAME,
|
||||||
@@ -588,7 +588,7 @@ fp_print_equal (FpPrint *self, FpPrint *other)
|
|||||||
}
|
}
|
||||||
else if (self->type == FPI_PRINT_NBIS)
|
else if (self->type == FPI_PRINT_NBIS)
|
||||||
{
|
{
|
||||||
guint i;
|
gint i;
|
||||||
|
|
||||||
if (self->prints->len != other->prints->len)
|
if (self->prints->len != other->prints->len)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -661,7 +661,7 @@ fp_print_serialize (FpPrint *print,
|
|||||||
if (print->type == FPI_PRINT_NBIS)
|
if (print->type == FPI_PRINT_NBIS)
|
||||||
{
|
{
|
||||||
GVariantBuilder nested = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("(a(aiaiai))"));
|
GVariantBuilder nested = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("(a(aiaiai))"));
|
||||||
guint i;
|
gint i;
|
||||||
|
|
||||||
g_variant_builder_open (&nested, G_VARIANT_TYPE ("a(aiaiai)"));
|
g_variant_builder_open (&nested, G_VARIANT_TYPE ("a(aiaiai)"));
|
||||||
for (i = 0; i < print->prints->len; i++)
|
for (i = 0; i < print->prints->len; i++)
|
||||||
@@ -812,7 +812,7 @@ fp_print_deserialize (const guchar *data,
|
|||||||
if (type == FPI_PRINT_NBIS)
|
if (type == FPI_PRINT_NBIS)
|
||||||
{
|
{
|
||||||
g_autoptr(GVariant) prints = g_variant_get_child_value (print_data, 0);
|
g_autoptr(GVariant) prints = g_variant_get_child_value (print_data, 0);
|
||||||
guint i;
|
gint i;
|
||||||
|
|
||||||
result = g_object_new (FP_TYPE_PRINT,
|
result = g_object_new (FP_TYPE_PRINT,
|
||||||
"driver", driver,
|
"driver", driver,
|
||||||
@@ -822,7 +822,7 @@ fp_print_deserialize (const guchar *data,
|
|||||||
fpi_print_set_type (result, FPI_PRINT_NBIS);
|
fpi_print_set_type (result, FPI_PRINT_NBIS);
|
||||||
for (i = 0; i < g_variant_n_children (prints); i++)
|
for (i = 0; i < g_variant_n_children (prints); i++)
|
||||||
{
|
{
|
||||||
g_autofree struct xyt_struct *xyt = NULL;
|
g_autofree struct xyt_struct *xyt = g_new0 (struct xyt_struct, 1);
|
||||||
const gint32 *xcol, *ycol, *thetacol;
|
const gint32 *xcol, *ycol, *thetacol;
|
||||||
gsize xlen, ylen, thetalen;
|
gsize xlen, ylen, thetalen;
|
||||||
g_autoptr(GVariant) xyt_data = NULL;
|
g_autoptr(GVariant) xyt_data = NULL;
|
||||||
@@ -848,7 +848,6 @@ fp_print_deserialize (const guchar *data,
|
|||||||
if (xlen > G_N_ELEMENTS (xyt->xcol))
|
if (xlen > G_N_ELEMENTS (xyt->xcol))
|
||||||
goto invalid_format;
|
goto invalid_format;
|
||||||
|
|
||||||
xyt = g_new0 (struct xyt_struct, 1);
|
|
||||||
xyt->nrows = xlen;
|
xyt->nrows = xlen;
|
||||||
memcpy (xyt->xcol, xcol, sizeof (xcol[0]) * xlen);
|
memcpy (xyt->xcol, xcol, sizeof (xcol[0]) * xlen);
|
||||||
memcpy (xyt->ycol, ycol, sizeof (xcol[0]) * xlen);
|
memcpy (xyt->ycol, ycol, sizeof (xcol[0]) * xlen);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
* @title: Internal FpDevice
|
* @title: Internal FpDevice
|
||||||
* @short_description: Internal device routines
|
* @short_description: Internal device routines
|
||||||
*
|
*
|
||||||
* The methods that are available for drivers to manipulate a device. See
|
* The methods that are availabe for drivers to manipulate a device. See
|
||||||
* #FpDeviceClass for more information. Also note that most of these are
|
* #FpDeviceClass for more information. Also note that most of these are
|
||||||
* not relevant for image based devices, see #FpImageDeviceClass in that
|
* not relevant for image based devices, see #FpImageDeviceClass in that
|
||||||
* case.
|
* case.
|
||||||
@@ -100,7 +100,7 @@ fpi_device_error_new (FpDeviceError error)
|
|||||||
switch (error)
|
switch (error)
|
||||||
{
|
{
|
||||||
case FP_DEVICE_ERROR_GENERAL:
|
case FP_DEVICE_ERROR_GENERAL:
|
||||||
msg = "An unspecified error occurred!";
|
msg = "An unspecified error occured!";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_DEVICE_ERROR_NOT_SUPPORTED:
|
case FP_DEVICE_ERROR_NOT_SUPPORTED:
|
||||||
@@ -138,7 +138,7 @@ fpi_device_error_new (FpDeviceError error)
|
|||||||
default:
|
default:
|
||||||
g_warning ("Unsupported error, returning general error instead!");
|
g_warning ("Unsupported error, returning general error instead!");
|
||||||
error = FP_DEVICE_ERROR_GENERAL;
|
error = FP_DEVICE_ERROR_GENERAL;
|
||||||
msg = "An unspecified error occurred!";
|
msg = "An unspecified error occured!";
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_error_new_literal (FP_DEVICE_ERROR, error, msg);
|
return g_error_new_literal (FP_DEVICE_ERROR, error, msg);
|
||||||
@@ -912,20 +912,6 @@ fpi_device_enroll_complete (FpDevice *device, FpPrint *print, GError *error)
|
|||||||
{
|
{
|
||||||
if (FP_IS_PRINT (print))
|
if (FP_IS_PRINT (print))
|
||||||
{
|
{
|
||||||
FpiPrintType print_type;
|
|
||||||
|
|
||||||
g_object_get (print, "fpi-type", &print_type, NULL);
|
|
||||||
if (print_type == FPI_PRINT_UNDEFINED)
|
|
||||||
{
|
|
||||||
g_warning ("Driver did not set the type on the returned print!");
|
|
||||||
g_clear_object (&print);
|
|
||||||
|
|
||||||
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
|
||||||
"Driver provided incorrect print data!");
|
|
||||||
fpi_device_return_task_in_idle (device, FP_DEVICE_TASK_RETURN_ERROR, error);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fpi_device_return_task_in_idle (device, FP_DEVICE_TASK_RETURN_OBJECT, print);
|
fpi_device_return_task_in_idle (device, FP_DEVICE_TASK_RETURN_OBJECT, print);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -65,10 +65,10 @@ struct _FpIdEntry
|
|||||||
* @probe: Called immediately for all devices. Most drivers will not need to
|
* @probe: Called immediately for all devices. Most drivers will not need to
|
||||||
* implement this. Drivers should setup the device identifier from the probe
|
* implement this. Drivers should setup the device identifier from the probe
|
||||||
* callback which will be used to verify the compatibility of stored
|
* callback which will be used to verify the compatibility of stored
|
||||||
* #FpPrint's. It is permissible to temporarily open the USB device if this
|
* #FpPrint's. It is permissable to temporarily open the USB device if this
|
||||||
* is required for the operation. If an error is returned, then the device
|
* is required for the operation. If an error is returned, then the device
|
||||||
* will be destroyed again immediately and never reported to the API user.
|
* will be destroyed again immediately and never reported to the API user.
|
||||||
* @open: Open the device for further operations. Any of the normal actions are
|
* @open: Open the device for futher operations. Any of the normal actions are
|
||||||
* guaranteed to only happen when the device is open (this includes delete).
|
* guaranteed to only happen when the device is open (this includes delete).
|
||||||
* @close: Close the device again
|
* @close: Close the device again
|
||||||
* @enroll: Start an enroll operation
|
* @enroll: Start an enroll operation
|
||||||
|
|||||||
@@ -24,11 +24,12 @@
|
|||||||
#include "fp-image-device.h"
|
#include "fp-image-device.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION: fpi-image-device
|
* SECTION: fpi-image
|
||||||
* @title: Internal FpImageDevice
|
* @title: Internal FpImage
|
||||||
* @short_description: Internal image device functions
|
* @short_description: Internal image handling routines
|
||||||
*
|
*
|
||||||
* Internal image device functions. See #FpImageDevice for public routines.
|
* Internal image handling routines. Also see the public <ulink
|
||||||
|
* url="libfprint-FpImage.html">FpImage routines</ulink>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Manually redefine what G_DEFINE_* macro does */
|
/* Manually redefine what G_DEFINE_* macro does */
|
||||||
@@ -170,16 +171,7 @@ fpi_image_device_minutiae_detected (GObject *source_object, GAsyncResult *res, g
|
|||||||
print = fp_print_new (device);
|
print = fp_print_new (device);
|
||||||
fpi_print_set_type (print, FPI_PRINT_NBIS);
|
fpi_print_set_type (print, FPI_PRINT_NBIS);
|
||||||
if (!fpi_print_add_from_image (print, image, &error))
|
if (!fpi_print_add_from_image (print, image, &error))
|
||||||
{
|
|
||||||
g_clear_object (&print);
|
g_clear_object (&print);
|
||||||
|
|
||||||
if (error->domain != FP_DEVICE_RETRY)
|
|
||||||
{
|
|
||||||
fpi_device_action_error (device, error);
|
|
||||||
fpi_image_device_deactivate (self);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action == FPI_DEVICE_ACTION_ENROLL)
|
if (action == FPI_DEVICE_ACTION_ENROLL)
|
||||||
|
|||||||
@@ -34,7 +34,8 @@
|
|||||||
* @title: Internal FpImage
|
* @title: Internal FpImage
|
||||||
* @short_description: Internal image handling routines
|
* @short_description: Internal image handling routines
|
||||||
*
|
*
|
||||||
* Internal image handling routines. See #FpImage for public routines.
|
* Internal image handling routines. Also see the public <ulink
|
||||||
|
* url="libfprint-FpImage.html">FpImage routines</ulink>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ typedef enum {
|
|||||||
FPI_IMAGE_V_FLIPPED = 1 << 0,
|
FPI_IMAGE_V_FLIPPED = 1 << 0,
|
||||||
FPI_IMAGE_H_FLIPPED = 1 << 1,
|
FPI_IMAGE_H_FLIPPED = 1 << 1,
|
||||||
FPI_IMAGE_COLORS_INVERTED = 1 << 2,
|
FPI_IMAGE_COLORS_INVERTED = 1 << 2,
|
||||||
FPI_IMAGE_PARTIAL = 1 << 3,
|
|
||||||
} FpiImageFlags;
|
} FpiImageFlags;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include "fp-print-private.h"
|
#include "fp-print-private.h"
|
||||||
#include "fpi-device.h"
|
#include "fpi-device.h"
|
||||||
#include "fpi-compat.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION: fpi-print
|
* SECTION: fpi-print
|
||||||
@@ -248,115 +247,3 @@ fpi_print_bz3_match (FpPrint *template, FpPrint *print, gint bz3_threshold, GErr
|
|||||||
|
|
||||||
return FPI_MATCH_FAIL;
|
return FPI_MATCH_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fpi_print_generate_user_id:
|
|
||||||
* @print: #FpPrint to generate the ID for
|
|
||||||
*
|
|
||||||
* Generates a string identifier for the represented print. This identifier
|
|
||||||
* encodes some metadata about the print. It also includes a random string
|
|
||||||
* and may be assumed to be unique.
|
|
||||||
*
|
|
||||||
* This is useful if devices are able to store a string identifier, but more
|
|
||||||
* storing more metadata may be desirable. In effect, this means the driver
|
|
||||||
* can provide somewhat more meaningful data to fp_device_list_prints().
|
|
||||||
*
|
|
||||||
* The generated ID may be truncated after 23 characters. However, more space
|
|
||||||
* is required to include the username, and it is recommended to store at
|
|
||||||
* at least 31 bytes.
|
|
||||||
*
|
|
||||||
* The generated format may change in the future. It is versioned though and
|
|
||||||
* decoding should remain functional.
|
|
||||||
*
|
|
||||||
* Returns: A unique string of 23 + strlen(username) characters
|
|
||||||
*/
|
|
||||||
gchar *
|
|
||||||
fpi_print_generate_user_id (FpPrint *print)
|
|
||||||
{
|
|
||||||
const gchar *username = NULL;
|
|
||||||
gchar *user_id = NULL;
|
|
||||||
const GDate *date;
|
|
||||||
gint y = 0, m = 0, d = 0;
|
|
||||||
gint32 rand_id = 0;
|
|
||||||
|
|
||||||
g_assert (print);
|
|
||||||
date = fp_print_get_enroll_date (print);
|
|
||||||
if (date && g_date_valid (date))
|
|
||||||
{
|
|
||||||
y = g_date_get_year (date);
|
|
||||||
m = g_date_get_month (date);
|
|
||||||
d = g_date_get_day (date);
|
|
||||||
}
|
|
||||||
|
|
||||||
username = fp_print_get_username (print);
|
|
||||||
if (!username)
|
|
||||||
username = "nobody";
|
|
||||||
|
|
||||||
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
|
|
||||||
rand_id = 0;
|
|
||||||
else
|
|
||||||
rand_id = g_random_int ();
|
|
||||||
|
|
||||||
user_id = g_strdup_printf ("FP1-%04d%02d%02d-%X-%08X-%s",
|
|
||||||
y, m, d,
|
|
||||||
fp_print_get_finger (print),
|
|
||||||
rand_id,
|
|
||||||
username);
|
|
||||||
|
|
||||||
return user_id;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fpi_print_fill_from_user_id:
|
|
||||||
* @print: #FpPrint to fill metadata into
|
|
||||||
* @user_id: An ID that was likely encoded using fpi_print_generate_user_id()
|
|
||||||
*
|
|
||||||
* This is the reverse operation of fpi_print_generate_user_id(), allowing
|
|
||||||
* the driver to encode some print metadata in a string.
|
|
||||||
*
|
|
||||||
* Returns: Whether a valid ID was found
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
fpi_print_fill_from_user_id (FpPrint *print, const char *user_id)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (user_id, FALSE);
|
|
||||||
|
|
||||||
/* The format has 24 bytes at the start and some dashes in the right places */
|
|
||||||
if (g_str_has_prefix (user_id, "FP1-") && strlen (user_id) >= 24 &&
|
|
||||||
user_id[12] == '-' && user_id[14] == '-' && user_id[23] == '-')
|
|
||||||
{
|
|
||||||
g_autofree gchar *copy = g_strdup (user_id);
|
|
||||||
g_autoptr(GDate) date = NULL;
|
|
||||||
gint32 date_ymd;
|
|
||||||
gint32 finger;
|
|
||||||
gchar *username;
|
|
||||||
/* Try to parse information from the string. */
|
|
||||||
|
|
||||||
copy[12] = '\0';
|
|
||||||
date_ymd = g_ascii_strtod (copy + 4, NULL);
|
|
||||||
if (date_ymd > 0)
|
|
||||||
date = g_date_new_dmy (date_ymd % 100,
|
|
||||||
(date_ymd / 100) % 100,
|
|
||||||
date_ymd / 10000);
|
|
||||||
else
|
|
||||||
date = g_date_new ();
|
|
||||||
|
|
||||||
fp_print_set_enroll_date (print, date);
|
|
||||||
|
|
||||||
copy[14] = '\0';
|
|
||||||
finger = g_ascii_strtoll (copy + 13, NULL, 16);
|
|
||||||
fp_print_set_finger (print, finger);
|
|
||||||
|
|
||||||
/* We ignore the next chunk, it is just random data.
|
|
||||||
* Then comes the username; nobody is the default if the metadata
|
|
||||||
* is unknown */
|
|
||||||
username = copy + 24;
|
|
||||||
if (strlen (username) > 0 && g_strcmp0 (username, "nobody") != 0)
|
|
||||||
fp_print_set_username (print, username);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ typedef enum {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* FpiMatchResult:
|
* FpiMatchResult:
|
||||||
* @FPI_MATCH_ERROR: An error occurred during matching
|
* @FPI_MATCH_ERROR: An error occured during matching
|
||||||
* @FPI_MATCH_FAIL: The prints did not match
|
* @FPI_MATCH_FAIL: The prints did not match
|
||||||
* @FPI_MATCH_SUCCESS: The prints matched
|
* @FPI_MATCH_SUCCESS: The prints matched
|
||||||
*/
|
*/
|
||||||
@@ -47,9 +47,4 @@ FpiMatchResult fpi_print_bz3_match (FpPrint * template,
|
|||||||
gint bz3_threshold,
|
gint bz3_threshold,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
/* Helpers to encode metadata into user ID strings. */
|
|
||||||
gchar * fpi_print_generate_user_id (FpPrint *print);
|
|
||||||
gboolean fpi_print_fill_from_user_id (FpPrint *print,
|
|
||||||
const char *user_id);
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
@@ -366,7 +366,7 @@ transfer_finish_cb (GObject *source_object, GAsyncResult *res, gpointer user_dat
|
|||||||
*
|
*
|
||||||
* Note that #FpiUsbTransfer will be stolen when this function is called.
|
* Note that #FpiUsbTransfer will be stolen when this function is called.
|
||||||
* So that all associated data will be free'ed automatically, after the
|
* So that all associated data will be free'ed automatically, after the
|
||||||
* callback ran unless fpi_usb_transfer_ref() is explicitly called.
|
* callback ran unless fpi_usb_transfer_ref() is explictly called.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
fpi_usb_transfer_submit (FpiUsbTransfer *transfer,
|
fpi_usb_transfer_submit (FpiUsbTransfer *transfer,
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ typedef enum {
|
|||||||
* @length: The requested length of the transfer in bytes.
|
* @length: The requested length of the transfer in bytes.
|
||||||
* @actual_length: The actual length of the transfer
|
* @actual_length: The actual length of the transfer
|
||||||
* (see also fpi_usb_transfer_set_short_error())
|
* (see also fpi_usb_transfer_set_short_error())
|
||||||
* @buffer: The transferred data.
|
* @buffer: The transfered data.
|
||||||
*
|
*
|
||||||
* Helper for handling USB transfers.
|
* Helper for handling USB transfers.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* Copyright (C) 2009 Red Hat <mjg@redhat.com>
|
* Copyright (C) 2009 Red Hat <mjg@redhat.com>
|
||||||
* Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
|
* Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
|
||||||
* Copyright (C) 2008 Timo Hoenig <thoenig@suse.de>, <thoenig@nouse.net>
|
* Copyright (C) 2008 Timo Hoenig <thoenig@suse.de>, <thoenig@nouse.net>
|
||||||
* Copyright (C) 2019 Benjamin Berg <bberg@redhat.com>
|
* Coypright (C) 2019 Benjamin Berg <bberg@redhat.com>
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* Copyright (C) 2009 Red Hat <mjg@redhat.com>
|
* Copyright (C) 2009 Red Hat <mjg@redhat.com>
|
||||||
* Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
|
* Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
|
||||||
* Copyright (C) 2008 Timo Hoenig <thoenig@suse.de>, <thoenig@nouse.net>
|
* Copyright (C) 2008 Timo Hoenig <thoenig@suse.de>, <thoenig@nouse.net>
|
||||||
* Copyright (C) 2019 Benjamin Berg <bberg@redhat.com>
|
* Coypright (C) 2019 Benjamin Berg <bberg@redhat.com>
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
|||||||
@@ -1,57 +0,0 @@
|
|||||||
diff --git a/libfprint/nbis/mindtct/contour.c b/libfprint/nbis/mindtct/contour.c
|
|
||||||
index 3e9416c..31f32d0 100644
|
|
||||||
--- mindtct/contour.c
|
|
||||||
+++ mindtct/contour.c
|
|
||||||
@@ -440,6 +440,8 @@ int get_centered_contour(int **ocontour_x, int **ocontour_y,
|
|
||||||
int *contour_x, *contour_y, *contour_ex, *contour_ey, ncontour;
|
|
||||||
int i, j, ret;
|
|
||||||
|
|
||||||
+ g_assert (half_contour > 0);
|
|
||||||
+
|
|
||||||
/* Compute maximum length of complete contour */
|
|
||||||
/* (2 half contours + feature point). */
|
|
||||||
max_contour = (half_contour<<1) + 1;
|
|
||||||
diff --git a/libfprint/nbis/mindtct/minutia.c b/libfprint/nbis/mindtct/minutia.c
|
|
||||||
index 0b29aa0..77cf09d 100644
|
|
||||||
--- mindtct/minutia.c
|
|
||||||
+++ mindtct/minutia.c
|
|
||||||
@@ -1625,7 +1625,7 @@ int process_horizontal_scan_minutia_V2(MINUTIAE *minutiae,
|
|
||||||
dmapval, bdata, iw, ih, lfsparms);
|
|
||||||
|
|
||||||
/* If minuitia IGNORED and not added to the minutia list ... */
|
|
||||||
- if(ret == IGNORE)
|
|
||||||
+ if(ret != 0)
|
|
||||||
/* Deallocate the minutia. */
|
|
||||||
free_minutia(minutia);
|
|
||||||
|
|
||||||
@@ -1776,7 +1776,7 @@ int process_vertical_scan_minutia_V2(MINUTIAE *minutiae,
|
|
||||||
dmapval, bdata, iw, ih, lfsparms);
|
|
||||||
|
|
||||||
/* If minuitia IGNORED and not added to the minutia list ... */
|
|
||||||
- if(ret == IGNORE)
|
|
||||||
+ if(ret != 0)
|
|
||||||
/* Deallocate the minutia. */
|
|
||||||
free_minutia(minutia);
|
|
||||||
|
|
||||||
diff --git a/libfprint/nbis/mindtct/ridges.c b/libfprint/nbis/mindtct/ridges.c
|
|
||||||
index f0d9cd3..9902585 100644
|
|
||||||
--- mindtct/ridges.c
|
|
||||||
+++ mindtct/ridges.c
|
|
||||||
@@ -147,6 +147,8 @@ int count_minutia_ridges(const int first, MINUTIAE *minutiae,
|
|
||||||
{
|
|
||||||
int i, ret, *nbr_list, *nbr_nridges, nnbrs;
|
|
||||||
|
|
||||||
+ g_assert (lfsparms->max_nbrs > 0);
|
|
||||||
+
|
|
||||||
/* Find up to the maximum number of qualifying neighbors. */
|
|
||||||
nbr_list = NULL;
|
|
||||||
if((ret = find_neighbors(&nbr_list, &nnbrs, lfsparms->max_nbrs,
|
|
||||||
@@ -407,6 +409,8 @@ int insert_neighbor(const int pos, const int nbr_index, const double nbr_dist2,
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
+ g_assert (pos >= 0);
|
|
||||||
+
|
|
||||||
/* If the desired insertion position is beyond one passed the last */
|
|
||||||
/* neighbor in the lists OR greater than equal to the maximum ... */
|
|
||||||
/* NOTE: pos is zero-oriented while nnbrs and max_nbrs are 1-oriented. */
|
|
||||||
@@ -260,8 +260,6 @@ typedef struct g_lfsparms{
|
|||||||
int pores_steps_bwd;
|
int pores_steps_bwd;
|
||||||
double pores_min_dist2;
|
double pores_min_dist2;
|
||||||
double pores_max_ratio;
|
double pores_max_ratio;
|
||||||
int remove_perimeter_pts;
|
|
||||||
int min_pp_distance;
|
|
||||||
|
|
||||||
/* Ridge Counting Controls */
|
/* Ridge Counting Controls */
|
||||||
int max_nbrs;
|
int max_nbrs;
|
||||||
@@ -611,9 +609,6 @@ typedef struct g_lfsparms{
|
|||||||
/* contour points to be considered a pore. */
|
/* contour points to be considered a pore. */
|
||||||
#define PORES_MAX_RATIO 2.25
|
#define PORES_MAX_RATIO 2.25
|
||||||
|
|
||||||
/* Points which are closer than this distance to scan perimeter will be removed */
|
|
||||||
#define PERIMETER_PTS_DISTANCE 10
|
|
||||||
|
|
||||||
|
|
||||||
/***** RIDGE COUNTING CONSTANTS *****/
|
/***** RIDGE COUNTING CONSTANTS *****/
|
||||||
|
|
||||||
@@ -1128,9 +1123,6 @@ extern int remove_or_adjust_side_minutiae(MINUTIAE *, unsigned char *,
|
|||||||
extern int remove_or_adjust_side_minutiae_V2(MINUTIAE *,
|
extern int remove_or_adjust_side_minutiae_V2(MINUTIAE *,
|
||||||
unsigned char *, const int, const int,
|
unsigned char *, const int, const int,
|
||||||
int *, const int, const int, const LFSPARMS *);
|
int *, const int, const int, const LFSPARMS *);
|
||||||
extern int remove_perimeter_pts(MINUTIAE *minutiae,
|
|
||||||
unsigned char *bdata, const int iw, const int ih,
|
|
||||||
const LFSPARMS *lfsparms);
|
|
||||||
|
|
||||||
/* results.c */
|
/* results.c */
|
||||||
extern int write_text_results(char *, const int, const int, const int,
|
extern int write_text_results(char *, const int, const int, const int,
|
||||||
|
|||||||
@@ -440,8 +440,6 @@ int get_centered_contour(int **ocontour_x, int **ocontour_y,
|
|||||||
int *contour_x, *contour_y, *contour_ex, *contour_ey, ncontour;
|
int *contour_x, *contour_y, *contour_ex, *contour_ey, ncontour;
|
||||||
int i, j, ret;
|
int i, j, ret;
|
||||||
|
|
||||||
g_assert (half_contour > 0);
|
|
||||||
|
|
||||||
/* Compute maximum length of complete contour */
|
/* Compute maximum length of complete contour */
|
||||||
/* (2 half contours + feature point). */
|
/* (2 half contours + feature point). */
|
||||||
max_contour = (half_contour<<1) + 1;
|
max_contour = (half_contour<<1) + 1;
|
||||||
|
|||||||
@@ -150,8 +150,6 @@ LFSPARMS g_lfsparms = {
|
|||||||
PORES_STEPS_BWD,
|
PORES_STEPS_BWD,
|
||||||
PORES_MIN_DIST2,
|
PORES_MIN_DIST2,
|
||||||
PORES_MAX_RATIO,
|
PORES_MAX_RATIO,
|
||||||
FALSE, /* not removing perimeter points by default */
|
|
||||||
PERIMETER_PTS_DISTANCE,
|
|
||||||
|
|
||||||
/* Ridge Counting Controls */
|
/* Ridge Counting Controls */
|
||||||
MAX_NBRS,
|
MAX_NBRS,
|
||||||
@@ -236,8 +234,6 @@ LFSPARMS g_lfsparms_V2 = {
|
|||||||
PORES_STEPS_BWD,
|
PORES_STEPS_BWD,
|
||||||
PORES_MIN_DIST2,
|
PORES_MIN_DIST2,
|
||||||
PORES_MAX_RATIO,
|
PORES_MAX_RATIO,
|
||||||
FALSE, /* not removing perimeter points by default */
|
|
||||||
PERIMETER_PTS_DISTANCE,
|
|
||||||
|
|
||||||
/* Ridge Counting Controls */
|
/* Ridge Counting Controls */
|
||||||
MAX_NBRS,
|
MAX_NBRS,
|
||||||
|
|||||||
@@ -1625,7 +1625,7 @@ int process_horizontal_scan_minutia_V2(MINUTIAE *minutiae,
|
|||||||
dmapval, bdata, iw, ih, lfsparms);
|
dmapval, bdata, iw, ih, lfsparms);
|
||||||
|
|
||||||
/* If minuitia IGNORED and not added to the minutia list ... */
|
/* If minuitia IGNORED and not added to the minutia list ... */
|
||||||
if(ret != 0)
|
if(ret == IGNORE)
|
||||||
/* Deallocate the minutia. */
|
/* Deallocate the minutia. */
|
||||||
free_minutia(minutia);
|
free_minutia(minutia);
|
||||||
|
|
||||||
@@ -1776,7 +1776,7 @@ int process_vertical_scan_minutia_V2(MINUTIAE *minutiae,
|
|||||||
dmapval, bdata, iw, ih, lfsparms);
|
dmapval, bdata, iw, ih, lfsparms);
|
||||||
|
|
||||||
/* If minuitia IGNORED and not added to the minutia list ... */
|
/* If minuitia IGNORED and not added to the minutia list ... */
|
||||||
if(ret != 0)
|
if(ret == IGNORE)
|
||||||
/* Deallocate the minutia. */
|
/* Deallocate the minutia. */
|
||||||
free_minutia(minutia);
|
free_minutia(minutia);
|
||||||
|
|
||||||
|
|||||||
@@ -195,11 +195,6 @@ int remove_false_minutia_V2(MINUTIAE *minutiae,
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 11. Remove minutiae on image edge */
|
|
||||||
if((ret = remove_perimeter_pts(minutiae, bdata, iw, ih, lfsparms))) {
|
|
||||||
return (ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1334,159 +1329,6 @@ int remove_pointing_invblock_V2(MINUTIAE *minutiae,
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mark_minutiae_in_range(MINUTIAE *minutiae, int *to_remove, int x, int y,
|
|
||||||
const LFSPARMS *lfsparms)
|
|
||||||
{
|
|
||||||
int i, dist;
|
|
||||||
for (i = 0; i < minutiae->num; i++) {
|
|
||||||
if (to_remove[i])
|
|
||||||
continue;
|
|
||||||
dist = (int)sqrt((x - minutiae->list[i]->x) * (x - minutiae->list[i]->x) +
|
|
||||||
(y - minutiae->list[i]->y) * (y - minutiae->list[i]->y));
|
|
||||||
if (dist < lfsparms->min_pp_distance) {
|
|
||||||
to_remove[i] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
**************************************************************************
|
|
||||||
#cat: remove_perimeter_pts - Takes a list of true and false minutiae and
|
|
||||||
#cat: attempts to detect and remove those false minutiae that
|
|
||||||
#cat: belong to image edge
|
|
||||||
|
|
||||||
Input:
|
|
||||||
minutiae - list of true and false minutiae
|
|
||||||
bdata - binary image data (0==while & 1==black)
|
|
||||||
iw - width (in pixels) of image
|
|
||||||
ih - height (in pixels) of image
|
|
||||||
lfsparms - parameters and thresholds for controlling LFS
|
|
||||||
Output:
|
|
||||||
minutiae - list of pruned minutiae
|
|
||||||
Return Code:
|
|
||||||
Zero - successful completion
|
|
||||||
Negative - system error
|
|
||||||
**************************************************************************/
|
|
||||||
int remove_perimeter_pts(MINUTIAE *minutiae,
|
|
||||||
unsigned char *bdata, const int iw, const int ih,
|
|
||||||
const LFSPARMS *lfsparms)
|
|
||||||
{
|
|
||||||
int i, j, ret, *to_remove;
|
|
||||||
int *left, *left_up, *left_down;
|
|
||||||
int *right, *right_up, *right_down;
|
|
||||||
int removed = 0;
|
|
||||||
int left_min, right_max;
|
|
||||||
|
|
||||||
if (!lfsparms->remove_perimeter_pts)
|
|
||||||
return(0);
|
|
||||||
|
|
||||||
to_remove = calloc(minutiae->num, sizeof(int));
|
|
||||||
left = calloc(ih, sizeof(int));
|
|
||||||
left_up = calloc(ih, sizeof(int));
|
|
||||||
left_down = calloc(ih, sizeof(int));
|
|
||||||
right = calloc(ih, sizeof(int));
|
|
||||||
right_up = calloc(ih, sizeof(int));
|
|
||||||
right_down = calloc(ih, sizeof(int));
|
|
||||||
|
|
||||||
/* Pass downwards */
|
|
||||||
left_min = iw - 1;
|
|
||||||
right_max = 0;
|
|
||||||
for (i = 0; i < ih; i++) {
|
|
||||||
for (j = 0; j < left_min; j++) {
|
|
||||||
if ((bdata[i * iw + j] != 0)) {
|
|
||||||
left_min = j;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (left_min == (iw - 1))
|
|
||||||
left_down[i] = -1;
|
|
||||||
else
|
|
||||||
left_down[i] = left_min;
|
|
||||||
for (j = iw - 1; j >= right_max; j--) {
|
|
||||||
if ((bdata[i * iw + j] != 0)) {
|
|
||||||
right_max = j;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (right_max == 0)
|
|
||||||
right_down[i] = -1;
|
|
||||||
else
|
|
||||||
right_down[i] = right_max;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Pass upwards */
|
|
||||||
left_min = iw - 1;
|
|
||||||
right_max = 0;
|
|
||||||
for (i = ih - 1; i >= 0; i--) {
|
|
||||||
for (j = 0; j < left_min; j++) {
|
|
||||||
if ((bdata[i * iw + j] != 0)) {
|
|
||||||
left_min = j;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (left_min == (iw - 1))
|
|
||||||
left_up[i] = -1;
|
|
||||||
else
|
|
||||||
left_up[i] = left_min;
|
|
||||||
for (j = iw - 1; j >= right_max; j--) {
|
|
||||||
if ((bdata[i * iw + j] != 0)) {
|
|
||||||
right_max = j;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (right_max == 0)
|
|
||||||
right_up[i] = -1;
|
|
||||||
else
|
|
||||||
right_up[i] = right_max;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Merge */
|
|
||||||
left_min = left_down[ih - 1];
|
|
||||||
right_max = right_down[ih - 1];
|
|
||||||
for (i = 0; i < ih; i++) {
|
|
||||||
if (left_down[i] != left_min)
|
|
||||||
left[i] = left_down[i];
|
|
||||||
else
|
|
||||||
left[i] = left_up[i];
|
|
||||||
|
|
||||||
if (right_down[i] != right_max)
|
|
||||||
right[i] = right_down[i];
|
|
||||||
else
|
|
||||||
right[i] = right_up[i];
|
|
||||||
}
|
|
||||||
free(left_up);
|
|
||||||
free(left_down);
|
|
||||||
free(right_up);
|
|
||||||
free(right_down);
|
|
||||||
|
|
||||||
/* Mark minitiae close to the edge */
|
|
||||||
for (i = 0; i < ih; i++) {
|
|
||||||
if (left[i] != -1)
|
|
||||||
mark_minutiae_in_range(minutiae, to_remove, left[i], i, lfsparms);
|
|
||||||
if (right[i] != -1)
|
|
||||||
mark_minutiae_in_range(minutiae, to_remove, right[i], i, lfsparms);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(left);
|
|
||||||
free(right);
|
|
||||||
|
|
||||||
for (i = minutiae->num - 1; i >= 0; i--) {
|
|
||||||
/* If the current minutia index is flagged for removal ... */
|
|
||||||
if (to_remove[i]){
|
|
||||||
removed ++;
|
|
||||||
/* Remove the minutia from the minutiae list. */
|
|
||||||
if((ret = remove_minutia(i, minutiae))){
|
|
||||||
free(to_remove);
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(to_remove);
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
**************************************************************************
|
**************************************************************************
|
||||||
#cat: remove_overlaps - Takes a list of true and false minutiae and
|
#cat: remove_overlaps - Takes a list of true and false minutiae and
|
||||||
|
|||||||
@@ -147,8 +147,6 @@ int count_minutia_ridges(const int first, MINUTIAE *minutiae,
|
|||||||
{
|
{
|
||||||
int i, ret, *nbr_list, *nbr_nridges, nnbrs;
|
int i, ret, *nbr_list, *nbr_nridges, nnbrs;
|
||||||
|
|
||||||
g_assert (lfsparms->max_nbrs > 0);
|
|
||||||
|
|
||||||
/* Find up to the maximum number of qualifying neighbors. */
|
/* Find up to the maximum number of qualifying neighbors. */
|
||||||
nbr_list = NULL;
|
nbr_list = NULL;
|
||||||
if((ret = find_neighbors(&nbr_list, &nnbrs, lfsparms->max_nbrs,
|
if((ret = find_neighbors(&nbr_list, &nnbrs, lfsparms->max_nbrs,
|
||||||
@@ -409,8 +407,6 @@ int insert_neighbor(const int pos, const int nbr_index, const double nbr_dist2,
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
g_assert (pos >= 0);
|
|
||||||
|
|
||||||
/* If the desired insertion position is beyond one passed the last */
|
/* If the desired insertion position is beyond one passed the last */
|
||||||
/* neighbor in the lists OR greater than equal to the maximum ... */
|
/* neighbor in the lists OR greater than equal to the maximum ... */
|
||||||
/* NOTE: pos is zero-oriented while nnbrs and max_nbrs are 1-oriented. */
|
/* NOTE: pos is zero-oriented while nnbrs and max_nbrs are 1-oriented. */
|
||||||
|
|||||||
@@ -1,231 +0,0 @@
|
|||||||
diff --git nbis/include/lfs.h nbis/include/lfs.h
|
|
||||||
index f4f38d7..8b12e73 100644
|
|
||||||
--- nbis/include/lfs.h
|
|
||||||
+++ nbis/include/lfs.h
|
|
||||||
@@ -260,6 +260,8 @@ typedef struct g_lfsparms{
|
|
||||||
int pores_steps_bwd;
|
|
||||||
double pores_min_dist2;
|
|
||||||
double pores_max_ratio;
|
|
||||||
+ int remove_perimeter_pts;
|
|
||||||
+ int min_pp_distance;
|
|
||||||
|
|
||||||
/* Ridge Counting Controls */
|
|
||||||
int max_nbrs;
|
|
||||||
@@ -609,6 +611,9 @@ typedef struct g_lfsparms{
|
|
||||||
/* contour points to be considered a pore. */
|
|
||||||
#define PORES_MAX_RATIO 2.25
|
|
||||||
|
|
||||||
+/* Points which are closer than this distance to scan perimeter will be removed */
|
|
||||||
+#define PERIMETER_PTS_DISTANCE 10
|
|
||||||
+
|
|
||||||
|
|
||||||
/***** RIDGE COUNTING CONSTANTS *****/
|
|
||||||
|
|
||||||
@@ -1123,6 +1128,9 @@ extern int remove_or_adjust_side_minutiae(MINUTIAE *, unsigned char *,
|
|
||||||
extern int remove_or_adjust_side_minutiae_V2(MINUTIAE *,
|
|
||||||
unsigned char *, const int, const int,
|
|
||||||
int *, const int, const int, const LFSPARMS *);
|
|
||||||
+extern int remove_perimeter_pts(MINUTIAE *minutiae,
|
|
||||||
+ unsigned char *bdata, const int iw, const int ih,
|
|
||||||
+ const LFSPARMS *lfsparms);
|
|
||||||
|
|
||||||
/* results.c */
|
|
||||||
extern int write_text_results(char *, const int, const int, const int,
|
|
||||||
diff --git nbis/mindtct/globals.c nbis/mindtct/globals.c
|
|
||||||
index da10c15..79bc583 100644
|
|
||||||
--- nbis/mindtct/globals.c
|
|
||||||
+++ nbis/mindtct/globals.c
|
|
||||||
@@ -150,6 +150,8 @@ LFSPARMS g_lfsparms = {
|
|
||||||
PORES_STEPS_BWD,
|
|
||||||
PORES_MIN_DIST2,
|
|
||||||
PORES_MAX_RATIO,
|
|
||||||
+ FALSE, /* not removing perimeter points by default */
|
|
||||||
+ PERIMETER_PTS_DISTANCE,
|
|
||||||
|
|
||||||
/* Ridge Counting Controls */
|
|
||||||
MAX_NBRS,
|
|
||||||
@@ -234,6 +236,8 @@ LFSPARMS g_lfsparms_V2 = {
|
|
||||||
PORES_STEPS_BWD,
|
|
||||||
PORES_MIN_DIST2,
|
|
||||||
PORES_MAX_RATIO,
|
|
||||||
+ FALSE, /* not removing perimeter points by default */
|
|
||||||
+ PERIMETER_PTS_DISTANCE,
|
|
||||||
|
|
||||||
/* Ridge Counting Controls */
|
|
||||||
MAX_NBRS,
|
|
||||||
diff --git nbis/mindtct/remove.c nbis/mindtct/remove.c
|
|
||||||
index af5ab7d..7311f1c 100644
|
|
||||||
--- nbis/mindtct/remove.c
|
|
||||||
+++ nbis/mindtct/remove.c
|
|
||||||
@@ -195,6 +195,11 @@ int remove_false_minutia_V2(MINUTIAE *minutiae,
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* 11. Remove minutiae on image edge */
|
|
||||||
+ if((ret = remove_perimeter_pts(minutiae, bdata, iw, ih, lfsparms))) {
|
|
||||||
+ return (ret);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1329,6 +1334,159 @@ int remove_pointing_invblock_V2(MINUTIAE *minutiae,
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void mark_minutiae_in_range(MINUTIAE *minutiae, int *to_remove, int x, int y,
|
|
||||||
+ const LFSPARMS *lfsparms)
|
|
||||||
+{
|
|
||||||
+ int i, dist;
|
|
||||||
+ for (i = 0; i < minutiae->num; i++) {
|
|
||||||
+ if (to_remove[i])
|
|
||||||
+ continue;
|
|
||||||
+ dist = (int)sqrt((x - minutiae->list[i]->x) * (x - minutiae->list[i]->x) +
|
|
||||||
+ (y - minutiae->list[i]->y) * (y - minutiae->list[i]->y));
|
|
||||||
+ if (dist < lfsparms->min_pp_distance) {
|
|
||||||
+ to_remove[i] = 1;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*************************************************************************
|
|
||||||
+**************************************************************************
|
|
||||||
+#cat: remove_perimeter_pts - Takes a list of true and false minutiae and
|
|
||||||
+#cat: attempts to detect and remove those false minutiae that
|
|
||||||
+#cat: belong to image edge
|
|
||||||
+
|
|
||||||
+ Input:
|
|
||||||
+ minutiae - list of true and false minutiae
|
|
||||||
+ bdata - binary image data (0==while & 1==black)
|
|
||||||
+ iw - width (in pixels) of image
|
|
||||||
+ ih - height (in pixels) of image
|
|
||||||
+ lfsparms - parameters and thresholds for controlling LFS
|
|
||||||
+ Output:
|
|
||||||
+ minutiae - list of pruned minutiae
|
|
||||||
+ Return Code:
|
|
||||||
+ Zero - successful completion
|
|
||||||
+ Negative - system error
|
|
||||||
+**************************************************************************/
|
|
||||||
+int remove_perimeter_pts(MINUTIAE *minutiae,
|
|
||||||
+ unsigned char *bdata, const int iw, const int ih,
|
|
||||||
+ const LFSPARMS *lfsparms)
|
|
||||||
+{
|
|
||||||
+ int i, j, ret, *to_remove;
|
|
||||||
+ int *left, *left_up, *left_down;
|
|
||||||
+ int *right, *right_up, *right_down;
|
|
||||||
+ int removed = 0;
|
|
||||||
+ int left_min, right_max;
|
|
||||||
+
|
|
||||||
+ if (!lfsparms->remove_perimeter_pts)
|
|
||||||
+ return(0);
|
|
||||||
+
|
|
||||||
+ to_remove = calloc(minutiae->num, sizeof(int));
|
|
||||||
+ left = calloc(ih, sizeof(int));
|
|
||||||
+ left_up = calloc(ih, sizeof(int));
|
|
||||||
+ left_down = calloc(ih, sizeof(int));
|
|
||||||
+ right = calloc(ih, sizeof(int));
|
|
||||||
+ right_up = calloc(ih, sizeof(int));
|
|
||||||
+ right_down = calloc(ih, sizeof(int));
|
|
||||||
+
|
|
||||||
+ /* Pass downwards */
|
|
||||||
+ left_min = iw - 1;
|
|
||||||
+ right_max = 0;
|
|
||||||
+ for (i = 0; i < ih; i++) {
|
|
||||||
+ for (j = 0; j < left_min; j++) {
|
|
||||||
+ if ((bdata[i * iw + j] != 0)) {
|
|
||||||
+ left_min = j;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (left_min == (iw - 1))
|
|
||||||
+ left_down[i] = -1;
|
|
||||||
+ else
|
|
||||||
+ left_down[i] = left_min;
|
|
||||||
+ for (j = iw - 1; j >= right_max; j--) {
|
|
||||||
+ if ((bdata[i * iw + j] != 0)) {
|
|
||||||
+ right_max = j;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (right_max == 0)
|
|
||||||
+ right_down[i] = -1;
|
|
||||||
+ else
|
|
||||||
+ right_down[i] = right_max;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Pass upwards */
|
|
||||||
+ left_min = iw - 1;
|
|
||||||
+ right_max = 0;
|
|
||||||
+ for (i = ih - 1; i >= 0; i--) {
|
|
||||||
+ for (j = 0; j < left_min; j++) {
|
|
||||||
+ if ((bdata[i * iw + j] != 0)) {
|
|
||||||
+ left_min = j;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (left_min == (iw - 1))
|
|
||||||
+ left_up[i] = -1;
|
|
||||||
+ else
|
|
||||||
+ left_up[i] = left_min;
|
|
||||||
+ for (j = iw - 1; j >= right_max; j--) {
|
|
||||||
+ if ((bdata[i * iw + j] != 0)) {
|
|
||||||
+ right_max = j;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (right_max == 0)
|
|
||||||
+ right_up[i] = -1;
|
|
||||||
+ else
|
|
||||||
+ right_up[i] = right_max;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Merge */
|
|
||||||
+ left_min = left_down[ih - 1];
|
|
||||||
+ right_max = right_down[ih - 1];
|
|
||||||
+ for (i = 0; i < ih; i++) {
|
|
||||||
+ if (left_down[i] != left_min)
|
|
||||||
+ left[i] = left_down[i];
|
|
||||||
+ else
|
|
||||||
+ left[i] = left_up[i];
|
|
||||||
+
|
|
||||||
+ if (right_down[i] != right_max)
|
|
||||||
+ right[i] = right_down[i];
|
|
||||||
+ else
|
|
||||||
+ right[i] = right_up[i];
|
|
||||||
+ }
|
|
||||||
+ free(left_up);
|
|
||||||
+ free(left_down);
|
|
||||||
+ free(right_up);
|
|
||||||
+ free(right_down);
|
|
||||||
+
|
|
||||||
+ /* Mark minitiae close to the edge */
|
|
||||||
+ for (i = 0; i < ih; i++) {
|
|
||||||
+ if (left[i] != -1)
|
|
||||||
+ mark_minutiae_in_range(minutiae, to_remove, left[i], i, lfsparms);
|
|
||||||
+ if (right[i] != -1)
|
|
||||||
+ mark_minutiae_in_range(minutiae, to_remove, right[i], i, lfsparms);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ free(left);
|
|
||||||
+ free(right);
|
|
||||||
+
|
|
||||||
+ for (i = minutiae->num - 1; i >= 0; i--) {
|
|
||||||
+ /* If the current minutia index is flagged for removal ... */
|
|
||||||
+ if (to_remove[i]){
|
|
||||||
+ removed ++;
|
|
||||||
+ /* Remove the minutia from the minutiae list. */
|
|
||||||
+ if((ret = remove_minutia(i, minutiae))){
|
|
||||||
+ free(to_remove);
|
|
||||||
+ return(ret);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ free(to_remove);
|
|
||||||
+
|
|
||||||
+ return (0);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/*************************************************************************
|
|
||||||
**************************************************************************
|
|
||||||
#cat: remove_overlaps - Takes a list of true and false minutiae and
|
|
||||||
@@ -192,9 +192,3 @@ spatch --sp-file remove-global-y.cocci bozorth3/* include/bozorth.h --in-place
|
|||||||
# The above leaves an unused variable around, triggering a warning
|
# The above leaves an unused variable around, triggering a warning
|
||||||
# remove it.
|
# remove it.
|
||||||
patch -p0 < glib-mem-warning.patch
|
patch -p0 < glib-mem-warning.patch
|
||||||
|
|
||||||
# Also fix some scan-build warnings, mostly by adding assertions
|
|
||||||
patch -p0 < fix-scan-build-reports.patch
|
|
||||||
|
|
||||||
# Add pass to remove perimeter points
|
|
||||||
patch -p0 < remove-perimeter-pts.patch
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
project('libfprint', [ 'c', 'cpp' ],
|
project('libfprint', [ 'c', 'cpp' ],
|
||||||
version: '1.90.2',
|
version: '1.90.1',
|
||||||
license: 'LGPLv2.1+',
|
license: 'LGPLv2.1+',
|
||||||
default_options: [
|
default_options: [
|
||||||
'buildtype=debugoptimized',
|
'buildtype=debugoptimized',
|
||||||
|
|||||||
@@ -1,94 +0,0 @@
|
|||||||
`umockdev` Tests
|
|
||||||
================
|
|
||||||
`umockdev` tests use fingerprint devices mocked by [`umockdev`
|
|
||||||
toolchain][umockdev].
|
|
||||||
|
|
||||||
This document describes how to create a 'capture' test: a test that
|
|
||||||
captures a picture of a fingerprint from the device (mocked by
|
|
||||||
`umockdev`) and compares it with the standard one.
|
|
||||||
|
|
||||||
Other kinds of `umockdev` tests could be created in a similar manner.
|
|
||||||
|
|
||||||
|
|
||||||
'Capture' Test Creation
|
|
||||||
-----------------------
|
|
||||||
A new 'capture' test is created by means of `capture.py` script:
|
|
||||||
|
|
||||||
1. Create (if needed) a directory for the driver under `tests`
|
|
||||||
directory:
|
|
||||||
|
|
||||||
`mkdir DRIVER`
|
|
||||||
|
|
||||||
2. Prepare your execution environment.
|
|
||||||
|
|
||||||
In the next step a working and up to date libfprint is needed. This can be
|
|
||||||
achieved by installing it into your system. Alternatively, you can set
|
|
||||||
the following environment variables to run a local build:
|
|
||||||
- `export LD_PRELOAD=<meson-build-dir>/libfprint/libfprint-2.so`
|
|
||||||
- `export GI_TYPELIB_PATH=<meson-build-dir>/libfprint`
|
|
||||||
|
|
||||||
Also, sometimes the driver must be adopted to the emulated environment
|
|
||||||
(mainly if it uses random numbers, see `synaptics.c` for an example).
|
|
||||||
Set the following environment variable to enable this adaptation:
|
|
||||||
- `export FP_DEVICE_EMULATION=1`
|
|
||||||
|
|
||||||
Run the next steps in the same terminal.
|
|
||||||
|
|
||||||
3. Find the real USB fingerprint device with `lsusb`, e.g.:
|
|
||||||
|
|
||||||
`Bus 001 Device 005: ID 138a:0090 Validity Sensors, Inc. VFS7500 Touch Fingerprint Sensor`
|
|
||||||
|
|
||||||
The following USB device is used in the example above:
|
|
||||||
`/dev/bus/usb/001/005`.
|
|
||||||
|
|
||||||
4. Record information about this device:
|
|
||||||
|
|
||||||
`umockdev-record /dev/bus/usb/001/005 > DRIVER/device`
|
|
||||||
|
|
||||||
5. Record interaction of `capture.py` (or other test) with the device:
|
|
||||||
|
|
||||||
`umockdev-record -i /dev/bus/usb/001/005=DRIVER/capture.ioctl -- python3 ./capture.py DRIVER/capture.png`
|
|
||||||
|
|
||||||
Files `capture.ioctl` and `capture.png` will be created as the
|
|
||||||
result of this command.
|
|
||||||
|
|
||||||
6. Add driver's name to `drivers_tests` in the `meson.build`.
|
|
||||||
7. Check whether everything works as expected.
|
|
||||||
|
|
||||||
**Note.** To avoid submitting a real fingerprint, the side of finger,
|
|
||||||
arm, or anything else producing an image with the device can be used.
|
|
||||||
|
|
||||||
|
|
||||||
Possible Issues
|
|
||||||
---------------
|
|
||||||
`umockdev-record` aggressively groups URBs. In most cases, manual
|
|
||||||
intervention is unfortunately required. Often, drivers do a chain of
|
|
||||||
commands like: A then B each with a different reply. However,
|
|
||||||
`umockdev-record` could create a file like this:
|
|
||||||
|
|
||||||
A
|
|
||||||
reply 1
|
|
||||||
reply 2
|
|
||||||
B
|
|
||||||
reply 1
|
|
||||||
reply 2
|
|
||||||
|
|
||||||
In that case, records must be re-ordered:
|
|
||||||
|
|
||||||
A
|
|
||||||
reply 1
|
|
||||||
B
|
|
||||||
reply 1
|
|
||||||
A
|
|
||||||
reply 2
|
|
||||||
B
|
|
||||||
reply 2
|
|
||||||
|
|
||||||
Other changes may be needed to get everything working. For example the
|
|
||||||
`elan` driver relies on a timeout that is not reported correctly. In
|
|
||||||
this case the driver works around it by interpreting the protocol
|
|
||||||
error differently in the virtual environment (by means of
|
|
||||||
`FP_DEVICE_EMULATION` environment variable).
|
|
||||||
|
|
||||||
|
|
||||||
[umockdev]: https://github.com/martinpitt/umockdev
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -18,9 +18,8 @@ envs.set('NO_AT_BRIDGE', '1')
|
|||||||
|
|
||||||
drivers_tests = [
|
drivers_tests = [
|
||||||
'elan',
|
'elan',
|
||||||
'synaptics',
|
|
||||||
'vfs0050',
|
|
||||||
'vfs5011',
|
'vfs5011',
|
||||||
|
'synaptics',
|
||||||
]
|
]
|
||||||
|
|
||||||
if get_option('introspection')
|
if get_option('introspection')
|
||||||
@@ -31,6 +30,7 @@ if get_option('introspection')
|
|||||||
unittest_inspector = find_program('unittest_inspector.py')
|
unittest_inspector = find_program('unittest_inspector.py')
|
||||||
base_args = files('virtual-image.py')
|
base_args = files('virtual-image.py')
|
||||||
suite = []
|
suite = []
|
||||||
|
timeout = 30
|
||||||
|
|
||||||
r = run_command(unittest_inspector, files('virtual-image.py'))
|
r = run_command(unittest_inspector, files('virtual-image.py'))
|
||||||
unit_tests = r.stdout().strip().split('\n')
|
unit_tests = r.stdout().strip().split('\n')
|
||||||
@@ -39,6 +39,7 @@ if get_option('introspection')
|
|||||||
suite += 'virtual-image'
|
suite += 'virtual-image'
|
||||||
else
|
else
|
||||||
unit_tests = ['virtual-image']
|
unit_tests = ['virtual-image']
|
||||||
|
timeout = 120
|
||||||
endif
|
endif
|
||||||
|
|
||||||
foreach ut: unit_tests
|
foreach ut: unit_tests
|
||||||
@@ -54,6 +55,7 @@ if get_option('introspection')
|
|||||||
suite: ut_suite,
|
suite: ut_suite,
|
||||||
depends: libfprint_typelib,
|
depends: libfprint_typelib,
|
||||||
env: envs,
|
env: envs,
|
||||||
|
timeout: timeout,
|
||||||
)
|
)
|
||||||
endforeach
|
endforeach
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -100,10 +100,7 @@ fpi_device_fake_enroll (FpDevice *device)
|
|||||||
fpi_device_get_enroll_data (device, (FpPrint **) &fake_dev->action_data);
|
fpi_device_get_enroll_data (device, (FpPrint **) &fake_dev->action_data);
|
||||||
|
|
||||||
if (!print && !fake_dev->ret_error)
|
if (!print && !fake_dev->ret_error)
|
||||||
{
|
|
||||||
fpi_device_get_enroll_data (device, &print);
|
fpi_device_get_enroll_data (device, &print);
|
||||||
fpi_print_set_type (print, FPI_PRINT_RAW);
|
|
||||||
}
|
|
||||||
|
|
||||||
fpi_device_enroll_complete (device,
|
fpi_device_enroll_complete (device,
|
||||||
print ? g_object_ref (print) : NULL,
|
print ? g_object_ref (print) : NULL,
|
||||||
|
|||||||
@@ -81,8 +81,6 @@ test_frame_assembling (void)
|
|||||||
ctx.frame_height = 20;
|
ctx.frame_height = 20;
|
||||||
ctx.image_width = width;
|
ctx.image_width = width;
|
||||||
|
|
||||||
g_assert (height > ctx.frame_height);
|
|
||||||
|
|
||||||
offset = 10;
|
offset = 10;
|
||||||
test_height = height - (height - ctx.frame_height) % offset;
|
test_height = height - (height - ctx.frame_height) % offset;
|
||||||
|
|
||||||
|
|||||||
@@ -541,24 +541,6 @@ test_driver_enroll_error_no_print (void)
|
|||||||
g_assert_true (error == g_steal_pointer (&fake_dev->ret_error));
|
g_assert_true (error == g_steal_pointer (&fake_dev->ret_error));
|
||||||
g_assert_null (out_print);
|
g_assert_null (out_print);
|
||||||
g_assert_null (fake_dev->ret_print);
|
g_assert_null (fake_dev->ret_print);
|
||||||
g_clear_error (&error);
|
|
||||||
|
|
||||||
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
|
|
||||||
"*Driver did not set the type on the returned print*");
|
|
||||||
|
|
||||||
fake_dev->ret_error = NULL;
|
|
||||||
fake_dev->ret_print = fp_print_new (device); /* Type not set. */
|
|
||||||
g_object_add_weak_pointer (G_OBJECT (fake_dev->ret_print),
|
|
||||||
(gpointer) (&fake_dev->ret_print));
|
|
||||||
out_print =
|
|
||||||
fp_device_enroll_sync (device, fp_print_new (device), NULL, NULL, NULL, &error);
|
|
||||||
|
|
||||||
g_test_assert_expected_messages ();
|
|
||||||
g_assert (fake_dev->last_called_function == dev_class->enroll);
|
|
||||||
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
|
|
||||||
g_assert_null (out_print);
|
|
||||||
g_assert_null (fake_dev->ret_print);
|
|
||||||
g_clear_error (&error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -653,7 +635,7 @@ test_driver_enroll_progress (void)
|
|||||||
{
|
{
|
||||||
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
|
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
|
||||||
g_autoptr(FpAutoCloseDevice) device = NULL;
|
g_autoptr(FpAutoCloseDevice) device = NULL;
|
||||||
G_GNUC_UNUSED g_autoptr(FpPrint) enrolled_print = NULL;
|
g_autoptr(FpPrint) enrolled_print = NULL;
|
||||||
ExpectedEnrollData expected_enroll_data = {0};
|
ExpectedEnrollData expected_enroll_data = {0};
|
||||||
FpiDeviceFake *fake_dev;
|
FpiDeviceFake *fake_dev;
|
||||||
|
|
||||||
@@ -977,7 +959,7 @@ test_driver_verify_complete_retry (void)
|
|||||||
|
|
||||||
g_test_assert_expected_messages ();
|
g_test_assert_expected_messages ();
|
||||||
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
|
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
|
||||||
g_steal_pointer (&fake_dev->user_data);
|
g_assert_true (error != g_steal_pointer (&fake_dev->user_data));
|
||||||
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
|
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
|
||||||
g_assert_true (match_data->called);
|
g_assert_true (match_data->called);
|
||||||
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT);
|
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT);
|
||||||
@@ -999,7 +981,7 @@ test_driver_verify_complete_retry (void)
|
|||||||
g_test_assert_expected_messages ();
|
g_test_assert_expected_messages ();
|
||||||
|
|
||||||
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
|
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
|
||||||
g_steal_pointer (&fake_dev->user_data);
|
g_assert_true (error != g_steal_pointer (&fake_dev->user_data));
|
||||||
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
|
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
|
||||||
g_assert_true (match_data->called);
|
g_assert_true (match_data->called);
|
||||||
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT);
|
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT);
|
||||||
@@ -1019,7 +1001,7 @@ test_driver_verify_complete_retry (void)
|
|||||||
g_test_assert_expected_messages ();
|
g_test_assert_expected_messages ();
|
||||||
|
|
||||||
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
|
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
|
||||||
g_steal_pointer (&fake_dev->user_data);
|
g_assert_true (error != g_steal_pointer (&fake_dev->user_data));
|
||||||
g_assert_error (error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_GENERAL);
|
g_assert_error (error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_GENERAL);
|
||||||
g_assert_true (match_data->called);
|
g_assert_true (match_data->called);
|
||||||
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_GENERAL);
|
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_GENERAL);
|
||||||
@@ -1314,7 +1296,7 @@ test_driver_identify_complete_retry (void)
|
|||||||
g_test_assert_expected_messages ();
|
g_test_assert_expected_messages ();
|
||||||
|
|
||||||
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
|
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
|
||||||
g_steal_pointer (&fake_dev->user_data);
|
g_assert_true (error != g_steal_pointer (&fake_dev->user_data));
|
||||||
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
|
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
|
||||||
g_assert_true (match_data->called);
|
g_assert_true (match_data->called);
|
||||||
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT);
|
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT);
|
||||||
@@ -1373,7 +1355,7 @@ test_driver_identify_report_no_callback (void)
|
|||||||
g_autoptr(MatchCbData) match_data = g_new0 (MatchCbData, 1);
|
g_autoptr(MatchCbData) match_data = g_new0 (MatchCbData, 1);
|
||||||
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
|
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
g_autoptr(FpAutoCloseDevice) device = NULL;
|
g_autoptr(FpAutoCloseDevice) device = NULL;
|
||||||
G_GNUC_UNUSED g_autoptr(FpPrint) enrolled_print = NULL;
|
g_autoptr(FpPrint) enrolled_print = NULL;
|
||||||
g_autoptr(FpPrint) print = NULL;
|
g_autoptr(FpPrint) print = NULL;
|
||||||
g_autoptr(FpPrint) match = NULL;
|
g_autoptr(FpPrint) match = NULL;
|
||||||
g_autoptr(GError) error = NULL;
|
g_autoptr(GError) error = NULL;
|
||||||
@@ -1511,7 +1493,6 @@ test_driver_list (void)
|
|||||||
g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
|
g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
|
||||||
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
|
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
|
||||||
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
|
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
|
||||||
|
|
||||||
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
|
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@@ -1534,7 +1515,6 @@ test_driver_list_error (void)
|
|||||||
g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
|
g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
|
||||||
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
|
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
|
||||||
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
|
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
|
||||||
|
|
||||||
g_autoptr(GPtrArray) prints = NULL;
|
g_autoptr(GPtrArray) prints = NULL;
|
||||||
|
|
||||||
fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_GENERAL);
|
fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_GENERAL);
|
||||||
@@ -1911,7 +1891,7 @@ test_driver_action_error_all (void)
|
|||||||
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
|
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
g_autoptr(GError) error = NULL;
|
g_autoptr(GError) error = NULL;
|
||||||
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
|
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
|
||||||
FpiDeviceFake *fake_dev;
|
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
|
||||||
|
|
||||||
fake_dev = FPI_DEVICE_FAKE (device);
|
fake_dev = FPI_DEVICE_FAKE (device);
|
||||||
fake_dev->return_action_error = TRUE;
|
fake_dev->return_action_error = TRUE;
|
||||||
@@ -1982,7 +1962,7 @@ test_driver_action_error_fallback_all (void)
|
|||||||
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
|
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
g_autoptr(GError) error = NULL;
|
g_autoptr(GError) error = NULL;
|
||||||
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
|
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
|
||||||
FpiDeviceFake *fake_dev;
|
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
|
||||||
|
|
||||||
fake_dev = FPI_DEVICE_FAKE (device);
|
fake_dev = FPI_DEVICE_FAKE (device);
|
||||||
fake_dev->return_action_error = TRUE;
|
fake_dev->return_action_error = TRUE;
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ test_ssm_new_full (void)
|
|||||||
static void
|
static void
|
||||||
test_ssm_new_no_handler (void)
|
test_ssm_new_no_handler (void)
|
||||||
{
|
{
|
||||||
G_GNUC_UNUSED g_autoptr(FpiSsm) ssm = NULL;
|
g_autoptr(FpiSsm) ssm = NULL;
|
||||||
|
|
||||||
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
|
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
|
||||||
"*BUG:*handler*");
|
"*BUG:*handler*");
|
||||||
@@ -211,7 +211,7 @@ test_ssm_new_no_handler (void)
|
|||||||
static void
|
static void
|
||||||
test_ssm_new_wrong_states (void)
|
test_ssm_new_wrong_states (void)
|
||||||
{
|
{
|
||||||
G_GNUC_UNUSED g_autoptr(FpiSsm) ssm = NULL;
|
g_autoptr(FpiSsm) ssm = NULL;
|
||||||
|
|
||||||
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
|
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
|
||||||
"*BUG:*nr_states*");
|
"*BUG:*nr_states*");
|
||||||
@@ -1172,7 +1172,6 @@ test_ssm_subssm_start (void)
|
|||||||
g_autoptr(FpiSsm) subssm =
|
g_autoptr(FpiSsm) subssm =
|
||||||
ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM");
|
ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM");
|
||||||
FpiSsmTestData *data = fpi_ssm_get_data (ssm);
|
FpiSsmTestData *data = fpi_ssm_get_data (ssm);
|
||||||
|
|
||||||
g_autoptr(FpiSsmTestData) subdata =
|
g_autoptr(FpiSsmTestData) subdata =
|
||||||
fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm));
|
fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm));
|
||||||
|
|
||||||
@@ -1263,7 +1262,6 @@ test_ssm_subssm_start_with_started (void)
|
|||||||
g_autoptr(FpiSsm) subssm =
|
g_autoptr(FpiSsm) subssm =
|
||||||
ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM");
|
ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM");
|
||||||
FpiSsmTestData *data = fpi_ssm_get_data (ssm);
|
FpiSsmTestData *data = fpi_ssm_get_data (ssm);
|
||||||
|
|
||||||
g_autoptr(FpiSsmTestData) subdata =
|
g_autoptr(FpiSsmTestData) subdata =
|
||||||
fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm));
|
fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm));
|
||||||
|
|
||||||
@@ -1307,7 +1305,6 @@ test_ssm_subssm_start_with_delayed (void)
|
|||||||
g_autoptr(FpiSsm) subssm =
|
g_autoptr(FpiSsm) subssm =
|
||||||
ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM");
|
ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM");
|
||||||
FpiSsmTestData *data = fpi_ssm_get_data (ssm);
|
FpiSsmTestData *data = fpi_ssm_get_data (ssm);
|
||||||
|
|
||||||
g_autoptr(FpiSsmTestData) subdata =
|
g_autoptr(FpiSsmTestData) subdata =
|
||||||
fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm));
|
fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm));
|
||||||
gpointer timeout_tracker = GUINT_TO_POINTER (TRUE);
|
gpointer timeout_tracker = GUINT_TO_POINTER (TRUE);
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
|
Before Width: | Height: | Size: 148 KiB |
@@ -1,83 +0,0 @@
|
|||||||
P: /devices/pci0000:00/0000:00:14.0/usb1/1-9
|
|
||||||
N: bus/usb/001/004=12011001FF10FF088A13500060000000010109022E00010100A0320904000004FF00000007050102400000070581024000000705820240000007058303080004
|
|
||||||
E: DEVNAME=/dev/bus/usb/001/004
|
|
||||||
E: DEVTYPE=usb_device
|
|
||||||
E: DRIVER=usb
|
|
||||||
E: PRODUCT=138a/50/60
|
|
||||||
E: TYPE=255/16/255
|
|
||||||
E: BUSNUM=001
|
|
||||||
E: DEVNUM=004
|
|
||||||
E: MAJOR=189
|
|
||||||
E: MINOR=3
|
|
||||||
E: SUBSYSTEM=usb
|
|
||||||
E: ID_VENDOR=138a
|
|
||||||
E: ID_VENDOR_ENC=138a
|
|
||||||
E: ID_VENDOR_ID=138a
|
|
||||||
E: ID_MODEL=0050
|
|
||||||
E: ID_MODEL_ENC=0050
|
|
||||||
E: ID_MODEL_ID=0050
|
|
||||||
E: ID_REVISION=0060
|
|
||||||
E: ID_SERIAL=138a_0050_6d1900a1a0c0
|
|
||||||
E: ID_SERIAL_SHORT=6d1900a1a0c0
|
|
||||||
E: ID_BUS=usb
|
|
||||||
E: ID_USB_INTERFACES=:ff0000:
|
|
||||||
E: ID_VENDOR_FROM_DATABASE=Validity Sensors, Inc.
|
|
||||||
E: ID_MODEL_FROM_DATABASE=Swipe Fingerprint Sensor
|
|
||||||
E: ID_PATH=pci-0000:00:14.0-usb-0:9
|
|
||||||
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_9
|
|
||||||
E: LIBFPRINT_DRIVER=Validity VFS0050
|
|
||||||
A: authorized=1
|
|
||||||
A: avoid_reset_quirk=0
|
|
||||||
A: bConfigurationValue=1
|
|
||||||
A: bDeviceClass=ff
|
|
||||||
A: bDeviceProtocol=ff
|
|
||||||
A: bDeviceSubClass=10
|
|
||||||
A: bMaxPacketSize0=8
|
|
||||||
A: bMaxPower=100mA
|
|
||||||
A: bNumConfigurations=1
|
|
||||||
A: bNumInterfaces= 1
|
|
||||||
A: bcdDevice=0060
|
|
||||||
A: bmAttributes=a0
|
|
||||||
A: busnum=1
|
|
||||||
A: configuration=
|
|
||||||
H: descriptors=12011001FF10FF088A13500060000000010109022E00010100A0320904000004FF00000007050102400000070581024000000705820240000007058303080004
|
|
||||||
A: dev=189:3
|
|
||||||
A: devnum=4
|
|
||||||
A: devpath=9
|
|
||||||
L: driver=../../../../../bus/usb/drivers/usb
|
|
||||||
A: idProduct=0050
|
|
||||||
A: idVendor=138a
|
|
||||||
A: ltm_capable=no
|
|
||||||
A: maxchild=0
|
|
||||||
L: port=../1-0:1.0/usb1-port9
|
|
||||||
A: power/active_duration=19312
|
|
||||||
A: power/async=enabled
|
|
||||||
A: power/autosuspend=2
|
|
||||||
A: power/autosuspend_delay_ms=2000
|
|
||||||
A: power/connected_duration=1037732
|
|
||||||
A: power/control=auto
|
|
||||||
A: power/level=auto
|
|
||||||
A: power/persist=1
|
|
||||||
A: power/runtime_active_kids=0
|
|
||||||
A: power/runtime_active_time=19151
|
|
||||||
A: power/runtime_enabled=enabled
|
|
||||||
A: power/runtime_status=active
|
|
||||||
A: power/runtime_suspended_time=1018305
|
|
||||||
A: power/runtime_usage=0
|
|
||||||
A: power/wakeup=disabled
|
|
||||||
A: power/wakeup_abort_count=
|
|
||||||
A: power/wakeup_active=
|
|
||||||
A: power/wakeup_active_count=
|
|
||||||
A: power/wakeup_count=
|
|
||||||
A: power/wakeup_expire_count=
|
|
||||||
A: power/wakeup_last_time_ms=
|
|
||||||
A: power/wakeup_max_time_ms=
|
|
||||||
A: power/wakeup_total_time_ms=
|
|
||||||
A: quirks=0x0
|
|
||||||
A: removable=fixed
|
|
||||||
A: rx_lanes=1
|
|
||||||
A: serial=6d1900a1a0c0
|
|
||||||
A: speed=12
|
|
||||||
A: tx_lanes=1
|
|
||||||
A: urbnum=8
|
|
||||||
A: version= 1.10
|
|
||||||
@@ -3,10 +3,11 @@
|
|||||||
import sys
|
import sys
|
||||||
try:
|
try:
|
||||||
import gi
|
import gi
|
||||||
|
gi.require_version('FPrint', '2.0')
|
||||||
|
from gi.repository import FPrint, GLib, Gio
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
from gi.repository import GLib, Gio
|
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
import socket
|
import socket
|
||||||
import struct
|
import struct
|
||||||
@@ -19,8 +20,6 @@ except Exception as e:
|
|||||||
print("Missing dependencies: %s" % str(e))
|
print("Missing dependencies: %s" % str(e))
|
||||||
sys.exit(77)
|
sys.exit(77)
|
||||||
|
|
||||||
FPrint = None
|
|
||||||
|
|
||||||
# Re-run the test with the passed wrapper if set
|
# Re-run the test with the passed wrapper if set
|
||||||
wrapper = os.getenv('LIBFPRINT_TEST_WRAPPER')
|
wrapper = os.getenv('LIBFPRINT_TEST_WRAPPER')
|
||||||
if wrapper:
|
if wrapper:
|
||||||
@@ -102,14 +101,12 @@ class VirtualImage(unittest.TestCase):
|
|||||||
del self.con
|
del self.con
|
||||||
self.dev.close_sync()
|
self.dev.close_sync()
|
||||||
|
|
||||||
def send_retry(self, retry_error=None, iterate=True):
|
def send_retry(self, retry_error=FPrint.DeviceRetry.TOO_SHORT, iterate=True):
|
||||||
retry_error = retry_error if retry_error else FPrint.DeviceRetry.TOO_SHORT
|
|
||||||
self.con.sendall(struct.pack('ii', -1, retry_error))
|
self.con.sendall(struct.pack('ii', -1, retry_error))
|
||||||
while iterate and ctx.pending():
|
while iterate and ctx.pending():
|
||||||
ctx.iteration(False)
|
ctx.iteration(False)
|
||||||
|
|
||||||
def send_error(self, device_error=None, iterate=True):
|
def send_error(self, device_error=FPrint.DeviceError.GENERAL, iterate=True):
|
||||||
device_error = device_error if device_error else FPrint.DeviceError.GENERAL
|
|
||||||
self.con.sendall(struct.pack('ii', -2, device_error))
|
self.con.sendall(struct.pack('ii', -2, device_error))
|
||||||
while iterate and ctx.pending():
|
while iterate and ctx.pending():
|
||||||
ctx.iteration(False)
|
ctx.iteration(False)
|
||||||
@@ -349,12 +346,5 @@ class VirtualImage(unittest.TestCase):
|
|||||||
assert(not self._verify_match)
|
assert(not self._verify_match)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
|
||||||
gi.require_version('FPrint', '2.0')
|
|
||||||
from gi.repository import FPrint
|
|
||||||
except Exception as e:
|
|
||||||
print("Missing dependencies: %s" % str(e))
|
|
||||||
sys.exit(77)
|
|
||||||
|
|
||||||
# avoid writing to stderr
|
# avoid writing to stderr
|
||||||
unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2))
|
unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2))
|
||||||
|
|||||||
Reference in New Issue
Block a user