Lines Matching refs:dev

137 static void st400_init_options( ST400_Device *dev );
138 static SANE_Status st400_set_window( ST400_Device *dev );
142 static void st400_reset_options( ST400_Device *dev );
303 st400_set_window( ST400_Device *dev )
337 xoff = (11L * dev->val[OPT_RESOLUTION]) / 100;
339 th = (double)maxval(dev->model->bits) * SANE_UNFIX(dev->val[OPT_THRESHOLD]) / 100.0;
342 set16(scsi_cmd.x_res, (unsigned short)dev->val[OPT_RESOLUTION]);
343 set16(scsi_cmd.y_res, (unsigned short)dev->val[OPT_RESOLUTION]);
344 set16(scsi_cmd.x_ul, dev->x + xoff);
345 set16(scsi_cmd.y_ul, dev->wy + yoff);
346 set16(scsi_cmd.width, dev->w);
347 set16(scsi_cmd.height, dev->wh);
349 scsi_cmd.halftone = (dev->val[OPT_DEPTH] == 1) ? 0 : 2;
350 scsi_cmd.bitsperpixel = dev->val[OPT_DEPTH];
352 DBG(DSCSI, "SCSI: sending SET_WINDOW (x=%hu y=%hu w=%hu h=%hu wy=%hu wh=%hu th=%d\n", dev->x, dev->y, dev->w, dev->h, dev->wy, dev->wh, (int)th);
353 status = sanei_scsi_cmd(dev->fd, &scsi_cmd, sizeof(scsi_cmd), 0, 0);
377 st400_fill_scanner_buffer( ST400_Device *dev )
381 DBG(DCODE, "st400_fill_scanner_buffer(%p)\n", (void *) dev);
383 if( dev->lines_to_read == 0 )
384 dev->status.eof = 1;
385 if( dev->status.eof )
388 dev->wh = dev->model->bufsize / dev->params.bytes_per_line;
389 if( dev->wh > dev->lines_to_read )
390 dev->wh = dev->lines_to_read;
391 DBG(DVAR, "dev->wh = %hu\n", dev->wh);
393 status = st400_set_window(dev);
397 status = st400_start_scan(dev->fd);
401 dev->wy += dev->wh;
402 dev->lines_to_read -= dev->wh;
403 dev->bytes_in_scanner = dev->wh * dev->params.bytes_per_line;
409 st400_fill_backend_buffer( ST400_Device *dev )
414 DBG(DCODE, "st400_fill_backend_buffer(%p)\n", (void *) dev);
416 if( dev->bytes_in_scanner == 0 ) {
417 status = st400_fill_scanner_buffer(dev);
422 r = min(dev->bufsize, dev->bytes_in_scanner);
423 status = st400_read10(dev->fd, dev->buffer, &r);
425 dev->bufp = dev->buffer;
426 dev->bytes_in_buffer = r;
427 dev->bytes_in_scanner -= r;
430 dev->status.eof = 1;
439 /* ST400_Device *dev = arg; */
489 ST400_Device *dev;
498 for( dev = st400_devices; dev != NULL; dev = dev->next ) {
499 if( strcmp(dev->sane.name, devname) == 0 ) {
501 *devP = dev;
507 dev = calloc(1, sizeof(*dev));
508 if( !dev )
510 DBG(DCODE, "st400_attach: new device struct at %p\n", (void *) dev);
512 status = sanei_scsi_open(devname, &fd, st400_sense_handler, dev);
520 free(dev);
525 dev->sane.name = strdup(devname);
526 if( !dev->sane.name ) {
527 free(dev);
530 dev->sane.vendor = model->sane_vendor;
531 dev->sane.model = model->sane_model;
532 dev->sane.type = model->sane_type;
533 dev->status.open = 0;
534 dev->status.scanning = 0;
535 dev->status.eof = 0;
536 dev->fd = -1;
537 dev->buffer = NULL;
538 dev->model = model;
540 st400_init_options(dev);
544 dev->next = st400_devices;
545 st400_devices = dev;
550 *devP = dev;
727 ST400_Device *dev;
731 while( (dev = st400_devices) != NULL ) {
732 st400_devices = dev->next;
734 sane_close(dev);
735 free((char *)(dev->sane.name));
736 free(dev);
750 ST400_Device *dev;
765 dev = st400_devices;
767 st400_device_array[i] = &dev->sane;
768 dev = dev->next;
783 ST400_Device *dev;
790 status = st400_attach(devicename, &dev);
795 dev = st400_devices;
797 if( !dev )
800 if( dev->status.open )
803 dev->status.open = 1;
804 st400_reset_options(dev);
805 *handleP = (SANE_Handle)dev;
814 ST400_Device *dev = handle;
818 if( dev->status.open ) {
819 sane_cancel(dev);
820 dev->status.open = 0;
829 st400_reset_options( ST400_Device *dev )
831 DBG(DCODE, "st400_reset_options(%p)\n", (void *) dev);
833 dev->val[OPT_NUM_OPTS] = NUM_OPTIONS;
834 dev->val[OPT_RESOLUTION] = dev->opt[OPT_RESOLUTION].constraint.word_list[1];
835 dev->val[OPT_DEPTH] = dev->opt[OPT_DEPTH].constraint.word_list[1];
836 dev->val[OPT_THRESHOLD] = SANE_FIX(50.0);
837 dev->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE;
838 dev->val[OPT_TL_X] = SANE_FIX(0.0);
839 dev->val[OPT_TL_Y] = SANE_FIX(0.0);
840 dev->val[OPT_BR_X] = SANE_FIX(0.0);
841 dev->val[OPT_BR_Y] = SANE_FIX(0.0);
843 if( dev->model->dpi_list )
844 dev->opt[OPT_RESOLUTION].constraint.word_list = dev->model->dpi_list;
848 st400_init_options( ST400_Device *dev )
862 DBG(DCODE, "st400_init_options(%p)\n", (void *)dev);
864 dev->opt[OPT_NUM_OPTS].name = SANE_NAME_NUM_OPTIONS;
865 dev->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;
866 dev->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;
867 dev->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;
868 dev->opt[OPT_NUM_OPTS].unit = SANE_UNIT_NONE;
869 dev->opt[OPT_NUM_OPTS].size = sizeof(SANE_Word);
870 dev->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;
871 dev->opt[OPT_NUM_OPTS].constraint_type = SANE_CONSTRAINT_NONE;
873 dev->opt[OPT_MODE_GROUP].title= "Scan Mode";
874 dev->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP;
876 dev->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
877 dev->opt[OPT_RESOLUTION].title= SANE_TITLE_SCAN_RESOLUTION;
878 dev->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
879 dev->opt[OPT_RESOLUTION].type = SANE_TYPE_INT;
880 dev->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI;
881 dev->opt[OPT_RESOLUTION].size = sizeof(SANE_Word);
882 dev->opt[OPT_RESOLUTION].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT;
883 dev->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
884 dev->opt[OPT_RESOLUTION].constraint.word_list = dpi_list;
886 dev->opt[OPT_DEPTH].name = SANE_NAME_BIT_DEPTH;
887 dev->opt[OPT_DEPTH].title = SANE_TITLE_BIT_DEPTH;
888 dev->opt[OPT_DEPTH].desc = SANE_DESC_BIT_DEPTH;
889 dev->opt[OPT_DEPTH].type = SANE_TYPE_INT;
890 dev->opt[OPT_DEPTH].unit = SANE_UNIT_BIT;
891 dev->opt[OPT_DEPTH].size = sizeof(SANE_Word);
892 dev->opt[OPT_DEPTH].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT;
893 dev->opt[OPT_DEPTH].constraint_type = SANE_CONSTRAINT_WORD_LIST;
894 dev->opt[OPT_DEPTH].constraint.word_list = depth_list;
896 dev->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD;
897 dev->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD;
898 dev->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD;
899 dev->opt[OPT_THRESHOLD].type = SANE_TYPE_FIXED;
900 dev->opt[OPT_THRESHOLD].unit = SANE_UNIT_PERCENT;
901 dev->opt[OPT_THRESHOLD].size = sizeof(SANE_Word);
902 dev->opt[OPT_THRESHOLD].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT;
903 dev->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE;
904 dev->opt[OPT_THRESHOLD].constraint.range = &thres_range;
906 dev->opt[OPT_GEOMETRY_GROUP].title= "Geometry";
907 dev->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP;
909 dev->opt[OPT_TL_X].name = SANE_NAME_SCAN_TL_X;
910 dev->opt[OPT_TL_X].title = SANE_TITLE_SCAN_TL_X;
911 dev->opt[OPT_TL_X].desc = SANE_DESC_SCAN_TL_X;
912 dev->opt[OPT_TL_X].type = SANE_TYPE_FIXED;
913 dev->opt[OPT_TL_X].unit = SANE_UNIT_MM;
914 dev->opt[OPT_TL_X].size = sizeof(SANE_Word);
915 dev->opt[OPT_TL_X].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT;
916 dev->opt[OPT_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
917 dev->opt[OPT_TL_X].constraint.range = &x_range;
919 dev->opt[OPT_TL_Y].name = SANE_NAME_SCAN_TL_Y;
920 dev->opt[OPT_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
921 dev->opt[OPT_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
922 dev->opt[OPT_TL_Y].type = SANE_TYPE_FIXED;
923 dev->opt[OPT_TL_Y].unit = SANE_UNIT_MM;
924 dev->opt[OPT_TL_Y].size = sizeof(SANE_Word);
925 dev->opt[OPT_TL_Y].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT;
926 dev->opt[OPT_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
927 dev->opt[OPT_TL_Y].constraint.range = &y_range;
929 dev->opt[OPT_BR_X].name = SANE_NAME_SCAN_BR_X;
930 dev->opt[OPT_BR_X].title = SANE_TITLE_SCAN_BR_X;
931 dev->opt[OPT_BR_X].desc = SANE_DESC_SCAN_BR_X;
932 dev->opt[OPT_BR_X].type = SANE_TYPE_FIXED;
933 dev->opt[OPT_BR_X].unit = SANE_UNIT_MM;
934 dev->opt[OPT_BR_X].size = sizeof(SANE_Word);
935 dev->opt[OPT_BR_X].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT;
936 dev->opt[OPT_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
937 dev->opt[OPT_BR_X].constraint.range = &x_range;
939 dev->opt[OPT_BR_Y].name = SANE_NAME_SCAN_BR_Y;
940 dev->opt[OPT_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
941 dev->opt[OPT_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
942 dev->opt[OPT_BR_Y].type = SANE_TYPE_FIXED;
943 dev->opt[OPT_BR_Y].unit = SANE_UNIT_MM;
944 dev->opt[OPT_BR_Y].size = sizeof(SANE_Word);
945 dev->opt[OPT_BR_Y].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT;
946 dev->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
947 dev->opt[OPT_BR_Y].constraint.range = &y_range;
949 st400_reset_options(dev);
955 ST400_Device *dev = handle;
959 if( dev->status.open && optnum >= 0 && optnum < NUM_OPTIONS )
960 return &dev->opt[optnum];
969 ST400_Device *dev = handle;
977 if( !dev->status.open )
979 if( dev->status.scanning )
988 DBG(DOPT, "getting option %d (value=%d)\n", (int)optnum, (int)dev->val[optnum]);
999 *(SANE_Word *)valP = dev->val[optnum];
1007 if( !SANE_OPTION_IS_SETTABLE(dev->opt[optnum].cap) )
1009 status = sanei_constrain_value(&dev->opt[optnum], valP, infoP);
1018 dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
1020 dev->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE;
1033 dev->val[optnum] = *(SANE_Word *)valP;
1055 ST400_Device *dev = handle;
1059 if( !dev->status.open )
1062 if( !dev->status.scanning ) {
1065 dev->params.format = SANE_FRAME_GRAY;
1066 dev->params.last_frame = SANE_TRUE;
1067 dev->params.lines = 0;
1068 dev->params.depth = dev->val[OPT_DEPTH];
1070 width = SANE_UNFIX(dev->val[OPT_BR_X] - dev->val[OPT_TL_X]);
1071 height = SANE_UNFIX(dev->val[OPT_BR_Y] - dev->val[OPT_TL_Y]);
1072 dpi = dev->val[OPT_RESOLUTION];
1079 dev->params.pixels_per_line = width * dots_per_mm + 0.5;
1080 dev->params.lines = height * dots_per_mm + 0.5;
1082 if( dev->params.depth == 1 ) {
1087 dev->params.pixels_per_line += 7;
1088 dev->params.pixels_per_line &= ~7;
1090 /*dev->params.bytes_per_line = (dev->params.pixels_per_line + 7)/8;*/
1091 dev->params.bytes_per_line = dev->params.pixels_per_line/8;
1094 dev->params.bytes_per_line = dev->params.pixels_per_line;
1096 dev->x = SANE_UNFIX(dev->val[OPT_TL_X]) * dots_per_mm + 0.5;
1097 dev->y = SANE_UNFIX(dev->val[OPT_TL_Y]) * dots_per_mm + 0.5;
1098 dev->w = dev->params.pixels_per_line;
1099 dev->h = dev->params.lines;
1101 DBG(DVAR, "parameters: bpl=%d, x=%hu, y=%hu, w=%hu, h=%hu\n", (int)dev->params.bytes_per_line, dev->x, dev->y, dev->w, dev->h);
1106 *paramsP = dev->params;
1114 ST400_Device *dev = handle;
1119 if( !dev->status.open )
1121 if( dev->status.scanning )
1124 status = sane_get_parameters(dev, NULL);
1128 if( !dev->buffer ) {
1130 dev->bufsize = min(st400_maxread, (unsigned int) sanei_scsi_max_request_size);
1132 if( dev->model->maxread > 0 )
1133 dev->bufsize = min(dev->model->maxread, (unsigned int) sanei_scsi_max_request_size);
1135 dev->bufsize = sanei_scsi_max_request_size;
1136 DBG(DVAR, "allocating %lu bytes buffer\n", (u_long)dev->bufsize);
1137 dev->buffer = malloc(dev->bufsize);
1138 if( !dev->buffer )
1141 dev->bufp = dev->buffer;
1142 dev->bytes_in_buffer = 0;
1144 if( dev->fd < 0 ) {
1145 status = sanei_scsi_open(dev->sane.name, &dev->fd, st400_sense_handler, dev);
1150 dev->status.eof = 0;
1152 status = st400_wait_ready(dev->fd);
1156 status = st400_reserve(dev->fd);
1161 status = st400_light_on(dev->fd);
1167 dev->wy = dev->y;
1168 dev->lines_to_read = dev->h;
1169 dev->bytes_in_scanner = 0;
1171 status = st400_fill_scanner_buffer(dev);
1176 dev->status.scanning = 1;
1181 st400_light_off(dev->fd);
1183 st400_release(dev->fd);
1185 sanei_scsi_close(dev->fd);
1187 dev->fd = -1;
1194 ST400_Device *dev = handle;
1198 if( dev->status.scanning ) {
1200 st400_stop_scan(dev->fd);
1203 st400_light_off(dev->fd);
1204 st400_release(dev->fd);
1205 sanei_scsi_close(dev->fd);
1206 dev->status.scanning = 0;
1207 dev->fd = -1;
1209 if( dev->buffer ) {
1210 free(dev->buffer);
1211 dev->buffer = NULL;
1219 ST400_Device *dev = handle;
1227 if( !dev->status.scanning )
1229 if( dev->status.eof )
1234 if( dev->bytes_in_buffer == 0 ) {
1235 status = st400_fill_backend_buffer(dev);
1244 r = min((SANE_Int) dev->bytes_in_buffer, maxlen);
1246 if( dev->val[OPT_DEPTH] == 1 || dev->model->bits == 8 ) {
1252 *buf++ = ~(*dev->bufp++);
1268 mv = (SANE_Byte)maxval(dev->model->bits);
1272 val = mv - *dev->bufp++;
1273 val <<= (8 - dev->model->bits);
1274 val += (val >> dev->model->bits);
1279 dev->bytes_in_buffer -= r;