diff options
Diffstat (limited to 'backend/avision.c')
| -rw-r--r-- | backend/avision.c | 168 | 
1 files changed, 136 insertions, 32 deletions
| diff --git a/backend/avision.c b/backend/avision.c index e047a7f..b81578a 100644 --- a/backend/avision.c +++ b/backend/avision.c @@ -2013,6 +2013,102 @@ static void debug_print_window_descriptor (int dbg_level, char* func,         func, window->avision.type.normal.background_lines);  } +static SANE_String_Const +avision_strdatatypecode (uint8_t datatypecode) +{ +  static char buf[80]; + +  switch (datatypecode) +    { +    case AVISION_DATATYPECODE_LIGHT_STATUS: +      return "Light status"; +    case AVISION_DATATYPECODE_POWER_SAVING_TIMER: +      return "Power saving timer"; +    case AVISION_DATATYPECODE_FIRMWARE_STATUS: +      return "Firmware status"; +    case AVISION_DATATYPECODE_FLASH_RAM_INFO: +      return "Flash RAM info"; +    case AVISION_DATATYPECODE_READ_NVRAM_DATA: +      return "Read NVRAM data"; +    case AVISION_DATATYPECODE_SEND_NVRAM_DATA: +      return "Send NVRAM data"; +    case AVISION_DATATYPECODE_FLASH_DATA: +      return "Flash data"; +    case AVISION_DATATYPECODE_UNKNOWN: +      return "Unknown"; +    case AVISION_DATATYPECODE_DETECT_ACCESSORIES: +      return "Detect accessories"; +    case AVISION_DATATYPECODE_BUTTON_STATUS: +      return "Button status"; +    case AVISION_DATATYPECODE_FILM_HOLDER_SENSE: +      return "Film holder sense"; +    case AVISION_DATATYPECODE_READ_DUPLEX_INFO: +      return "Read duplex info"; +    case AVISION_DATATYPECODE_READ_GENERAL_ABILITY_PARAM: +      return "Read general ability/parameter"; +    case AVISION_DATATYPECODE_ATTACH_TRUNCATE_HEAD: +      return "Attach/Truncate head (left) of scan length"; +    case AVISION_DATATYPECODE_ATTACH_TRUNCATE_TAIL: +      return "Attach/Truncate tail (right) of scan length"; +    case AVISION_DATATYPECODE_GET_CALIBRATION_FORMAT: +      return "Get calibration format"; +    case AVISION_DATATYPECODE_DOWNLOAD_GAMMA_TABLE: +      return "Download gamma table"; +    case AVISION_DATATYPECODE_3X3_COLOR_MATRIX: +      return "3x3 color matrix"; +    case AVISION_DATATYPECODE_ACCELERATION_TABLE: +      return "Acceleration table"; +    case AVISION_DATATYPECODE_GET_BACKGROUND_RASTER: +      return "Get background raster"; +    case AVISION_DATATYPECODE_READ_IMAGE_DATA: +      return "Read image data"; +    default: +      /* non-reentrant, but better than nothing */ +      sprintf (buf, "Unknown data type code %02X", datatypecode); +      return buf; +    } +} + +static int +avision_strcmd (SANE_String buffer, size_t size, const void* cmd) +{ +  const uint8_t* m_cmd = (const uint8_t*)cmd; +  uint8_t opc = m_cmd[0]; +  uint8_t datatypecode = m_cmd[2]; + +  switch (opc) +    { +    case AVISION_SCSI_TEST_UNIT_READY: +      return snprintf (buffer, size, "Test unit ready"); +    case AVISION_SCSI_REQUEST_SENSE: +      return snprintf (buffer, size, "Request sense"); +    case AVISION_SCSI_MEDIA_CHECK: +      return snprintf (buffer, size, "Media check"); +    case AVISION_SCSI_INQUIRY: +      return snprintf (buffer, size, "Inquiry"); +    case AVISION_SCSI_MODE_SELECT: +      return snprintf (buffer, size, "Mode select"); +    case AVISION_SCSI_RESERVE_UNIT: +      return snprintf (buffer, size, "Reserve unit"); +    case AVISION_SCSI_RELEASE_UNIT: +      return snprintf (buffer, size, "Release unit"); +    case AVISION_SCSI_SCAN: +      return snprintf (buffer, size, "Scan"); +    case AVISION_SCSI_SET_WINDOW: +      return snprintf (buffer, size, "Set window"); +    case AVISION_SCSI_READ: +      return snprintf (buffer, size, "Read (%s)", avision_strdatatypecode (datatypecode)); +    case AVISION_SCSI_SEND: +      return snprintf (buffer, size, "Send (%s)", avision_strdatatypecode (datatypecode)); +    case AVISION_SCSI_OBJECT_POSITION: +      return snprintf (buffer, size, "Object position"); +    case AVISION_SCSI_GET_DATA_STATUS: +      return snprintf (buffer, size, "Get data status"); +    default: +      return snprintf (buffer, size, "Unknown OPC %d", opc); +    } +} +  static int write_pnm_header (FILE* f, color_mode m, int depth, int width, int height)  {    int maxval = (1 << depth) - 1; @@ -2378,6 +2474,9 @@ static SANE_Status avision_cmd (Avision_Connection* av_con,  				const void* src, size_t src_size,  				void* dst, size_t* dst_size)  { +  SANE_Char strcmd[80]; +  avision_strcmd (strcmd, sizeof (strcmd), cmd); +  DBG (7, "avision_cmd: %s\n", strcmd);    if (av_con->connection_type == AV_SCSI) {      return sanei_scsi_cmd2 (av_con->scsi_fd, cmd, cmd_size,  			    src, src_size, dst, dst_size); @@ -3224,7 +3323,7 @@ wait_4_light (Avision_Scanner* s)    memset (&rcmd, 0, sizeof (rcmd));    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0xa0; /* get light status */ +  rcmd.datatypecode = AVISION_DATATYPECODE_LIGHT_STATUS; /* get light status */    set_double (rcmd.datatypequal, dev->data_dq);    set_triple (rcmd.transferlen, size); @@ -3263,7 +3362,7 @@ wait_4_light (Avision_Scanner* s)        memset (&scmd, 0, sizeof (scmd));        scmd.opc = AVISION_SCSI_SEND; -      scmd.datatypecode = 0xa0; /* send light status */ +      scmd.datatypecode = AVISION_DATATYPECODE_LIGHT_STATUS; /* send light status */        set_double (scmd.datatypequal, dev->data_dq);        set_triple (scmd.transferlen, size); @@ -3297,7 +3396,7 @@ set_power_save_time (Avision_Scanner* s, int time)    memset (&scmd, 0, sizeof (scmd));    scmd.cmd.opc = AVISION_SCSI_SEND; -  scmd.cmd.datatypecode = 0xA2; /* power-saving timer */ +  scmd.cmd.datatypecode = AVISION_DATATYPECODE_POWER_SAVING_TIMER; /* power-saving timer */    set_double (scmd.cmd.datatypequal, dev->data_dq);    set_triple (scmd.cmd.transferlen, sizeof (scmd.time) ); @@ -3327,7 +3426,7 @@ get_firmware_status (Avision_Connection* av_con)    memset (&rcmd, 0, sizeof (rcmd));    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0x90; /* firmware status */ +  rcmd.datatypecode = AVISION_DATATYPECODE_FIRMWARE_STATUS; /* firmware status */    set_double (rcmd.datatypequal, 0); /* dev->data_dq not available */    set_triple (rcmd.transferlen, size); @@ -3364,7 +3463,7 @@ get_flash_ram_info (Avision_Connection* av_con)    memset (&rcmd, 0, sizeof (rcmd));    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0x6a; /* flash ram information */ +  rcmd.datatypecode = AVISION_DATATYPECODE_FLASH_RAM_INFO; /* flash ram information */    set_double (rcmd.datatypequal, 0); /* dev->data_dq not available */    set_triple (rcmd.transferlen, size); @@ -3433,7 +3532,7 @@ get_nvram_data (Avision_Scanner* s, nvram_data* nvram)    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0x69; /* Read NVM RAM data */ +  rcmd.datatypecode = AVISION_DATATYPECODE_READ_NVRAM_DATA; /* Read NVM RAM data */    set_double (rcmd.datatypequal, 0); /* dev->data_dq not available */    set_triple (rcmd.transferlen, size); @@ -3547,7 +3646,7 @@ send_nvram_data (Avision_Connection* av_con)    memset (&scmd, 0, sizeof (scmd));    scmd.opc = AVISION_SCSI_SEND; -  scmd.datatypecode = 0x85; /* nvram data */ +  scmd.datatypecode = AVISION_DATATYPECODE_SEND_NVRAM_DATA; /* nvram data */    set_double (scmd.datatypequal, 0); /* dev->data_dq not available */    set_triple (scmd.transferlen, size); @@ -3577,7 +3676,7 @@ send_flash_ram_data (Avision_Connection* av_con)    memset (&scmd, 0, sizeof (scmd));    scmd.opc = AVISION_SCSI_SEND; -  scmd.datatypecode = 0x86; /* flash data */ +  scmd.datatypecode = AVISION_DATATYPECODE_FLASH_DATA; /* flash data */    set_double (scmd.datatypequal, 0);    set_triple (scmd.transferlen, size); @@ -3613,7 +3712,7 @@ adf_reset (Avision_Scanner* s)      memset (&scmd, 0, sizeof (scmd));      memset (&payload, 0, sizeof (payload));      scmd.opc = AVISION_SCSI_SEND; -    scmd.datatypecode = 0xD0; /* unknown */ +    scmd.datatypecode = AVISION_DATATYPECODE_UNKNOWN; /* unknown */      set_double (scmd.datatypequal, 0);      size = 2;      set_triple (scmd.transferlen, size); @@ -3629,7 +3728,7 @@ adf_reset (Avision_Scanner* s)      memset (&rcmd, 0, sizeof (rcmd));      memset (&payload, 0, sizeof (payload));      rcmd.opc = AVISION_SCSI_READ; -    rcmd.datatypecode = 0x69; /* Read NVRAM data */ +    rcmd.datatypecode = AVISION_DATATYPECODE_READ_NVRAM_DATA; /* Read NVRAM data */      set_double (rcmd.datatypequal, dev->data_dq);      size = 4 - i; /* read 3 bytes the first time, 4 the second */      set_triple (rcmd.transferlen, size); @@ -3668,7 +3767,7 @@ get_accessories_info (Avision_Scanner* s)    memset (&rcmd, 0, sizeof (rcmd));    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0x64; /* detect accessories */ +  rcmd.datatypecode = AVISION_DATATYPECODE_DETECT_ACCESSORIES; /* detect accessories */    set_double (rcmd.datatypequal, dev->data_dq);    set_triple (rcmd.transferlen, size); @@ -3825,7 +3924,7 @@ get_button_status (Avision_Scanner* s)        memset (&rcmd, 0, sizeof (rcmd));        rcmd.opc = AVISION_SCSI_READ; -      rcmd.datatypecode = 0xA1; /* button status */ +      rcmd.datatypecode = AVISION_DATATYPECODE_BUTTON_STATUS; /* button status */        set_double (rcmd.datatypequal, dev->data_dq);        set_triple (rcmd.transferlen, size); @@ -3927,7 +4026,7 @@ get_button_status (Avision_Scanner* s)  	    memset (&scmd, 0, sizeof (scmd));  	    scmd.opc = AVISION_SCSI_SEND; -	    scmd.datatypecode = 0xA1; /* button control */ +	    scmd.datatypecode = AVISION_DATATYPECODE_BUTTON_STATUS; /* button control */  	    set_double (scmd.datatypequal, dev->data_dq);  	    set_triple (scmd.transferlen, size); @@ -3984,7 +4083,7 @@ get_frame_info (Avision_Scanner* s)    memset (&rcmd, 0, sizeof (rcmd));    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0x87; /* film holder sense */ +  rcmd.datatypecode = AVISION_DATATYPECODE_FILM_HOLDER_SENSE; /* film holder sense */    set_double (rcmd.datatypequal, dev->data_dq);    set_triple (rcmd.transferlen, size); @@ -4051,7 +4150,7 @@ get_duplex_info (Avision_Scanner* s)    memset (&rcmd, 0, sizeof (rcmd));    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0xB1; /* read duplex info */ +  rcmd.datatypecode = AVISION_DATATYPECODE_READ_DUPLEX_INFO; /* read duplex info */    set_double (rcmd.datatypequal, dev->data_dq);    set_triple (rcmd.transferlen, size); @@ -4117,7 +4216,7 @@ set_frame (Avision_Scanner* s, SANE_Word frame)    memset (&scmd, 0, sizeof (scmd));    scmd.cmd.opc = AVISION_SCSI_SEND; -  scmd.cmd.datatypecode = 0x87; /* send film holder "sense" */ +  scmd.cmd.datatypecode = AVISION_DATATYPECODE_FILM_HOLDER_SENSE; /* send film holder "sense" */    set_double (scmd.cmd.datatypequal, dev->data_dq);    set_triple (scmd.cmd.transferlen, sizeof (scmd.data) ); @@ -4817,7 +4916,7 @@ get_tune_scan_length (Avision_Scanner* s)    size = sizeof (payload);    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0xD2; /* Read General Ability/Parameter */ +  rcmd.datatypecode = AVISION_DATATYPECODE_READ_GENERAL_ABILITY_PARAM; /* Read General Ability/Parameter */    for (i = 1; i <= 8; ++i) {      memset (&payload, 0, sizeof (payload)); @@ -4860,7 +4959,7 @@ send_tune_scan_length (Avision_Scanner* s)    size = sizeof (payload);    scmd.opc = AVISION_SCSI_SEND; -  scmd.datatypecode = 0x96; /* Attach/Truncate head(left) of scan length */ +  scmd.datatypecode = AVISION_DATATYPECODE_ATTACH_TRUNCATE_HEAD; /* Attach/Truncate head(left) of scan length */    set_triple (scmd.transferlen, size);    /* the SPEC says optical DPI, but real world measuring suggests it is 1200 @@ -4907,7 +5006,7 @@ send_tune_scan_length (Avision_Scanner* s)      return status;    } -  scmd.datatypecode = 0x95; /* Attach/Truncate tail(right) of scan length */ +  scmd.datatypecode = AVISION_DATATYPECODE_ATTACH_TRUNCATE_TAIL; /* Attach/Truncate tail(right) of scan length */    bottom = dpi * SANE_UNFIX (s->val[OPT_OVERSCAN_BOTTOM].w) / MM_PER_INCH;    DBG (3, "send_tune_scan_length: bottom: %d\n", bottom); @@ -5055,7 +5154,7 @@ get_calib_format (Avision_Scanner* s, struct calibration_format* format)    memset (&rcmd, 0, sizeof (rcmd));    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0x60; /* get calibration format */ +  rcmd.datatypecode = AVISION_DATATYPECODE_GET_CALIBRATION_FORMAT; /* get calibration format */    set_double (rcmd.datatypequal, s->hw->data_dq);    set_triple (rcmd.transferlen, size); @@ -5720,7 +5819,7 @@ send_gamma (Avision_Scanner* s)    memset (&scmd, 0, sizeof (scmd) );    scmd.opc = AVISION_SCSI_SEND; -  scmd.datatypecode = 0x81; /* 0x81 for download gamma table */ +  scmd.datatypecode = AVISION_DATATYPECODE_DOWNLOAD_GAMMA_TABLE; /* 0x81 for download gamma table */    set_triple (scmd.transferlen, gamma_table_raw_size);    for (color = 0; color < 3 && status == SANE_STATUS_GOOD; ++ color) @@ -5872,7 +5971,7 @@ send_3x3_matrix (Avision_Scanner* s)      }    cmd.scmd.opc = AVISION_SCSI_SEND; -  cmd.scmd.datatypecode = 0x83; /* 0x83 for 3x3 color matrix */ +  cmd.scmd.datatypecode = AVISION_DATATYPECODE_3X3_COLOR_MATRIX; /* 0x83 for 3x3 color matrix */    set_triple (cmd.scmd.transferlen, sizeof (struct matrix_3x3));    if (1) { @@ -5903,7 +6002,7 @@ get_acceleration_info (Avision_Scanner* s, struct acceleration_info* info)    memset (&rcmd, 0, sizeof (rcmd));    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0x6c; /* get acceleration information */ +  rcmd.datatypecode = AVISION_DATATYPECODE_ACCELERATION_TABLE; /* get acceleration information */    set_double (rcmd.datatypequal, s->hw->data_dq);    set_triple (rcmd.transferlen, size); @@ -5967,7 +6066,7 @@ send_acceleration_table (Avision_Scanner* s)      memset (&scmd, 0x00, sizeof (scmd));      scmd.opc = AVISION_SCSI_SEND; -    scmd.datatypecode = 0x6c; /* send acceleration table */ +    scmd.datatypecode = AVISION_DATATYPECODE_ACCELERATION_TABLE; /* send acceleration table */      set_double (scmd.datatypequal, table);      set_triple (scmd.transferlen, accel_info.total_steps); @@ -6393,7 +6492,7 @@ get_background_raster (Avision_Scanner* s)    memset (&rcmd, 0, sizeof (rcmd));    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0x9b; /* get background raster */ +  rcmd.datatypecode = AVISION_DATATYPECODE_GET_BACKGROUND_RASTER; /* get background raster */    set_double (rcmd.datatypequal, s->hw->data_dq);    /* Ok, well - this part is very messy. The AV122 and DM152 appear to @@ -6792,6 +6891,11 @@ do_cancel (Avision_Scanner* s)        DBG (1, "do_cancel: release_unit failed\n");    } +  DBG (4, "FORCE RELEASE UNIT ON CANCEL\n"); +  status = release_unit (s, 1); +  if (status != SANE_STATUS_GOOD) +    DBG (1, "do_cancel: release_unit failed\n"); +    return SANE_STATUS_CANCELLED;  } @@ -6806,7 +6910,7 @@ read_data (Avision_Scanner* s, SANE_Byte* buf, size_t* count)    memset (&rcmd, 0, sizeof (rcmd));    rcmd.opc = AVISION_SCSI_READ; -  rcmd.datatypecode = 0x00; /* read image data */ +  rcmd.datatypecode = AVISION_DATATYPECODE_READ_IMAGE_DATA; /* read image data */    set_double (rcmd.datatypequal, s->hw->data_dq);    set_triple (rcmd.transferlen, *count); @@ -8081,15 +8185,15 @@ reader_process (void *data)  	  exit_status =  SANE_STATUS_CANCELLED;        } -      status = release_unit (s, 0); -      if (status != SANE_STATUS_GOOD) -	DBG (1, "reader_process: release_unit failed\n"); -        if (dev->inquiry_new_protocol && dev->scanner_type == AV_FILM) {  	status = object_position (s, AVISION_SCSI_OP_GO_HOME);  	if (status != SANE_STATUS_GOOD)  	  DBG (1, "reader_process: object position go-home failed!\n");        } + +      status = release_unit (s, 0); +      if (status != SANE_STATUS_GOOD) +	DBG (1, "reader_process: release_unit failed\n");      }    if ((dev->hw->feature_type & AV_ADF_FLIPPING_DUPLEX) && s->source_mode == AV_ADF_DUPLEX && s->page % 2) { @@ -8347,13 +8451,13 @@ sane_init (SANE_Int* version_code, SANE_Auth_Callback authorize)  #endif    DBG (3, "sane_init:(Version: %i.%i Build: %i)\n", -       SANE_CURRENT_MAJOR, V_MINOR, BACKEND_BUILD); +       SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BACKEND_BUILD);    /* must come first */    sanei_thread_init ();    if (version_code) -    *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BACKEND_BUILD); +    *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BACKEND_BUILD);    sane_reload_devices (); | 
