static bool detect(pony_ctx_t* ctx, detector_t* d, view_t* view) { assert(view->perceived == NULL); scan_grey(d, view, 0); int count = scan_white(view); assert(count >= 0); if(count == 0) return false; d->detected++; perceived_t* per = (perceived_t*)POOL_ALLOC(perceived_t); per->token = d->next_token++; per->ack = 0; per->last_conf = HASHMAP_BEGIN; ponyint_viewmap_init(&per->map, count); ponyint_perceivedmap_put(&d->perceived, per); int count2 = collect_white(per, view, 0); (void)count2; assert(count2 == count); assert(ponyint_viewmap_size(&per->map) == (size_t)count); send_conf(ctx, d, per); return true; }
SANE_Status sane_start (SANE_Handle h) { struct device_s *dev = (struct device_s *) h; int status; size_t size; dev->read_offset = 0; dev->write_offset_r = 0; dev->write_offset_g = 1; dev->write_offset_b = 2; free (dev->buffer); dev->buffer = NULL; send_pkt (PKT_RESET, 0, dev); send_pkt (PKT_READ_STATUS, 0, dev); wait_ack (dev, &status); if (status) return SANE_STATUS_IO_ERROR; send_pkt (PKT_READCONF, 0, dev); if ((size = wait_ack (dev, NULL))) { sanei_usb_read_bulk (dev->dn, (unsigned char *) dev->conf_data, &size); } send_pkt (PKT_SETCONF, 100, dev); send_conf (dev); wait_ack (dev, NULL); send_pkt (PKT_START_SCAN, 0, dev); wait_ack (dev, NULL); if ((size = wait_ack (dev, NULL))) { sanei_usb_read_bulk (dev->dn, (unsigned char *) dev->conf_data, &size); } if ((size = wait_ack (dev, NULL))) { sanei_usb_read_bulk (dev->dn, (unsigned char *) dev->conf_data, &size); } if ((size = wait_ack (dev, NULL))) { sanei_usb_read_bulk (dev->dn, (unsigned char *) dev->conf_data, &size); } dev->status = STATUS_SCANNING; /* Get the first data */ return get_data (dev); }