void fpi_imgdev_report_finger_status(struct fp_img_dev *imgdev, gboolean present) { int r = imgdev->action_result; struct fp_print_data *data = imgdev->acquire_data; struct fp_img *img = imgdev->acquire_img; fp_dbg(present ? "finger on sensor" : "finger removed"); if (present && imgdev->action_state == IMG_ACQUIRE_STATE_AWAIT_FINGER_ON) { dev_change_state(imgdev, IMGDEV_STATE_CAPTURE); imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_IMAGE; return; } else if (present || imgdev->action_state != IMG_ACQUIRE_STATE_AWAIT_FINGER_OFF) { fp_dbg("ignoring status report"); return; } /* clear these before reporting results to avoid complications with * call cascading in and out of the library */ imgdev->acquire_img = NULL; imgdev->acquire_data = NULL; /* finger removed, report results */ switch (imgdev->action) { case IMG_ACTION_ENROLL: fp_dbg("reporting enroll result"); fpi_drvcb_enroll_stage_completed(imgdev->dev, r, data, img); if (r > 0 && r != FP_ENROLL_COMPLETE && r != FP_ENROLL_FAIL) { imgdev->action_result = 0; imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_ON; dev_change_state(imgdev, IMG_ACQUIRE_STATE_AWAIT_FINGER_ON); } break; case IMG_ACTION_VERIFY: fpi_drvcb_report_verify_result(imgdev->dev, r, img); fp_print_data_free(data); break; case IMG_ACTION_IDENTIFY: fpi_drvcb_report_identify_result(imgdev->dev, r, imgdev->identify_match_offset, img); fp_print_data_free(data); break; default: fp_err("unhandled action %d", imgdev->action); break; } }
void fpi_imgdev_activate_complete(struct fp_img_dev *imgdev, int status) { fp_dbg("status %d", status); switch (imgdev->action) { case IMG_ACTION_ENROLL: fpi_drvcb_enroll_started(imgdev->dev, status); break; case IMG_ACTION_VERIFY: fpi_drvcb_verify_started(imgdev->dev, status); break; case IMG_ACTION_IDENTIFY: fpi_drvcb_identify_started(imgdev->dev, status); break; case IMG_ACTION_CAPTURE: fpi_drvcb_capture_started(imgdev->dev, status); break; default: fp_err("unhandled action %d", imgdev->action); return; } if (status == 0) { imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_ON; dev_change_state(imgdev, IMGDEV_STATE_AWAIT_FINGER_ON); } }
void fpi_imgdev_image_captured(struct fp_img_dev *imgdev, struct fp_img *img) { struct fp_print_data *print; int r; fp_dbg(""); if (imgdev->action_state != IMG_ACQUIRE_STATE_AWAIT_IMAGE) { fp_dbg("ignoring due to current state %d", imgdev->action_state); return; } if (imgdev->action_result) { fp_dbg("not overwriting existing action result"); return; } r = sanitize_image(imgdev, &img); if (r < 0) { imgdev->action_result = r; fp_img_free(img); goto next_state; } fp_img_standardize(img); imgdev->acquire_img = img; r = fpi_img_to_print_data(imgdev, img, &print); if (r < 0) { fp_dbg("image to print data conversion error: %d", r); imgdev->action_result = FP_ENROLL_RETRY; goto next_state; } else if (img->minutiae->num < MIN_ACCEPTABLE_MINUTIAE) { fp_dbg("not enough minutiae, %d/%d", img->minutiae->num, MIN_ACCEPTABLE_MINUTIAE); fp_print_data_free(print); /* depends on FP_ENROLL_RETRY == FP_VERIFY_RETRY */ imgdev->action_result = FP_ENROLL_RETRY; goto next_state; } imgdev->acquire_data = print; switch (imgdev->action) { case IMG_ACTION_ENROLL: imgdev->action_result = FP_ENROLL_COMPLETE; break; case IMG_ACTION_VERIFY: verify_process_img(imgdev); break; case IMG_ACTION_IDENTIFY: identify_process_img(imgdev); break; default: BUG(); break; } next_state: imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_OFF; dev_change_state(imgdev, IMGDEV_STATE_AWAIT_FINGER_OFF); }
void fpi_imgdev_image_captured(struct fp_img_dev *imgdev, struct fp_img *img) { struct fp_print_data *print; int r; fp_dbg(""); if (imgdev->action_state != IMG_ACQUIRE_STATE_AWAIT_IMAGE) { fp_dbg("ignoring due to current state %d", imgdev->action_state); return; } if (imgdev->action_result) { fp_dbg("not overwriting existing action result"); return; } r = sanitize_image(imgdev, &img); if (r < 0) { imgdev->action_result = r; fp_img_free(img); goto next_state; } fp_img_standardize(img); imgdev->acquire_img = img; if (imgdev->action != IMG_ACTION_CAPTURE) { r = fpi_img_to_print_data(imgdev, img, &print); if (r < 0) { fp_dbg("image to print data conversion error: %d", r); imgdev->action_result = FP_ENROLL_RETRY; goto next_state; } else if (img->minutiae->num < MIN_ACCEPTABLE_MINUTIAE) { fp_dbg("not enough minutiae, %d/%d", img->minutiae->num, MIN_ACCEPTABLE_MINUTIAE); fp_print_data_free(print); /* depends on FP_ENROLL_RETRY == FP_VERIFY_RETRY */ imgdev->action_result = FP_ENROLL_RETRY; goto next_state; } } imgdev->acquire_data = print; switch (imgdev->action) { case IMG_ACTION_ENROLL: if (!imgdev->enroll_data) { imgdev->enroll_data = fpi_print_data_new(imgdev->dev); } BUG_ON(g_slist_length(print->prints) != 1); /* Move print data from acquire data into enroll_data */ imgdev->enroll_data->prints = g_slist_prepend(imgdev->enroll_data->prints, print->prints->data); print->prints = g_slist_remove(print->prints, print->prints->data); fp_print_data_free(imgdev->acquire_data); imgdev->acquire_data = NULL; imgdev->enroll_stage++; if (imgdev->enroll_stage == imgdev->dev->nr_enroll_stages) imgdev->action_result = FP_ENROLL_COMPLETE; else imgdev->action_result = FP_ENROLL_PASS; break; case IMG_ACTION_VERIFY: verify_process_img(imgdev); break; case IMG_ACTION_IDENTIFY: identify_process_img(imgdev); break; case IMG_ACTION_CAPTURE: imgdev->action_result = FP_CAPTURE_COMPLETE; break; default: BUG(); break; } next_state: imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_OFF; dev_change_state(imgdev, IMGDEV_STATE_AWAIT_FINGER_OFF); }
void fpi_imgdev_abort_scan(struct fp_img_dev *imgdev, int result) { imgdev->action_result = result; imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_OFF; dev_change_state(imgdev, IMGDEV_STATE_AWAIT_FINGER_OFF); }