kopia lustrzana https://gitlab.com/sane-project/backends
Merge branch 'genesys-refactor-model-list' into 'master'
genesys: Refactor model list See merge request sane-project/backends!103merge-requests/107/head
commit
153602308c
|
@ -4914,19 +4914,10 @@ calc_parameters (Genesys_Scanner * s)
|
|||
}
|
||||
|
||||
|
||||
static SANE_Status
|
||||
create_bpp_list (Genesys_Scanner * s, SANE_Int * bpp)
|
||||
static void create_bpp_list (Genesys_Scanner * s, const std::vector<unsigned>& bpp)
|
||||
{
|
||||
int count;
|
||||
|
||||
for (count = 0; bpp[count] != 0; count++)
|
||||
;
|
||||
s->bpp_list[0] = count;
|
||||
for (count = 0; bpp[count] != 0; count++)
|
||||
{
|
||||
s->bpp_list[s->bpp_list[0] - count] = bpp[count];
|
||||
}
|
||||
return SANE_STATUS_GOOD;
|
||||
s->bpp_list[0] = bpp.size();
|
||||
std::reverse_copy(bpp.begin(), bpp.end(), s->bpp_list + 1);
|
||||
}
|
||||
|
||||
/** @brief this function initialize a gamma vector based on the ASIC:
|
||||
|
@ -5087,7 +5078,7 @@ static SANE_Status
|
|||
init_options (Genesys_Scanner * s)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
SANE_Int option, count, min_dpi;
|
||||
SANE_Int option;
|
||||
SANE_Status status = SANE_STATUS_GOOD;
|
||||
SANE_Word *dpi_list;
|
||||
Genesys_Model *model = s->dev->model;
|
||||
|
@ -5170,20 +5161,15 @@ init_options (Genesys_Scanner * s)
|
|||
DISABLE (OPT_BIT_DEPTH);
|
||||
|
||||
/* resolution */
|
||||
min_dpi=200000;
|
||||
for (count = 0; model->xdpi_values[count] != 0; count++)
|
||||
{
|
||||
if(model->xdpi_values[count]<min_dpi)
|
||||
{
|
||||
min_dpi=model->xdpi_values[count];
|
||||
}
|
||||
unsigned min_dpi = *std::min_element(model->xdpi_values.begin(), model->xdpi_values.end());
|
||||
|
||||
dpi_list = (SANE_Word*) malloc((model->xdpi_values.size() + 1) * sizeof(SANE_Word));
|
||||
if (!dpi_list) {
|
||||
return SANE_STATUS_NO_MEM;
|
||||
}
|
||||
dpi_list = (SANE_Word*) malloc((count + 1) * sizeof(SANE_Word));
|
||||
if (!dpi_list)
|
||||
return SANE_STATUS_NO_MEM;
|
||||
dpi_list[0] = count;
|
||||
for (count = 0; model->xdpi_values[count] != 0; count++)
|
||||
dpi_list[count + 1] = model->xdpi_values[count];
|
||||
dpi_list[0] = model->xdpi_values.size();
|
||||
std::copy(model->xdpi_values.begin(), model->xdpi_values.end(), dpi_list + 1);
|
||||
|
||||
s->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
|
||||
s->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
|
||||
s->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
|
||||
|
@ -5712,7 +5698,6 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
|
|||
DBG_HELPER_ARGS(dbg, "devp %s NULL, may_wait = %d", devp ? "!=" : "==", may_wait);
|
||||
|
||||
Genesys_Device *dev = 0;
|
||||
unsigned int i;
|
||||
|
||||
if (devp)
|
||||
*devp = 0;
|
||||
|
@ -5754,18 +5739,17 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
|
|||
}
|
||||
}
|
||||
|
||||
bool found_dev = false;
|
||||
for (i = 0; i < MAX_SCANNERS && genesys_usb_device_list[i].model != 0; i++)
|
||||
{
|
||||
if (vendor == genesys_usb_device_list[i].vendor &&
|
||||
product == genesys_usb_device_list[i].product)
|
||||
{
|
||||
found_dev = true;
|
||||
Genesys_USB_Device_Entry* found_usb_dev = nullptr;
|
||||
for (auto& usb_dev : *s_usb_devices) {
|
||||
if (usb_dev.vendor == static_cast<unsigned>(vendor) &&
|
||||
usb_dev.product == static_cast<unsigned>(product))
|
||||
{
|
||||
found_usb_dev = &usb_dev;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_dev) {
|
||||
if (found_usb_dev == nullptr) {
|
||||
DBG(DBG_error, "%s: vendor 0x%xd product 0x%xd is not supported by this backend\n", __func__,
|
||||
vendor, product);
|
||||
return SANE_STATUS_INVAL;
|
||||
|
@ -5780,9 +5764,9 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
|
|||
dev = &s_devices->back();
|
||||
dev->file_name = new_devname;
|
||||
|
||||
dev->model = genesys_usb_device_list[i].model;
|
||||
dev->vendorId = genesys_usb_device_list[i].vendor;
|
||||
dev->productId = genesys_usb_device_list[i].product;
|
||||
dev->model = &found_usb_dev->model;
|
||||
dev->vendorId = found_usb_dev->vendor;
|
||||
dev->productId = found_usb_dev->product;
|
||||
dev->usb_mode = 0; /* i.e. unset */
|
||||
dev->already_initialized = SANE_FALSE;
|
||||
|
||||
|
@ -6075,6 +6059,8 @@ sane_init_impl(SANE_Int * version_code, SANE_Auth_Callback authorize)
|
|||
s_sane_devices_ptrs.init();
|
||||
genesys_init_sensor_tables();
|
||||
genesys_init_frontend_tables();
|
||||
genesys_init_usb_device_tables();
|
||||
|
||||
|
||||
DBG(DBG_info, "%s: %s endian machine\n", __func__,
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
|
|
Plik diff jest za duży
Load Diff
|
@ -4670,7 +4670,7 @@ gl841_search_strip(Genesys_Device * dev, const Genesys_Sensor& sensor,
|
|||
SANE_Status status = SANE_STATUS_GOOD;
|
||||
Genesys_Register_Set local_reg;
|
||||
size_t size;
|
||||
int steps, depth, dpi;
|
||||
int steps, depth;
|
||||
unsigned int pass, count, found, x, y, length;
|
||||
char title[80];
|
||||
GenesysRegister *r;
|
||||
|
@ -4694,13 +4694,9 @@ gl841_search_strip(Genesys_Device * dev, const Genesys_Sensor& sensor,
|
|||
return status;
|
||||
}
|
||||
|
||||
/* set up for a gray scan at lowest dpi */
|
||||
dpi = 9600;
|
||||
for (x = 0; x < MAX_RESOLUTIONS; x++)
|
||||
{
|
||||
if (dev->model->xdpi_values[x] > 0 && dev->model->xdpi_values[x] < dpi)
|
||||
dpi = dev->model->xdpi_values[x];
|
||||
}
|
||||
// set up for a gray scan at lowest dpi
|
||||
unsigned dpi = *std::min_element(dev->model->xdpi_values.begin(),
|
||||
dev->model->xdpi_values.end());
|
||||
channels = 1;
|
||||
|
||||
/* shading calibation is done with dev->motor.base_ydpi */
|
||||
|
|
|
@ -2051,7 +2051,7 @@ static void gl843_set_xpa_lamp_power(Genesys_Device *dev, bool set)
|
|||
DBG_HELPER(dbg);
|
||||
|
||||
struct LampSettings {
|
||||
int model_id;
|
||||
unsigned model_id;
|
||||
ScanMethod scan_method;
|
||||
GenesysRegisterSettingSet regs_on;
|
||||
GenesysRegisterSettingSet regs_off;
|
||||
|
|
|
@ -2548,7 +2548,7 @@ gl846_search_strip(Genesys_Device * dev, const Genesys_Sensor& sensor,
|
|||
SANE_Status status = SANE_STATUS_GOOD;
|
||||
Genesys_Register_Set local_reg;
|
||||
size_t size;
|
||||
int steps, depth, dpi;
|
||||
int steps, depth;
|
||||
unsigned int pass, count, found, x, y;
|
||||
char title[80];
|
||||
GenesysRegister *r;
|
||||
|
@ -2562,13 +2562,9 @@ gl846_search_strip(Genesys_Device * dev, const Genesys_Sensor& sensor,
|
|||
return status;
|
||||
}
|
||||
|
||||
/* set up for a gray scan at lowest dpi */
|
||||
dpi = 9600;
|
||||
for (x = 0; x < MAX_RESOLUTIONS; x++)
|
||||
{
|
||||
if (dev->model->xdpi_values[x] > 0 && dev->model->xdpi_values[x] < dpi)
|
||||
dpi = dev->model->xdpi_values[x];
|
||||
}
|
||||
// set up for a gray scan at lowest dpi
|
||||
unsigned dpi = *std::min_element(dev->model->xdpi_values.begin(),
|
||||
dev->model->xdpi_values.end());
|
||||
channels = 1;
|
||||
/* 10 MM */
|
||||
/* lines = (10 * dpi) / MM_PER_INCH; */
|
||||
|
|
|
@ -2642,7 +2642,7 @@ gl847_search_strip (Genesys_Device * dev, const Genesys_Sensor& sensor,
|
|||
SANE_Status status = SANE_STATUS_GOOD;
|
||||
Genesys_Register_Set local_reg;
|
||||
size_t size;
|
||||
int steps, depth, dpi;
|
||||
int steps, depth;
|
||||
unsigned int pass, count, found, x, y;
|
||||
char title[80];
|
||||
GenesysRegister *r;
|
||||
|
@ -2655,13 +2655,9 @@ gl847_search_strip (Genesys_Device * dev, const Genesys_Sensor& sensor,
|
|||
return status;
|
||||
}
|
||||
|
||||
/* set up for a gray scan at lowest dpi */
|
||||
dpi = 9600;
|
||||
for (x = 0; x < MAX_RESOLUTIONS; x++)
|
||||
{
|
||||
if (dev->model->xdpi_values[x] > 0 && dev->model->xdpi_values[x] < dpi)
|
||||
dpi = dev->model->xdpi_values[x];
|
||||
}
|
||||
// set up for a gray scan at lowest dpi
|
||||
unsigned dpi = *std::min_element(dev->model->xdpi_values.begin(),
|
||||
dev->model->xdpi_values.end());
|
||||
channels = 1;
|
||||
/* 10 MM */
|
||||
/* lines = (10 * dpi) / MM_PER_INCH; */
|
||||
|
|
|
@ -1566,18 +1566,7 @@ Motor_Profile *profile;
|
|||
*/
|
||||
int sanei_genesys_get_lowest_ydpi(Genesys_Device *dev)
|
||||
{
|
||||
int min=20000;
|
||||
int i=0;
|
||||
|
||||
while(dev->model->ydpi_values[i]!=0)
|
||||
{
|
||||
if(dev->model->ydpi_values[i]<min)
|
||||
{
|
||||
min=dev->model->ydpi_values[i];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return min;
|
||||
return *std::min_element(dev->model->ydpi_values.begin(), dev->model->ydpi_values.end());
|
||||
}
|
||||
|
||||
/** @brief returns the lowest possible dpi for the device
|
||||
|
@ -1587,27 +1576,10 @@ int sanei_genesys_get_lowest_ydpi(Genesys_Device *dev)
|
|||
*/
|
||||
int sanei_genesys_get_lowest_dpi(Genesys_Device *dev)
|
||||
{
|
||||
int min=20000;
|
||||
int i=0;
|
||||
|
||||
while(dev->model->ydpi_values[i]!=0)
|
||||
{
|
||||
if(dev->model->ydpi_values[i]<min)
|
||||
{
|
||||
min=dev->model->ydpi_values[i];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
i=0;
|
||||
while(dev->model->xdpi_values[i]!=0)
|
||||
{
|
||||
if(dev->model->xdpi_values[i]<min)
|
||||
{
|
||||
min=dev->model->xdpi_values[i];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return min;
|
||||
return std::min(*std::min_element(dev->model->xdpi_values.begin(),
|
||||
dev->model->xdpi_values.end()),
|
||||
*std::min_element(dev->model->ydpi_values.begin(),
|
||||
dev->model->ydpi_values.end()));
|
||||
}
|
||||
|
||||
/** @brief check is a cache entry may be used
|
||||
|
|
|
@ -1153,67 +1153,111 @@ struct Genesys_Command_Set
|
|||
* This structure describes a model. It is composed of information on the
|
||||
* sensor, the motor, scanner geometry and flags to drive operation.
|
||||
*/
|
||||
typedef struct Genesys_Model
|
||||
struct Genesys_Model
|
||||
{
|
||||
SANE_String_Const name;
|
||||
SANE_String_Const vendor;
|
||||
SANE_String_Const model;
|
||||
SANE_Int model_id;
|
||||
Genesys_Model() = default;
|
||||
|
||||
SANE_Int asic_type; /* ASIC type gl646 or gl841 */
|
||||
Genesys_Command_Set *cmd_set; /* pointers to low level functions */
|
||||
const char* name = nullptr;
|
||||
const char* vendor = nullptr;
|
||||
const char* model = nullptr;
|
||||
unsigned model_id = 0;
|
||||
|
||||
SANE_Int xdpi_values[MAX_RESOLUTIONS]; /* possible x resolutions */
|
||||
SANE_Int ydpi_values[MAX_RESOLUTIONS]; /* possible y resolutions */
|
||||
SANE_Int bpp_gray_values[MAX_DPI]; /* possible depths in gray mode */
|
||||
SANE_Int bpp_color_values[MAX_DPI]; /* possible depths in color mode */
|
||||
// ASIC type gl646 or gl841
|
||||
unsigned asic_type = 0;
|
||||
|
||||
// pointers to low level functions
|
||||
Genesys_Command_Set* cmd_set = nullptr;
|
||||
|
||||
// possible x resolutions
|
||||
std::vector<unsigned> xdpi_values;
|
||||
// possible y resolutions
|
||||
std::vector<unsigned> ydpi_values;
|
||||
|
||||
// possible depths in gray mode
|
||||
std::vector<unsigned> bpp_gray_values;
|
||||
// possible depths in color mode
|
||||
std::vector<unsigned> bpp_color_values;
|
||||
|
||||
// All offsets below are with respect to the sensor home position
|
||||
SANE_Fixed x_offset; /* Start of scan area in mm */
|
||||
SANE_Fixed y_offset; /* Start of scan area in mm (Amount of
|
||||
feeding needed to get to the medium) */
|
||||
SANE_Fixed x_size; /* Size of scan area in mm */
|
||||
SANE_Fixed y_size; /* Size of scan area in mm */
|
||||
|
||||
SANE_Fixed y_offset_calib; /* Start of white strip in mm */
|
||||
SANE_Fixed x_offset_mark; /* Start of black mark in mm */
|
||||
// Start of scan area in mm
|
||||
SANE_Fixed x_offset = 0;
|
||||
|
||||
SANE_Fixed x_offset_ta; /* Start of scan area in TA mode in mm */
|
||||
SANE_Fixed y_offset_ta; /* Start of scan area in TA mode in mm */
|
||||
SANE_Fixed x_size_ta; /* Size of scan area in TA mode in mm */
|
||||
SANE_Fixed y_size_ta; /* Size of scan area in TA mode in mm */
|
||||
// Start of scan area in mm (Amount of feeding needed to get to the medium)
|
||||
SANE_Fixed y_offset = 0;
|
||||
|
||||
// The position of the sensor when it's aligned with the lamp for transparency scanning
|
||||
SANE_Fixed y_offset_sensor_to_ta;
|
||||
// Size of scan area in mm
|
||||
SANE_Fixed x_size = 0;
|
||||
|
||||
SANE_Fixed y_offset_calib_ta; /* Start of white strip in TA mode in mm */
|
||||
// Size of scan area in mm
|
||||
SANE_Fixed y_size = 0;
|
||||
|
||||
SANE_Fixed post_scan; /* Size of scan area after paper sensor stops
|
||||
sensing document in mm */
|
||||
SANE_Fixed eject_feed; /* Amount of feeding needed to eject document
|
||||
after finishing scanning in mm */
|
||||
// Start of white strip in mm
|
||||
SANE_Fixed y_offset_calib = 0;
|
||||
|
||||
/* Line-distance correction (in pixel at optical_ydpi) for CCD scanners */
|
||||
SANE_Int ld_shift_r; /* red */
|
||||
SANE_Int ld_shift_g; /* green */
|
||||
SANE_Int ld_shift_b; /* blue */
|
||||
// Start of black mark in mm
|
||||
SANE_Fixed x_offset_mark = 0;
|
||||
|
||||
Genesys_Color_Order line_mode_color_order; /* Order of the CCD/CIS colors */
|
||||
// Start of scan area in TA mode in mm
|
||||
SANE_Fixed x_offset_ta = 0;
|
||||
|
||||
SANE_Bool is_cis; /* Is this a CIS or CCD scanner? */
|
||||
SANE_Bool is_sheetfed; /* Is this sheetfed scanner? */
|
||||
// Start of scan area in TA mode in mm
|
||||
SANE_Fixed y_offset_ta = 0;
|
||||
|
||||
SANE_Int ccd_type; /* which SENSOR type do we have ? */
|
||||
SANE_Int dac_type; /* which DAC do we have ? */
|
||||
SANE_Int gpo_type; /* General purpose output type */
|
||||
SANE_Int motor_type; /* stepper motor type */
|
||||
SANE_Word flags; /* Which hacks are needed for this scanner? */
|
||||
SANE_Word buttons; /* Button flags, described existing buttons for the model */
|
||||
/*@} */
|
||||
SANE_Int shading_lines; /* how many lines are used for shading calibration */
|
||||
SANE_Int shading_ta_lines; // how many lines are used for shading calibration in TA mode
|
||||
SANE_Int search_lines; /* how many lines are used to search start position */
|
||||
} Genesys_Model;
|
||||
// Size of scan area in TA mode in mm
|
||||
SANE_Fixed x_size_ta = 0;
|
||||
|
||||
// Size of scan area in TA mode in mm
|
||||
SANE_Fixed y_size_ta = 0;
|
||||
|
||||
// The position of the sensor when it's aligned with the lamp for transparency scanning
|
||||
SANE_Fixed y_offset_sensor_to_ta = 0;
|
||||
|
||||
// Start of white strip in TA mode in mm
|
||||
SANE_Fixed y_offset_calib_ta = 0;
|
||||
|
||||
// Size of scan area after paper sensor stop sensing document in mm
|
||||
SANE_Fixed post_scan = 0;
|
||||
|
||||
// Amount of feeding needed to eject document after finishing scanning in mm
|
||||
SANE_Fixed eject_feed = 0;
|
||||
|
||||
// Line-distance correction (in pixel at optical_ydpi) for CCD scanners
|
||||
SANE_Int ld_shift_r = 0;
|
||||
SANE_Int ld_shift_g = 0;
|
||||
SANE_Int ld_shift_b = 0;
|
||||
|
||||
// Order of the CCD/CIS colors
|
||||
Genesys_Color_Order line_mode_color_order = COLOR_ORDER_RGB;
|
||||
|
||||
// Is this a CIS or CCD scanner?
|
||||
SANE_Bool is_cis = false;
|
||||
|
||||
// Is this sheetfed scanner?
|
||||
SANE_Bool is_sheetfed = false;
|
||||
|
||||
// sensor type
|
||||
SANE_Int ccd_type = 0;
|
||||
// Digital-Analog converter type (TODO: rename to ADC)
|
||||
SANE_Int dac_type = 0;
|
||||
// General purpose output type
|
||||
SANE_Int gpo_type = 0;
|
||||
// stepper motor type
|
||||
SANE_Int motor_type = 0;
|
||||
|
||||
// Which hacks are needed for this scanner?
|
||||
SANE_Word flags = 0;
|
||||
|
||||
// Button flags, described existing buttons for the model
|
||||
SANE_Word buttons = 0;
|
||||
|
||||
// how many lines are used for shading calibration
|
||||
SANE_Int shading_lines = 0;
|
||||
// how many lines are used for shading calibration in TA mode
|
||||
SANE_Int shading_ta_lines = 0;
|
||||
// how many lines are used to search start position
|
||||
SANE_Int search_lines = 0;
|
||||
};
|
||||
|
||||
struct Genesys_Settings
|
||||
{
|
||||
|
@ -1630,12 +1674,19 @@ struct Genesys_Device
|
|||
FILE *binary = nullptr;
|
||||
};
|
||||
|
||||
typedef struct Genesys_USB_Device_Entry
|
||||
{
|
||||
SANE_Word vendor; /**< USB vendor identifier */
|
||||
SANE_Word product; /**< USB product identifier */
|
||||
Genesys_Model *model; /**< Scanner model information */
|
||||
} Genesys_USB_Device_Entry;
|
||||
struct Genesys_USB_Device_Entry {
|
||||
|
||||
Genesys_USB_Device_Entry(unsigned v, unsigned p, const Genesys_Model& m) :
|
||||
vendor(v), product(p), model(m)
|
||||
{}
|
||||
|
||||
// USB vendor identifier
|
||||
unsigned vendor;
|
||||
// USB product identifier
|
||||
unsigned product;
|
||||
// Scanner model information
|
||||
Genesys_Model model;
|
||||
};
|
||||
|
||||
/**
|
||||
* structure for motor database
|
||||
|
@ -2037,6 +2088,7 @@ private:
|
|||
extern StaticInit<std::vector<Genesys_Sensor>> s_sensors;
|
||||
void genesys_init_sensor_tables();
|
||||
void genesys_init_frontend_tables();
|
||||
void genesys_init_usb_device_tables();
|
||||
|
||||
void debug_dump(unsigned level, const Genesys_Settings& settings);
|
||||
void debug_dump(unsigned level, const SetupParams& params);
|
||||
|
|
Ładowanie…
Reference in New Issue