Lines Matching refs:scanner
107 #define DBG_info_scan 11 /* information scanner commands */
144 * scanner devices found.
248 DBG( DBG_info_sane, "sane_init() looking for scanner %04x %04x model %02x, flags %02x\n",
323 * Open the scanner with the given devicename and return a handle to it, which
328 * @param handle handle to scanner (pointer to a Pieusb_Scanner struct)
336 Pieusb_Scanner *scanner, *s;
399 /* Now create a scanner structure to return */
401 /* Check if we are not opening the same scanner again. */
409 /* Create a new scanner instance */
410 scanner = malloc (sizeof (*scanner));
411 if (!scanner) {
414 memset (scanner, 0, sizeof (*scanner));
415 scanner->device = dev;
416 sanei_usb_open (dev->sane.name, &scanner->device_number);
417 scanner->cancel_request = 0;
418 scanner->shading_data_present = SANE_FALSE;
420 (void)sanei_pieusb_init_options (scanner);
423 status = sanei_pieusb_wait_ready (scanner, 0);
425 sanei_usb_close(scanner->device_number);
426 free (scanner);
427 DBG (DBG_error, "sane_open: scanner not ready\n");
434 scanner->next = first_handle;
435 first_handle = scanner;
437 *handle = scanner;
442 * Close the scanner and remove the scanner from the list of active scanners.
449 Pieusb_Scanner *prev, *scanner;
456 for (scanner = first_handle; scanner; scanner = scanner->next) {
457 if (scanner == handle) {
460 prev = scanner;
463 * scanner instances are all cast to SANE_Handle (a void pointer) */
464 if (!scanner) {
470 if (scanner->scanning) {
471 sanei_pieusb_on_cancel(scanner);
475 if (scanner->device_number >= 0) {
476 sanei_usb_reset (scanner->device_number);
477 sanei_usb_close (scanner->device_number);
481 prev->next = scanner->next;
483 first_handle = scanner->next;
486 /* Free scanner related allocated memory and the scanner itself */
488 if (scanner->buffer.data) sanei_pieusb_buffer_delete(&scanner->buffer);
489 free (scanner->ccd_mask);
490 for (k=0; k<4; k++) free (scanner->shading_ref[k]);
491 free (scanner->val[OPT_MODE].s);
492 free (scanner->val[OPT_HALFTONE_PATTERN].s);
493 free (scanner);
506 Pieusb_Scanner *scanner = handle;
515 return scanner->opt + option;
533 Pieusb_Scanner *scanner = handle;
543 /* Don't set or get options while the scanner is busy */
544 if (scanner->scanning) {
556 cap = scanner->opt[option].cap;
559 DBG(DBG_error,"Option inactive (%s)\n", scanner->opt[option].name);
564 name = scanner->opt[option].name;
614 *(SANE_Word *) val = scanner->val[option].w;
615 DBG (DBG_info_sane, "get %s [#%d] val=%d\n", name, option,scanner->val[option].w);
620 memcpy (val, scanner->val[option].wa, scanner->opt[option].size);
628 strcpy (val, scanner->val[option].s);
629 DBG (DBG_info_sane, "get %s [#%d] val=%s\n", name, option,scanner->val[option].s);
636 switch (scanner->opt[option].type) {
638 DBG (DBG_info_sane, "set %s [#%d] to %d, size=%d\n", name, option, *(SANE_Word *) val, scanner->opt[option].size);
657 status = sanei_constrain_value (scanner->opt + option, val, info);
704 scanner->val[option].w = *(SANE_Word *) val;
709 memcpy (scanner->val[option].wa, val, scanner->opt[option].size);
716 if (scanner->val[option].s) {
717 free (scanner->val[option].s);
720 scanner->val[option].s = (SANE_Char *) strdup (val);
733 if (scanner->val[option].s) {
734 free (scanner->val[option].s);
737 scanner->val[option].s = (SANE_Char *) strdup (val);
744 if (sanei_pieusb_analyse_options(scanner)) {
772 Pieusb_Scanner *scanner = handle;
781 if (scanner->scanning) {
782 /* sane_start() initialized a SANE_Parameters struct in the scanner */
783 DBG (DBG_info_sane, "sane_get_parameters from scanner values\n");
784 params->bytes_per_line = scanner->scan_parameters.bytes_per_line;
785 params->depth = scanner->scan_parameters.depth;
786 params->format = scanner->scan_parameters.format;
787 params->last_frame = scanner->scan_parameters.last_frame;
788 params->lines = scanner->scan_parameters.lines;
789 params->pixels_per_line = scanner->scan_parameters.pixels_per_line;
793 if (scanner->val[OPT_PREVIEW].b) {
794 resolution = scanner->device->fast_preview_resolution;
796 resolution = SANE_UNFIX(scanner->val[OPT_RESOLUTION].w);
799 width = SANE_UNFIX(scanner->val[OPT_BR_X].w)-SANE_UNFIX(scanner->val[OPT_TL_X].w);
800 height = SANE_UNFIX(scanner->val[OPT_BR_Y].w)-SANE_UNFIX(scanner->val[OPT_TL_Y].w);
804 mode = scanner->val[OPT_MODE].s;
815 params->depth = scanner->val[OPT_BIT_DEPTH].w;
819 params->depth = scanner->val[OPT_BIT_DEPTH].w;
823 params->depth = scanner->val[OPT_BIT_DEPTH].w;
855 * Initiates acquisition of an image from the scanner.
859 * SCAN phase 4: scan slide and save data in scanner buffer
867 struct Pieusb_Scanner *scanner = handle;
898 if (scanner->scanning) {
899 DBG (DBG_error, "sane_start(): scanner is already scanning, exiting\n");
909 sanei_pieusb_cmd_read_state (scanner->device_number, &(scanner->state), &status);
916 if (scanner->state.warmingUp) {
927 sanei_pieusb_cmd_set_exposure_time (scanner->device_number, &exptime, &status);
937 sanei_pieusb_cmd_set_highlight_shadow (scanner->device_number, &shadow, &status);
947 sanei_pieusb_cmd_get_shading_parms (scanner->device_number, scanner->device->shading_parameters, &status);
952 shading_width = scanner->device->shading_parameters[0].pixelsPerLine;
955 scanner->shading_ref[shading_idx] =
956 realloc(scanner->shading_ref[shading_idx], 2 * shading_width * sizeof(SANE_Int));
957 if (scanner->shading_ref[shading_idx] == NULL) {
961 scanner->ccd_mask = realloc (scanner->ccd_mask, shading_width);
962 scanner->ccd_mask_size = shading_width;
963 if (scanner->ccd_mask == NULL) {
991 sanei_pieusb_print_options (scanner);
992 if (!sanei_pieusb_analyse_options (scanner)) {
1001 if (sanei_pieusb_set_frame_from_options (scanner) != SANE_STATUS_GOOD) {
1013 if ( (scanner->device->flags & FLAG_SLIDE_TRANSPORT) & !(scanner->device->flags & FLAG_CMD_17_NOSUPPORT) ) {
1014 sanei_pieusb_cmd_17 (scanner->device_number, 1, &status);
1019 st = sanei_pieusb_wait_ready (scanner, 0);
1021 DBG (DBG_error, "sane_start(): scanner not ready after sanei_pieusb_cmd_17: %d\n", st);
1038 if (sanei_pieusb_set_gain_offset (scanner, scanner->val[OPT_CALIBRATION_MODE].s) != SANE_STATUS_GOOD) {
1042 st = sanei_pieusb_wait_ready (scanner, 0);
1044 DBG (DBG_error, "sane_start: scanner not ready %d\n", st);
1053 if (sanei_pieusb_set_mode_from_options (scanner) != SANE_STATUS_GOOD) {
1062 if (scanner->device->flags & FLAG_SLIDE_TRANSPORT) {
1063 sanei_pieusb_cmd_slide (scanner->device_number, SLIDE_INIT, &status);
1068 st = sanei_pieusb_wait_ready (scanner, 0);
1070 DBG (DBG_error, "sane_start: scanner not ready %d\n", st);
1082 scanner->scanning = SANE_TRUE;
1083 scanner->cancel_request = SANE_FALSE;
1085 sanei_pieusb_cmd_start_scan (scanner->device_number, &status);
1090 sanei_pieusb_wait_ready (scanner, 0);
1092 || (scanner->val[OPT_SHADING_ANALYSIS].b != 0)) {
1100 * Get settings from scanner, from preview data, from options,
1104 if (sanei_pieusb_set_gain_offset (scanner, scanner->val[OPT_CALIBRATION_MODE].s) != SANE_STATUS_GOOD) {
1105 sanei_pieusb_cmd_stop_scan (scanner->device_number, &status);
1106 scanner->scanning = SANE_FALSE;
1112 * Get parameters from scanner->device->shading_parameters[0] although
1113 * it's 45 lines, scanner->ccd_mask_size pixels, 16 bit depth in all cases.
1116 if (sanei_pieusb_get_shading_data (scanner) != SANE_STATUS_GOOD) {
1117 sanei_pieusb_cmd_stop_scan (scanner->device_number, &status);
1118 scanner->scanning = SANE_FALSE;
1128 st = sanei_pieusb_wait_ready (scanner, 0);
1130 DBG (DBG_error, "sane_start: scanner not ready %d\n", st);
1139 if (scanner->cancel_request) {
1140 return sanei_pieusb_on_cancel (scanner);
1149 if (sanei_pieusb_get_ccd_mask (scanner) != SANE_STATUS_GOOD) {
1150 sanei_pieusb_cmd_stop_scan (scanner->device_number, &status);
1151 scanner->scanning = SANE_FALSE;
1162 if (sanei_pieusb_get_parameters (scanner, &bytes_per_line) != SANE_STATUS_GOOD) {
1163 sanei_pieusb_cmd_stop_scan (scanner->device_number, &status);
1164 scanner->scanning = SANE_FALSE;
1168 st = sanei_pieusb_wait_ready (scanner, 0);
1170 DBG (DBG_error, "sane_start: scanner not ready %d\n", st);
1182 switch (scanner->mode.passes) {
1190 if (scanner->buffer.data) sanei_pieusb_buffer_delete(&scanner->buffer); /* free resources from previous invocation */
1191 st = sanei_pieusb_buffer_create (&(scanner->buffer), scanner->scan_parameters.pixels_per_line,
1192 scanner->scan_parameters.lines, colors,
1193 scanner->scan_parameters.depth);
1195 scanner->scanning = SANE_FALSE;
1204 if (sanei_pieusb_get_scan_data (scanner, bytes_per_line) != SANE_STATUS_GOOD) {
1205 scanner->scanning = SANE_FALSE;
1209 st = sanei_pieusb_wait_ready (scanner, 0);
1211 DBG (DBG_error, "sane_start(): scanner not ready after sanei_pieusb_get_scan_data: %d\n", st);
1212 scanner->scanning = SANE_FALSE;
1222 if (scanner->device->flags & FLAG_SLIDE_TRANSPORT) {
1223 if (scanner->val[OPT_ADVANCE_SLIDE].b && !scanner->val[OPT_PREVIEW].b) {
1224 sanei_pieusb_cmd_slide (scanner->device_number, SLIDE_NEXT, &status);
1240 mode = scanner->val[OPT_MODE].s;
1250 } else if (scanner->val[OPT_PREVIEW].b) {
1257 } else if (strcmp(mode, SANE_VALUE_SCAN_MODE_COLOR) == 0 && scanner->val[OPT_CLEAN_IMAGE].b) {
1264 if (scanner->val[OPT_CORRECT_SHADING].b && shading_correction_relevant) {
1265 if (scanner->shading_data_present) {
1266 sanei_pieusb_correct_shading (scanner, &scanner->buffer);
1271 if ((scanner->val[OPT_CORRECT_INFRARED].b || scanner->val[OPT_CLEAN_IMAGE].b) && !scanner->val[OPT_PREVIEW].b && infrared_post_processing_relevant) {
1275 N = scanner->buffer.width * scanner->buffer.height;
1276 planes[0] = scanner->buffer.data;
1277 planes[1] = scanner->buffer.data + N;
1278 planes[2] = scanner->buffer.data + 2 * N;
1279 planes[3] = scanner->buffer.data + 3 * N;
1281 sanei_pieusb_post (scanner, planes, scanner->buffer.colors);
1285 if (scanner->val[OPT_PREVIEW].b) {
1286 sanei_pieusb_analyze_preview(scanner);
1288 scanner->preview_done = SANE_FALSE;
1292 if (scanner->buffer.colors == PLANES && (strcmp(mode,SANE_VALUE_SCAN_MODE_COLOR) == 0 && scanner->val[OPT_CLEAN_IMAGE].b)) {
1295 scanner->buffer.colors = 3;
1297 scanner->buffer.image_size_bytes = scanner->buffer.colors * scanner->buffer.height * scanner->buffer.line_size_bytes;
1298 scanner->buffer.color_index_infrared = -1;
1299 scanner->buffer.bytes_unread = scanner->buffer.bytes_unread * 3 / 4;
1300 scanner->buffer.bytes_written = scanner->buffer.bytes_written * 3 / 4;
1308 * Read image data from the scanner buffer.
1320 struct Pieusb_Scanner *scanner = handle;
1326 if (!scanner->scanning) {
1332 if (scanner->cancel_request) {
1333 return sanei_pieusb_on_cancel(scanner);
1336 /* Return image data, just read from scanner buffer */
1338 DBG(DBG_info_sane, " image size %d\n", scanner->buffer.image_size_bytes);
1339 DBG(DBG_info_sane, " unread %d\n", scanner->buffer.bytes_unread);
1340 DBG(DBG_info_sane, " read %d\n", scanner->buffer.bytes_read);
1343 if (scanner->buffer.bytes_read > scanner->buffer.image_size_bytes) {
1345 DBG(DBG_error, "sane_read(): reading past buffer boundaries (contains %d, read %d)\n", scanner->buffer.image_size_bytes, scanner->buffer.bytes_read);
1347 sanei_pieusb_on_cancel(scanner);
1349 } else if (scanner->buffer.bytes_read == scanner->buffer.image_size_bytes) {
1352 scanner->scanning = SANE_FALSE;
1354 } else if (scanner->buffer.bytes_unread >= max_len) {
1356 DBG(DBG_info_sane, "sane_read(): buffer suffices (contains %d, requested %d)\n", scanner->buffer.bytes_unread, max_len);
1358 } else if (scanner->buffer.bytes_read + scanner->buffer.bytes_unread == scanner->buffer.image_size_bytes) {
1360 DBG(DBG_info_sane, "sane_read(): buffer suffices (contains %d, requested %d, last batch though)\n", scanner->buffer.bytes_unread, max_len);
1361 return_size = scanner->buffer.bytes_unread;
1369 if (return_size == 0 && scanner->buffer.bytes_read < scanner->buffer.image_size_bytes) {
1370 DBG(DBG_error, "sane_read(): unable to service read request, %d bytes in frame, %d read\n", scanner->buffer.image_size_bytes, scanner->buffer.bytes_read);
1374 sanei_pieusb_buffer_get(&scanner->buffer, buf, max_len, len);
1377 (double)scanner->buffer.bytes_written/(scanner->buffer.line_size_bytes*scanner->buffer.colors),
1378 scanner->buffer.height);
1380 *len, max_len,scanner->buffer.bytes_read, scanner->buffer.image_size_bytes);
1394 struct Pieusb_Scanner *scanner = handle;
1398 if (scanner->scanning) {
1399 scanner->cancel_request = 1;
1414 /* Pieusb_Scanner *scanner = handle; */
1426 * Obtain a file-descriptor for the scanner that is readable if image data is