static void et_write_poll_cb(struct libusb_transfer* transfer) { int r; struct poll_data* adata=transfer->user_data; struct fpi_img_dev* dev=adata->dev; if(transfer->status!=LIBUSB_TRANSFER_COMPLETED) { libusb_free_transfer(transfer); fpi_imgdev_session_error(dev,-EIO); return; } if(transfer->actual_length!=31) { libusb_free_transfer(transfer); fpi_imgdev_session_error(dev,-EIO); return; } libusb_free_transfer(transfer); r=et_read_poll(dev,adata); if(r) { libusb_free_transfer(transfer); fpi_imgdev_session_error(dev,r); return; } }
static void start_finger_detection(struct fp_img_dev *dev) { int r; struct upektc_dev *upekdev = dev->priv; struct libusb_transfer *transfer; fp_dbg(""); if (upekdev->deactivating) { complete_deactivation(dev); return; } transfer = libusb_alloc_transfer(0); if (!transfer) { fpi_imgdev_session_error(dev, -ENOMEM); return; } libusb_fill_bulk_transfer(transfer, dev->udev, upekdev->ep_out, (unsigned char *)scan_cmd, UPEKTC_CMD_LEN, finger_det_cmd_cb, dev, BULK_TIMEOUT); r = libusb_submit_transfer(transfer); if (r < 0) { libusb_free_transfer(transfer); fpi_imgdev_session_error(dev, r); } }
static void finger_det_data_cb(struct libusb_transfer *transfer) { struct fp_img_dev *dev = transfer->user_data; struct upektc_dev *upekdev = dev->priv; unsigned char *data = transfer->buffer; if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { fp_dbg("data transfer status %d\n", transfer->status); fpi_imgdev_session_error(dev, -EIO); goto out; } else if (transfer->length != transfer->actual_length) { fp_dbg("expected %d, got %d bytes", transfer->length, transfer->actual_length); fpi_imgdev_session_error(dev, -EPROTO); } if (finger_present(data, IMAGE_SIZE, upekdev->sum_threshold)) { /* finger present, start capturing */ fpi_imgdev_report_finger_status(dev, TRUE); start_capture(dev); } else { /* no finger, poll for a new histogram */ start_finger_detection(dev); } out: g_free(data); libusb_free_transfer(transfer); }
static void et_read_poll_cb(struct libusb_transfer* transfer) { int len; char* br; int r; struct poll_data* adata=transfer->user_data; struct fpi_img_dev* dev=adata->dev; if(transfer->status!=LIBUSB_TRANSFER_COMPLETED) { /*WORKAROUND NEEDED, SOMETIME ALL FREEZES, RESET DEVICE AND REACTIVATE???*/ libusb_free_transfer(transfer); fp_dbg("ERROR"); fpi_imgdev_session_error(dev,-EIO); //return; goto _st; } len=transfer->actual_length-13; if(len!=512) { fp_dbg("Invalid return buffer, length: %d",transfer->actual_length); libusb_free_transfer(transfer); fpi_imgdev_session_error(dev,-EPROTO); return; } libusb_free_transfer(transfer); //Check poll cmd result br=(char*)&ret_buf[len]; r=et_verify_result(br); if(r) { fp_dbg("Invalid result: %s",print_buf(br)); fpi_imgdev_session_error(dev,-EPROTO); return; } //fp_dbg("0x%02hhX,0x%02hhX",ret_buf[0],ret_buf[1]); if((unsigned char)ret_buf[0]==0x82) { if(adata->init->rstage<20) { /*VERY UGLY workaround below, but I don't know how to deal with it. Sometime ret_buf[0] equals 0x82 at the first poll rounds, but really no finger on the scanner */ fp_dbg("POLL WORKAROUND"); goto _st; } //Finger detected //fp_dbg("FINGER DETECTED!"); //fp_dbg("BUF: %s",print_buf(ret_buf)); fpi_imgdev_report_finger_status(dev,TRUE); start_capture(dev); return; } //No finger detected _st: adata->init->rstage++; start_finger_detection(dev,adata); }
static void capture_sm_complete(struct fpi_ssm *ssm) { struct fp_img_dev *dev = ssm->priv; struct upektc_dev *upekdev = dev->priv; fp_dbg("Capture completed"); if (upekdev->deactivating) complete_deactivation(dev); else if (ssm->error) fpi_imgdev_session_error(dev, ssm->error); else start_finger_detection(dev); fpi_ssm_free(ssm); }
static void finger_det_cmd_cb(struct libusb_transfer *t) { struct libusb_transfer *transfer; unsigned char *data; int r; struct fp_img_dev *dev = t->user_data; struct upektc_dev *upekdev = dev->priv; if (t->status != LIBUSB_TRANSFER_COMPLETED) { fp_dbg("req transfer status %d\n", t->status); fpi_imgdev_session_error(dev, -EIO); goto exit_free_transfer; } else if (t->length != t->actual_length) { fp_dbg("expected %d, sent %d bytes", t->length, t->actual_length); fpi_imgdev_session_error(dev, -EPROTO); goto exit_free_transfer; } transfer = libusb_alloc_transfer(0); if (!transfer) { fpi_imgdev_session_error(dev, -ENOMEM); goto exit_free_transfer; } data = g_malloc(IMAGE_SIZE); libusb_fill_bulk_transfer(transfer, dev->udev, upekdev->ep_in, data, IMAGE_SIZE, finger_det_data_cb, dev, BULK_TIMEOUT); r = libusb_submit_transfer(transfer); if (r < 0) { g_free(data); libusb_free_transfer(transfer); fpi_imgdev_session_error(dev, r); } exit_free_transfer: libusb_free_transfer(t); }
/* Submit asynchronous sleep */ static void async_sleep(unsigned int msec, struct fpi_ssm *ssm) { struct fp_img_dev *dev = ssm->priv; struct fpi_timeout *timeout; /* Add timeout */ timeout = fpi_timeout_add(msec, async_sleep_cb, ssm); if (timeout == NULL) { /* Failed to add timeout */ fp_err("failed to add timeout"); fpi_imgdev_session_error(dev, -ETIME); fpi_ssm_mark_aborted(ssm, -ETIME); } }
static void capture_sm_complete(struct fpi_ssm *ssm) { struct fp_img_dev *dev = ssm->priv; struct aesX660_dev *aesdev = dev->priv; int err = ssm->error; fp_dbg("Capture completed"); fpi_ssm_free(ssm); if (aesdev->deactivating) complete_deactivation(dev); else if (err) fpi_imgdev_session_error(dev, err); else start_finger_detection(dev); }
static void start_finger_detection(struct fp_img_dev *dev,struct poll_data* adata) { struct etss801u_dev *etdev = dev->priv; int r; if (etdev->deactivating) { complete_deactivation(dev); return; } r=et_write_poll(dev,adata); if(r) { fpi_imgdev_session_error(dev,r); } }
static void loopsm_complete(struct fpi_ssm *ssm) { struct fp_img_dev *dev = ssm->priv; struct v5s_dev *vdev = dev->priv; int r = ssm->error; fpi_ssm_free(ssm); fp_img_free(vdev->capture_img); vdev->capture_img = NULL; vdev->loop_running = FALSE; if (r) fpi_imgdev_session_error(dev, r); if (vdev->deactivating) fpi_imgdev_deactivate_complete(dev); }
static void finger_det_sm_complete(struct fpi_ssm *ssm) { struct fp_img_dev *dev = ssm->priv; struct aesX660_dev *aesdev = dev->priv; int err = ssm->error; fp_dbg("Finger detection completed"); fpi_imgdev_report_finger_status(dev, TRUE); fpi_ssm_free(ssm); if (aesdev->deactivating) complete_deactivation(dev); else if (err) fpi_imgdev_session_error(dev, err); else { fpi_imgdev_report_finger_status(dev, TRUE); start_capture(dev); } }
static void capture_sm_complete(struct fpi_ssm *ssm) { static struct poll_data adata; struct fp_img_dev *dev = ssm->priv; struct etss801u_dev *etdev = dev->priv; fp_dbg(""); if (etdev->deactivating) complete_deactivation(dev); else if (ssm->error) fpi_imgdev_session_error(dev, ssm->error); else /*Done finger enrolling, assemble image and give it to library*/ et_assemble_image(dev); fpi_imgdev_report_finger_status(dev, FALSE); memset(&einit,0,sizeof(struct et_init)); adata.dev=(struct fpi_img_dev*)dev; adata.init=&einit; start_finger_detection(dev,&adata); fpi_ssm_free(ssm); }