kopia lustrzana https://gitlab.com/sane-project/backends
				
				
				
			Adds support for total and roller counters
							rodzic
							
								
									87e9be4be5
								
							
						
					
					
						commit
						933b53608d
					
				| 
						 | 
				
			
			@ -255,7 +255,8 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
 | 
			
		|||
 | 
			
		||||
/*counters*/
 | 
			
		||||
#define R_COUNTERS_len                 0x80
 | 
			
		||||
#define get_R_COUNTERS_scans(in)       getnbyte(in + 0x04, 4)
 | 
			
		||||
#define get_R_COUNTERS_total(in)       getnbyte(in + 0x04, 4)
 | 
			
		||||
#define get_R_COUNTERS_last_srv(in)    getnbyte(in + 0x44, 4)
 | 
			
		||||
 | 
			
		||||
/*endorser unread?*/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1001,6 +1001,13 @@ attach_one (const char *device_name, int connType)
 | 
			
		|||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* enable/read the lifecycle counters */
 | 
			
		||||
  ret = init_counters (s);
 | 
			
		||||
  if (ret != SANE_STATUS_GOOD) {
 | 
			
		||||
    DBG (5, "attach_one: unable to detect lifecycle counters, continuing\n");
 | 
			
		||||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* sets SANE option 'values' to good defaults */
 | 
			
		||||
  ret = init_user (s);
 | 
			
		||||
  if (ret != SANE_STATUS_GOOD) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1929,6 +1936,29 @@ init_panel (struct scanner *s)
 | 
			
		|||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This function enables the lifecycle counters if available
 | 
			
		||||
 */
 | 
			
		||||
static SANE_Status
 | 
			
		||||
init_counters (struct scanner *s)
 | 
			
		||||
{
 | 
			
		||||
  SANE_Status ret = SANE_STATUS_GOOD;
 | 
			
		||||
 | 
			
		||||
  DBG (10, "init_counters: start\n");
 | 
			
		||||
 | 
			
		||||
  ret = read_counters(s);
 | 
			
		||||
  if(ret){
 | 
			
		||||
    DBG (5, "init_counters: disabling lifecycle counters\n");
 | 
			
		||||
    s->can_read_lifecycle_counters = 0;
 | 
			
		||||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  s->can_read_lifecycle_counters = 1;
 | 
			
		||||
  DBG (10, "init_counters: finish\n");
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * set good default user values.
 | 
			
		||||
 * struct is already initialized to 0.
 | 
			
		||||
| 
						 | 
				
			
			@ -2859,6 +2889,34 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
 | 
			
		|||
      opt->cap = SANE_CAP_INACTIVE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if(option==OPT_ROLLERCOUNTER){
 | 
			
		||||
    opt->name = "roller-counter";
 | 
			
		||||
    opt->title = "Roller Counter";
 | 
			
		||||
    opt->desc = "Scans since last roller replacement";
 | 
			
		||||
    opt->type = SANE_TYPE_INT;
 | 
			
		||||
    opt->unit = SANE_UNIT_NONE;
 | 
			
		||||
    opt->constraint_type = SANE_CONSTRAINT_NONE;
 | 
			
		||||
 | 
			
		||||
    if (s->can_read_lifecycle_counters)
 | 
			
		||||
      opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
 | 
			
		||||
    else
 | 
			
		||||
      opt->cap = SANE_CAP_INACTIVE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if(option==OPT_TOTALCOUNTER){
 | 
			
		||||
    opt->name = "total-counter";
 | 
			
		||||
    opt->title = "Total Counter";
 | 
			
		||||
    opt->desc = "Total scan count of the device";
 | 
			
		||||
    opt->type = SANE_TYPE_INT;
 | 
			
		||||
    opt->unit = SANE_UNIT_NONE;
 | 
			
		||||
    opt->constraint_type = SANE_CONSTRAINT_NONE;
 | 
			
		||||
 | 
			
		||||
    if (s->can_read_lifecycle_counters)
 | 
			
		||||
      opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
 | 
			
		||||
    else
 | 
			
		||||
      opt->cap = SANE_CAP_INACTIVE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if(option==OPT_ADF_LOADED){
 | 
			
		||||
    opt->name = "adf-loaded";
 | 
			
		||||
    opt->title = "ADF Loaded";
 | 
			
		||||
| 
						 | 
				
			
			@ -3173,6 +3231,16 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
 | 
			
		|||
          *val_p = s->panel_counter;
 | 
			
		||||
          return ret;
 | 
			
		||||
 | 
			
		||||
        case OPT_ROLLERCOUNTER:
 | 
			
		||||
          ret = read_counters(s);
 | 
			
		||||
          *val_p = s->roller_counter;
 | 
			
		||||
          return ret;
 | 
			
		||||
 | 
			
		||||
        case OPT_TOTALCOUNTER:
 | 
			
		||||
          ret = read_counters(s);
 | 
			
		||||
          *val_p = s->total_counter;
 | 
			
		||||
          return ret;
 | 
			
		||||
 | 
			
		||||
        case OPT_ADF_LOADED:
 | 
			
		||||
          ret = read_sensors(s,OPT_ADF_LOADED);
 | 
			
		||||
          *val_p = s->sensor_adf_loaded;
 | 
			
		||||
| 
						 | 
				
			
			@ -3925,6 +3993,45 @@ ssm_do (struct scanner *s)
 | 
			
		|||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static SANE_Status
 | 
			
		||||
read_counters(struct scanner *s)
 | 
			
		||||
{
 | 
			
		||||
  SANE_Status ret = SANE_STATUS_GOOD;
 | 
			
		||||
 | 
			
		||||
  unsigned char cmd[READ_len];
 | 
			
		||||
  size_t cmdLen = READ_len;
 | 
			
		||||
 | 
			
		||||
  unsigned char in[R_COUNTERS_len];
 | 
			
		||||
  size_t inLen = R_COUNTERS_len;
 | 
			
		||||
 | 
			
		||||
  DBG(10, "read_counters: start\n");
 | 
			
		||||
 | 
			
		||||
  memset(cmd,0,cmdLen);
 | 
			
		||||
  set_SCSI_opcode(cmd, READ_code);
 | 
			
		||||
  set_R_datatype_code(cmd, SR_datatype_counters);
 | 
			
		||||
  set_R_xfer_length(cmd, inLen);
 | 
			
		||||
 | 
			
		||||
  ret = do_cmd(
 | 
			
		||||
    s, 1, 0,
 | 
			
		||||
    cmd, cmdLen,
 | 
			
		||||
    NULL, 0,
 | 
			
		||||
    in, &inLen
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  if (ret == SANE_STATUS_GOOD || ret == SANE_STATUS_EOF){
 | 
			
		||||
 | 
			
		||||
    s->total_counter = get_R_COUNTERS_total(in);
 | 
			
		||||
    s->roller_counter = s->total_counter - get_R_COUNTERS_last_srv(in);
 | 
			
		||||
 | 
			
		||||
    DBG(10, "read_counters: total counter: %d roller_counter %d \n",s->total_counter,s->roller_counter);
 | 
			
		||||
    ret = SANE_STATUS_GOOD;
 | 
			
		||||
  }else{
 | 
			
		||||
    DBG(10, "read_counters: ERROR: %d\n",ret);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static SANE_Status
 | 
			
		||||
read_sensors(struct scanner *s,SANE_Int option)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,6 +60,8 @@ enum scanner_Option
 | 
			
		|||
  OPT_COUNTONLY,
 | 
			
		||||
  OPT_BYPASSMODE,
 | 
			
		||||
  OPT_COUNTER,
 | 
			
		||||
  OPT_ROLLERCOUNTER,
 | 
			
		||||
  OPT_TOTALCOUNTER,
 | 
			
		||||
  OPT_ADF_LOADED,
 | 
			
		||||
  OPT_CARD_LOADED,
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -207,6 +209,7 @@ struct scanner
 | 
			
		|||
  int can_read_sensors;
 | 
			
		||||
  int can_read_panel;
 | 
			
		||||
  int can_write_panel;
 | 
			
		||||
  int can_read_lifecycle_counters;
 | 
			
		||||
  int rgb_format;       /* meaning unknown */
 | 
			
		||||
  int padding;          /* meaning unknown */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -379,6 +382,8 @@ struct scanner
 | 
			
		|||
  int panel_counter;
 | 
			
		||||
  int sensor_adf_loaded;
 | 
			
		||||
  int sensor_card_loaded;
 | 
			
		||||
  int roller_counter;
 | 
			
		||||
  int total_counter;
 | 
			
		||||
 | 
			
		||||
  /* values which are used to track the frontend's access to sensors  */
 | 
			
		||||
  char panel_read[OPT_COUNTER - OPT_START + 1];
 | 
			
		||||
| 
						 | 
				
			
			@ -542,6 +547,7 @@ static SANE_Status init_inquire (struct scanner *s);
 | 
			
		|||
static SANE_Status init_vpd (struct scanner *s);
 | 
			
		||||
static SANE_Status init_model (struct scanner *s);
 | 
			
		||||
static SANE_Status init_panel (struct scanner *s);
 | 
			
		||||
static SANE_Status init_counters (struct scanner *s);
 | 
			
		||||
static SANE_Status init_user (struct scanner *s);
 | 
			
		||||
static SANE_Status init_options (struct scanner *s);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -589,6 +595,7 @@ static SANE_Status update_params (struct scanner *s, int calib);
 | 
			
		|||
static SANE_Status update_i_params (struct scanner *s);
 | 
			
		||||
static SANE_Status clean_params (struct scanner *s);
 | 
			
		||||
 | 
			
		||||
static SANE_Status read_counters(struct scanner *s);
 | 
			
		||||
static SANE_Status read_sensors(struct scanner *s, SANE_Int option);
 | 
			
		||||
static SANE_Status read_panel(struct scanner *s, SANE_Int option);
 | 
			
		||||
static SANE_Status send_panel(struct scanner *s);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue