elan: Increase bz3 threshold to 24
Based on experience. Values more than 24 seem to work just after enrollment, but it becomes very hard to verify in a day or so.
This commit is contained in:
parent
75fe328f64
commit
4ff97e7cbd
1 changed files with 39 additions and 13 deletions
|
@ -41,6 +41,14 @@
|
||||||
#include "drivers_api.h"
|
#include "drivers_api.h"
|
||||||
#include "elan.h"
|
#include "elan.h"
|
||||||
|
|
||||||
|
#define dbg_buf(buf, len) \
|
||||||
|
if (len == 1) \
|
||||||
|
fp_dbg("%02hx", buf[0]); \
|
||||||
|
else if (len == 2) \
|
||||||
|
fp_dbg("%04hx", buf[0] << 8 | buf[1]); \
|
||||||
|
else if (len > 2) \
|
||||||
|
fp_dbg("%04hx... (%d bytes)", buf[0] << 8 | buf[1], len)
|
||||||
|
|
||||||
unsigned char elan_get_pixel(struct fpi_frame_asmbl_ctx *ctx,
|
unsigned char elan_get_pixel(struct fpi_frame_asmbl_ctx *ctx,
|
||||||
struct fpi_frame *frame, unsigned int x,
|
struct fpi_frame *frame, unsigned int x,
|
||||||
unsigned int y)
|
unsigned int y)
|
||||||
|
@ -189,22 +197,32 @@ static void elan_save_background(struct elan_dev *elandev)
|
||||||
* \
|
* \
|
||||||
* ======== 0 \___> ======== 0
|
* ======== 0 \___> ======== 0
|
||||||
*/
|
*/
|
||||||
static void elan_save_img_frame(struct elan_dev *elandev)
|
static int elan_save_img_frame(struct elan_dev *elandev)
|
||||||
{
|
{
|
||||||
G_DEBUG_HERE();
|
G_DEBUG_HERE();
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
for (int i = 0; i < frame_size; i++)
|
for (int i = 0; i < frame_size; i++) {
|
||||||
if (elandev->background[i] > frame[i])
|
if (elandev->background[i] > frame[i])
|
||||||
frame[i] = 0;
|
frame[i] = 0;
|
||||||
else
|
else
|
||||||
frame[i] -= elandev->background[i];
|
frame[i] -= elandev->background[i];
|
||||||
|
sum += frame[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sum == 0) {
|
||||||
|
fp_dbg
|
||||||
|
("frame darker than background; finger present during calibration?");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
elandev->frames = g_slist_prepend(elandev->frames, frame);
|
elandev->frames = g_slist_prepend(elandev->frames, frame);
|
||||||
elandev->num_frames += 1;
|
elandev->num_frames += 1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void elan_process_frame_linear(unsigned short *raw_frame,
|
static void elan_process_frame_linear(unsigned short *raw_frame,
|
||||||
|
@ -280,6 +298,7 @@ static void elan_submit_image(struct fp_img_dev *dev)
|
||||||
|
|
||||||
for (int i = 0; i < ELAN_SKIP_LAST_FRAMES; i++)
|
for (int i = 0; i < ELAN_SKIP_LAST_FRAMES; i++)
|
||||||
elandev->frames = g_slist_next(elandev->frames);
|
elandev->frames = g_slist_next(elandev->frames);
|
||||||
|
elandev->num_frames -= ELAN_SKIP_LAST_FRAMES;
|
||||||
|
|
||||||
assembling_ctx.frame_width = elandev->frame_width;
|
assembling_ctx.frame_width = elandev->frame_width;
|
||||||
assembling_ctx.frame_height = elandev->frame_height;
|
assembling_ctx.frame_height = elandev->frame_height;
|
||||||
|
@ -287,10 +306,8 @@ static void elan_submit_image(struct fp_img_dev *dev)
|
||||||
g_slist_foreach(elandev->frames, (GFunc) elandev->process_frame,
|
g_slist_foreach(elandev->frames, (GFunc) elandev->process_frame,
|
||||||
&frames);
|
&frames);
|
||||||
fpi_do_movement_estimation(&assembling_ctx, frames,
|
fpi_do_movement_estimation(&assembling_ctx, frames,
|
||||||
elandev->num_frames - ELAN_SKIP_LAST_FRAMES);
|
elandev->num_frames);
|
||||||
img =
|
img = fpi_assemble_frames(&assembling_ctx, frames, elandev->num_frames);
|
||||||
fpi_assemble_frames(&assembling_ctx, frames,
|
|
||||||
elandev->num_frames - ELAN_SKIP_LAST_FRAMES);
|
|
||||||
|
|
||||||
img->flags |= FP_IMG_PARTIAL;
|
img->flags |= FP_IMG_PARTIAL;
|
||||||
fpi_imgdev_image_captured(dev, img);
|
fpi_imgdev_image_captured(dev, img);
|
||||||
|
@ -319,12 +336,15 @@ static void elan_cmd_cb(struct libusb_transfer *transfer)
|
||||||
transfer->length, transfer->actual_length);
|
transfer->length, transfer->actual_length);
|
||||||
elan_dev_reset(elandev);
|
elan_dev_reset(elandev);
|
||||||
fpi_ssm_mark_aborted(ssm, -EPROTO);
|
fpi_ssm_mark_aborted(ssm, -EPROTO);
|
||||||
} else if (transfer->endpoint & LIBUSB_ENDPOINT_IN)
|
} else if (transfer->endpoint & LIBUSB_ENDPOINT_IN) {
|
||||||
/* just finished receiving */
|
/* just finished receiving */
|
||||||
|
dbg_buf(elandev->last_read, transfer->actual_length);
|
||||||
elan_cmd_done(ssm);
|
elan_cmd_done(ssm);
|
||||||
else
|
} else {
|
||||||
/* just finished sending */
|
/* just finished sending */
|
||||||
|
G_DEBUG_HERE();
|
||||||
elan_cmd_read(ssm);
|
elan_cmd_read(ssm);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case LIBUSB_TRANSFER_CANCELLED:
|
case LIBUSB_TRANSFER_CANCELLED:
|
||||||
fp_dbg("transfer cancelled");
|
fp_dbg("transfer cancelled");
|
||||||
|
@ -466,6 +486,7 @@ static void capture_run_state(struct fpi_ssm *ssm)
|
||||||
{
|
{
|
||||||
struct fp_img_dev *dev = fpi_ssm_get_user_data(ssm);
|
struct fp_img_dev *dev = fpi_ssm_get_user_data(ssm);
|
||||||
struct elan_dev *elandev = fpi_imgdev_get_user_data(dev);
|
struct elan_dev *elandev = fpi_imgdev_get_user_data(dev);
|
||||||
|
int r;
|
||||||
|
|
||||||
switch (fpi_ssm_get_cur_state(ssm)) {
|
switch (fpi_ssm_get_cur_state(ssm)) {
|
||||||
case CAPTURE_LED_ON:
|
case CAPTURE_LED_ON:
|
||||||
|
@ -485,8 +506,10 @@ static void capture_run_state(struct fpi_ssm *ssm)
|
||||||
fpi_ssm_mark_aborted(ssm, -EBADMSG);
|
fpi_ssm_mark_aborted(ssm, -EBADMSG);
|
||||||
break;
|
break;
|
||||||
case CAPTURE_CHECK_ENOUGH_FRAMES:
|
case CAPTURE_CHECK_ENOUGH_FRAMES:
|
||||||
elan_save_img_frame(elandev);
|
r = elan_save_img_frame(elandev);
|
||||||
if (elandev->num_frames < ELAN_MAX_FRAMES) {
|
if (r < 0)
|
||||||
|
fpi_ssm_mark_aborted(ssm, r);
|
||||||
|
else if (elandev->num_frames < ELAN_MAX_FRAMES) {
|
||||||
/* quickly stop if finger is removed */
|
/* quickly stop if finger is removed */
|
||||||
elandev->cmd_timeout = ELAN_FINGER_TIMEOUT;
|
elandev->cmd_timeout = ELAN_FINGER_TIMEOUT;
|
||||||
fpi_ssm_jump_to_state(ssm, CAPTURE_WAIT_FINGER);
|
fpi_ssm_jump_to_state(ssm, CAPTURE_WAIT_FINGER);
|
||||||
|
@ -533,8 +556,11 @@ static void capture_complete(struct fpi_ssm *ssm)
|
||||||
|
|
||||||
/* ...but only on enroll! If verify or identify fails because of short swipe,
|
/* ...but only on enroll! If verify or identify fails because of short swipe,
|
||||||
* we need to do it manually. It feels like libfprint or the application
|
* we need to do it manually. It feels like libfprint or the application
|
||||||
* should know better if they want to retry, but they don't. */
|
* should know better if they want to retry, but they don't. Unless we've
|
||||||
if (elandev->dev_state != IMGDEV_STATE_INACTIVE)
|
* been asked to deactivate, try to re-enter the capture loop. Since state
|
||||||
|
* change is async, there's still a chance to be deactivated by another
|
||||||
|
* pending event. */
|
||||||
|
if (elandev->dev_state_next != IMGDEV_STATE_INACTIVE)
|
||||||
dev_change_state(dev, IMGDEV_STATE_AWAIT_FINGER_ON);
|
dev_change_state(dev, IMGDEV_STATE_AWAIT_FINGER_ON);
|
||||||
|
|
||||||
fpi_ssm_free(ssm);
|
fpi_ssm_free(ssm);
|
||||||
|
@ -905,7 +931,7 @@ struct fp_img_driver elan_driver = {
|
||||||
},
|
},
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
|
|
||||||
.bz3_threshold = 22,
|
.bz3_threshold = 24,
|
||||||
|
|
||||||
.open = dev_init,
|
.open = dev_init,
|
||||||
.close = dev_deinit,
|
.close = dev_deinit,
|
||||||
|
|
Loading…
Reference in a new issue