kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Simplify sensor handling
rodzic
f901462f99
commit
3f184b795f
|
@ -5671,8 +5671,6 @@ init_options (Genesys_Scanner * s)
|
||||||
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
else
|
else
|
||||||
s->opt[OPT_SCAN_SW].cap = SANE_CAP_INACTIVE;
|
s->opt[OPT_SCAN_SW].cap = SANE_CAP_INACTIVE;
|
||||||
s->val[OPT_SCAN_SW].b = 0;
|
|
||||||
s->last_val[OPT_SCAN_SW].b = 0;
|
|
||||||
|
|
||||||
/* SANE_NAME_FILE is not for buttons */
|
/* SANE_NAME_FILE is not for buttons */
|
||||||
s->opt[OPT_FILE_SW].name = "file";
|
s->opt[OPT_FILE_SW].name = "file";
|
||||||
|
@ -5685,8 +5683,6 @@ init_options (Genesys_Scanner * s)
|
||||||
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
else
|
else
|
||||||
s->opt[OPT_FILE_SW].cap = SANE_CAP_INACTIVE;
|
s->opt[OPT_FILE_SW].cap = SANE_CAP_INACTIVE;
|
||||||
s->val[OPT_FILE_SW].b = 0;
|
|
||||||
s->last_val[OPT_FILE_SW].b = 0;
|
|
||||||
|
|
||||||
s->opt[OPT_EMAIL_SW].name = SANE_NAME_EMAIL;
|
s->opt[OPT_EMAIL_SW].name = SANE_NAME_EMAIL;
|
||||||
s->opt[OPT_EMAIL_SW].title = SANE_TITLE_EMAIL;
|
s->opt[OPT_EMAIL_SW].title = SANE_TITLE_EMAIL;
|
||||||
|
@ -5698,8 +5694,6 @@ init_options (Genesys_Scanner * s)
|
||||||
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
else
|
else
|
||||||
s->opt[OPT_EMAIL_SW].cap = SANE_CAP_INACTIVE;
|
s->opt[OPT_EMAIL_SW].cap = SANE_CAP_INACTIVE;
|
||||||
s->val[OPT_EMAIL_SW].b = 0;
|
|
||||||
s->last_val[OPT_EMAIL_SW].b = 0;
|
|
||||||
|
|
||||||
s->opt[OPT_COPY_SW].name = SANE_NAME_COPY;
|
s->opt[OPT_COPY_SW].name = SANE_NAME_COPY;
|
||||||
s->opt[OPT_COPY_SW].title = SANE_TITLE_COPY;
|
s->opt[OPT_COPY_SW].title = SANE_TITLE_COPY;
|
||||||
|
@ -5711,8 +5705,6 @@ init_options (Genesys_Scanner * s)
|
||||||
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
else
|
else
|
||||||
s->opt[OPT_COPY_SW].cap = SANE_CAP_INACTIVE;
|
s->opt[OPT_COPY_SW].cap = SANE_CAP_INACTIVE;
|
||||||
s->val[OPT_COPY_SW].b = 0;
|
|
||||||
s->last_val[OPT_COPY_SW].b = 0;
|
|
||||||
|
|
||||||
s->opt[OPT_PAGE_LOADED_SW].name = SANE_NAME_PAGE_LOADED;
|
s->opt[OPT_PAGE_LOADED_SW].name = SANE_NAME_PAGE_LOADED;
|
||||||
s->opt[OPT_PAGE_LOADED_SW].title = SANE_TITLE_PAGE_LOADED;
|
s->opt[OPT_PAGE_LOADED_SW].title = SANE_TITLE_PAGE_LOADED;
|
||||||
|
@ -5724,8 +5716,6 @@ init_options (Genesys_Scanner * s)
|
||||||
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
else
|
else
|
||||||
s->opt[OPT_PAGE_LOADED_SW].cap = SANE_CAP_INACTIVE;
|
s->opt[OPT_PAGE_LOADED_SW].cap = SANE_CAP_INACTIVE;
|
||||||
s->val[OPT_PAGE_LOADED_SW].b = 0;
|
|
||||||
s->last_val[OPT_PAGE_LOADED_SW].b = 0;
|
|
||||||
|
|
||||||
/* OCR button */
|
/* OCR button */
|
||||||
s->opt[OPT_OCR_SW].name = "ocr";
|
s->opt[OPT_OCR_SW].name = "ocr";
|
||||||
|
@ -5738,8 +5728,6 @@ init_options (Genesys_Scanner * s)
|
||||||
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
else
|
else
|
||||||
s->opt[OPT_OCR_SW].cap = SANE_CAP_INACTIVE;
|
s->opt[OPT_OCR_SW].cap = SANE_CAP_INACTIVE;
|
||||||
s->val[OPT_OCR_SW].b = 0;
|
|
||||||
s->last_val[OPT_OCR_SW].b = 0;
|
|
||||||
|
|
||||||
/* power button */
|
/* power button */
|
||||||
s->opt[OPT_POWER_SW].name = "power";
|
s->opt[OPT_POWER_SW].name = "power";
|
||||||
|
@ -5752,8 +5740,6 @@ init_options (Genesys_Scanner * s)
|
||||||
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
else
|
else
|
||||||
s->opt[OPT_POWER_SW].cap = SANE_CAP_INACTIVE;
|
s->opt[OPT_POWER_SW].cap = SANE_CAP_INACTIVE;
|
||||||
s->val[OPT_POWER_SW].b = 0;
|
|
||||||
s->last_val[OPT_POWER_SW].b = 0;
|
|
||||||
|
|
||||||
/* extra button */
|
/* extra button */
|
||||||
s->opt[OPT_EXTRA_SW].name = "extra";
|
s->opt[OPT_EXTRA_SW].name = "extra";
|
||||||
|
@ -5767,7 +5753,6 @@ init_options (Genesys_Scanner * s)
|
||||||
else
|
else
|
||||||
s->opt[OPT_EXTRA_SW].cap = SANE_CAP_INACTIVE;
|
s->opt[OPT_EXTRA_SW].cap = SANE_CAP_INACTIVE;
|
||||||
s->val[OPT_EXTRA_SW].b = 0;
|
s->val[OPT_EXTRA_SW].b = 0;
|
||||||
s->last_val[OPT_EXTRA_SW].b = 0;
|
|
||||||
|
|
||||||
/* calibration needed */
|
/* calibration needed */
|
||||||
s->opt[OPT_NEED_CALIBRATION_SW].name = "need-calibration";
|
s->opt[OPT_NEED_CALIBRATION_SW].name = "need-calibration";
|
||||||
|
@ -5781,7 +5766,6 @@ init_options (Genesys_Scanner * s)
|
||||||
else
|
else
|
||||||
s->opt[OPT_NEED_CALIBRATION_SW].cap = SANE_CAP_INACTIVE;
|
s->opt[OPT_NEED_CALIBRATION_SW].cap = SANE_CAP_INACTIVE;
|
||||||
s->val[OPT_NEED_CALIBRATION_SW].b = 0;
|
s->val[OPT_NEED_CALIBRATION_SW].b = 0;
|
||||||
s->last_val[OPT_NEED_CALIBRATION_SW].b = 0;
|
|
||||||
|
|
||||||
/* button group */
|
/* button group */
|
||||||
s->opt[OPT_BUTTON_GROUP].title = SANE_I18N ("Buttons");
|
s->opt[OPT_BUTTON_GROUP].title = SANE_I18N ("Buttons");
|
||||||
|
@ -5805,7 +5789,6 @@ init_options (Genesys_Scanner * s)
|
||||||
else
|
else
|
||||||
s->opt[OPT_CALIBRATE].cap = SANE_CAP_INACTIVE;
|
s->opt[OPT_CALIBRATE].cap = SANE_CAP_INACTIVE;
|
||||||
s->val[OPT_CALIBRATE].b = 0;
|
s->val[OPT_CALIBRATE].b = 0;
|
||||||
s->last_val[OPT_CALIBRATE].b = 0;
|
|
||||||
|
|
||||||
/* clear calibration cache button */
|
/* clear calibration cache button */
|
||||||
s->opt[OPT_CLEAR_CALIBRATION].name = "clear-calibration";
|
s->opt[OPT_CLEAR_CALIBRATION].name = "clear-calibration";
|
||||||
|
@ -5818,7 +5801,6 @@ init_options (Genesys_Scanner * s)
|
||||||
s->opt[OPT_CLEAR_CALIBRATION].cap =
|
s->opt[OPT_CLEAR_CALIBRATION].cap =
|
||||||
SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
|
SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
|
||||||
s->val[OPT_CLEAR_CALIBRATION].b = 0;
|
s->val[OPT_CLEAR_CALIBRATION].b = 0;
|
||||||
s->last_val[OPT_CLEAR_CALIBRATION].b = 0;
|
|
||||||
|
|
||||||
/* force calibration cache button */
|
/* force calibration cache button */
|
||||||
s->opt[OPT_FORCE_CALIBRATION].name = "force-calibration";
|
s->opt[OPT_FORCE_CALIBRATION].name = "force-calibration";
|
||||||
|
@ -5831,7 +5813,6 @@ init_options (Genesys_Scanner * s)
|
||||||
s->opt[OPT_FORCE_CALIBRATION].cap =
|
s->opt[OPT_FORCE_CALIBRATION].cap =
|
||||||
SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
|
SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
|
||||||
s->val[OPT_FORCE_CALIBRATION].b = 0;
|
s->val[OPT_FORCE_CALIBRATION].b = 0;
|
||||||
s->last_val[OPT_FORCE_CALIBRATION].b = 0;
|
|
||||||
|
|
||||||
RIE (calc_parameters (s));
|
RIE (calc_parameters (s));
|
||||||
|
|
||||||
|
@ -6762,8 +6743,7 @@ get_option_value (Genesys_Scanner * s, int option, void *val)
|
||||||
case OPT_POWER_SW:
|
case OPT_POWER_SW:
|
||||||
case OPT_EXTRA_SW:
|
case OPT_EXTRA_SW:
|
||||||
RIE (s->dev->model->cmd_set->update_hardware_sensors (s));
|
RIE (s->dev->model->cmd_set->update_hardware_sensors (s));
|
||||||
*(SANE_Bool *) val = s->val[option].b;
|
*(SANE_Bool *) val = s->buttons[genesys_option_to_button(option)].read();
|
||||||
s->last_val[option].b = *(SANE_Bool *) val;
|
|
||||||
break;
|
break;
|
||||||
case OPT_NEED_CALIBRATION_SW:
|
case OPT_NEED_CALIBRATION_SW:
|
||||||
/* scanner needs calibration for current mode unless a matching
|
/* scanner needs calibration for current mode unless a matching
|
||||||
|
@ -7633,3 +7613,18 @@ sane_get_select_fd(SANE_Handle handle, SANE_Int * fd)
|
||||||
return sane_get_select_fd_impl(handle, fd);
|
return sane_get_select_fd_impl(handle, fd);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GenesysButtonName genesys_option_to_button(int option)
|
||||||
|
{
|
||||||
|
switch (option) {
|
||||||
|
case OPT_SCAN_SW: return BUTTON_SCAN_SW;
|
||||||
|
case OPT_FILE_SW: return BUTTON_FILE_SW;
|
||||||
|
case OPT_EMAIL_SW: return BUTTON_EMAIL_SW;
|
||||||
|
case OPT_COPY_SW: return BUTTON_COPY_SW;
|
||||||
|
case OPT_PAGE_LOADED_SW: return BUTTON_PAGE_LOADED_SW;
|
||||||
|
case OPT_OCR_SW: return BUTTON_OCR_SW;
|
||||||
|
case OPT_POWER_SW: return BUTTON_POWER_SW;
|
||||||
|
case OPT_EXTRA_SW: return BUTTON_EXTRA_SW;
|
||||||
|
default: throw std::runtime_error("Unknown option to convert to button index");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "genesys_low.h"
|
#include "genesys_low.h"
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
#ifndef PATH_MAX
|
#ifndef PATH_MAX
|
||||||
# define PATH_MAX 1024
|
# define PATH_MAX 1024
|
||||||
|
@ -145,6 +146,45 @@ enum Genesys_Option
|
||||||
NUM_OPTIONS
|
NUM_OPTIONS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum GenesysButtonName : unsigned {
|
||||||
|
BUTTON_SCAN_SW = 0,
|
||||||
|
BUTTON_FILE_SW,
|
||||||
|
BUTTON_EMAIL_SW,
|
||||||
|
BUTTON_COPY_SW,
|
||||||
|
BUTTON_PAGE_LOADED_SW,
|
||||||
|
BUTTON_OCR_SW,
|
||||||
|
BUTTON_POWER_SW,
|
||||||
|
BUTTON_EXTRA_SW,
|
||||||
|
NUM_BUTTONS
|
||||||
|
};
|
||||||
|
|
||||||
|
GenesysButtonName genesys_option_to_button(int option);
|
||||||
|
|
||||||
|
class GenesysButton {
|
||||||
|
public:
|
||||||
|
void write(bool value)
|
||||||
|
{
|
||||||
|
if (value == value_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
values_to_read_.push(value);
|
||||||
|
value_ = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool read()
|
||||||
|
{
|
||||||
|
if (values_to_read_.empty()) {
|
||||||
|
return value_;
|
||||||
|
}
|
||||||
|
bool ret = values_to_read_.front();
|
||||||
|
values_to_read_.pop();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool value_ = false;
|
||||||
|
std::queue<bool> values_to_read_;
|
||||||
|
};
|
||||||
|
|
||||||
/** Scanner object. Should have better be called Session than Scanner
|
/** Scanner object. Should have better be called Session than Scanner
|
||||||
*/
|
*/
|
||||||
|
@ -166,8 +206,10 @@ struct Genesys_Scanner
|
||||||
SANE_Option_Descriptor opt[NUM_OPTIONS];
|
SANE_Option_Descriptor opt[NUM_OPTIONS];
|
||||||
// Option values
|
// Option values
|
||||||
Option_Value val[NUM_OPTIONS];
|
Option_Value val[NUM_OPTIONS];
|
||||||
// Option values as read by the frontend. used for sensors.
|
|
||||||
Option_Value last_val[NUM_OPTIONS];
|
// Button states
|
||||||
|
GenesysButton buttons[NUM_BUTTONS];
|
||||||
|
|
||||||
// SANE Parameters
|
// SANE Parameters
|
||||||
SANE_Parameters params = {};
|
SANE_Parameters params = {};
|
||||||
SANE_Int bpp_list[5] = {};
|
SANE_Int bpp_list[5] = {};
|
||||||
|
|
|
@ -3574,27 +3574,18 @@ gl124_update_hardware_sensors (Genesys_Scanner * s)
|
||||||
if((s->dev->model->gpo_type == GPO_CANONLIDE110)
|
if((s->dev->model->gpo_type == GPO_CANONLIDE110)
|
||||||
||(s->dev->model->gpo_type == GPO_CANONLIDE120))
|
||(s->dev->model->gpo_type == GPO_CANONLIDE120))
|
||||||
{
|
{
|
||||||
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
|
s->buttons[BUTTON_SCAN_SW].write((val & 0x01) == 0);
|
||||||
s->val[OPT_SCAN_SW].b = (val & 0x01) == 0;
|
s->buttons[BUTTON_FILE_SW].write((val & 0x08) == 0);
|
||||||
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
|
s->buttons[BUTTON_EMAIL_SW].write((val & 0x04) == 0);
|
||||||
s->val[OPT_FILE_SW].b = (val & 0x08) == 0;
|
s->buttons[BUTTON_COPY_SW].write((val & 0x02) == 0);
|
||||||
if (s->val[OPT_EMAIL_SW].b == s->last_val[OPT_EMAIL_SW].b)
|
|
||||||
s->val[OPT_EMAIL_SW].b = (val & 0x04) == 0;
|
|
||||||
if (s->val[OPT_COPY_SW].b == s->last_val[OPT_COPY_SW].b)
|
|
||||||
s->val[OPT_COPY_SW].b = (val & 0x02) == 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* LiDE 210 case */
|
{ /* LiDE 210 case */
|
||||||
if (s->val[OPT_EXTRA_SW].b == s->last_val[OPT_EXTRA_SW].b)
|
s->buttons[BUTTON_EXTRA_SW].write((val & 0x01) == 0);
|
||||||
s->val[OPT_EXTRA_SW].b = (val & 0x01) == 0;
|
s->buttons[BUTTON_SCAN_SW].write((val & 0x02) == 0);
|
||||||
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
|
s->buttons[BUTTON_COPY_SW].write((val & 0x04) == 0);
|
||||||
s->val[OPT_SCAN_SW].b = (val & 0x02) == 0;
|
s->buttons[BUTTON_EMAIL_SW].write((val & 0x08) == 0);
|
||||||
if (s->val[OPT_COPY_SW].b == s->last_val[OPT_COPY_SW].b)
|
s->buttons[BUTTON_FILE_SW].write((val & 0x10) == 0);
|
||||||
s->val[OPT_COPY_SW].b = (val & 0x04) == 0;
|
|
||||||
if (s->val[OPT_EMAIL_SW].b == s->last_val[OPT_EMAIL_SW].b)
|
|
||||||
s->val[OPT_EMAIL_SW].b = (val & 0x08) == 0;
|
|
||||||
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
|
|
||||||
s->val[OPT_FILE_SW].b = (val & 0x10) == 0;
|
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4556,7 +4556,7 @@ simple_move (Genesys_Device * dev, SANE_Int distance)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* update the status of the required sensor in the scanner session
|
* update the status of the required sensor in the scanner session
|
||||||
* the last_val fileds are used to make events 'sticky'
|
* the button fileds are used to make events 'sticky'
|
||||||
*/
|
*/
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
gl646_update_hardware_sensors (Genesys_Scanner * session)
|
gl646_update_hardware_sensors (Genesys_Scanner * session)
|
||||||
|
@ -4576,106 +4576,87 @@ gl646_update_hardware_sensors (Genesys_Scanner * session)
|
||||||
}
|
}
|
||||||
DBG(DBG_io, "%s: GPIO=0x%02x\n", __func__, value);
|
DBG(DBG_io, "%s: GPIO=0x%02x\n", __func__, value);
|
||||||
|
|
||||||
/* scan button */
|
// scan button
|
||||||
if ((dev->model->buttons & GENESYS_HAS_SCAN_SW)
|
if (dev->model->buttons & GENESYS_HAS_SCAN_SW) {
|
||||||
&& session->val[OPT_SCAN_SW].b == session->last_val[OPT_SCAN_SW].b)
|
switch (dev->model->gpo_type) {
|
||||||
{
|
|
||||||
switch (dev->model->gpo_type)
|
|
||||||
{
|
|
||||||
case GPO_XP200:
|
case GPO_XP200:
|
||||||
session->val[OPT_SCAN_SW].b = ((value & 0x02) != 0);
|
session->buttons[BUTTON_SCAN_SW].write((value & 0x02) != 0);
|
||||||
break;
|
break;
|
||||||
case GPO_5345:
|
case GPO_5345:
|
||||||
session->val[OPT_SCAN_SW].b = (value == 0x16);
|
session->buttons[BUTTON_SCAN_SW].write(value == 0x16);
|
||||||
break;
|
break;
|
||||||
case GPO_HP2300:
|
case GPO_HP2300:
|
||||||
session->val[OPT_SCAN_SW].b = (value == 0x6c);
|
session->buttons[BUTTON_SCAN_SW].write(value == 0x6c);
|
||||||
break;
|
break;
|
||||||
case GPO_HP3670:
|
case GPO_HP3670:
|
||||||
case GPO_HP2400:
|
case GPO_HP2400:
|
||||||
session->val[OPT_SCAN_SW].b = ((value & 0x20) == 0);
|
session->buttons[BUTTON_SCAN_SW].write((value & 0x20) == 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* email button */
|
// email button
|
||||||
if ((dev->model->buttons & GENESYS_HAS_EMAIL_SW)
|
if (dev->model->buttons & GENESYS_HAS_EMAIL_SW) {
|
||||||
&& session->val[OPT_EMAIL_SW].b == session->last_val[OPT_EMAIL_SW].b)
|
switch (dev->model->gpo_type) {
|
||||||
{
|
|
||||||
switch (dev->model->gpo_type)
|
|
||||||
{
|
|
||||||
case GPO_5345:
|
case GPO_5345:
|
||||||
session->val[OPT_EMAIL_SW].b = (value == 0x12);
|
session->buttons[BUTTON_EMAIL_SW].write(value == 0x12);
|
||||||
break;
|
break;
|
||||||
case GPO_HP3670:
|
case GPO_HP3670:
|
||||||
case GPO_HP2400:
|
case GPO_HP2400:
|
||||||
session->val[OPT_EMAIL_SW].b = ((value & 0x08) == 0);
|
session->buttons[BUTTON_EMAIL_SW].write((value & 0x08) == 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy button */
|
// copy button
|
||||||
if ((dev->model->buttons & GENESYS_HAS_COPY_SW)
|
if (dev->model->buttons & GENESYS_HAS_COPY_SW) {
|
||||||
&& session->val[OPT_COPY_SW].b == session->last_val[OPT_COPY_SW].b)
|
switch (dev->model->gpo_type) {
|
||||||
{
|
|
||||||
switch (dev->model->gpo_type)
|
|
||||||
{
|
|
||||||
case GPO_5345:
|
case GPO_5345:
|
||||||
session->val[OPT_COPY_SW].b = (value == 0x11);
|
session->buttons[BUTTON_COPY_SW].write(value == 0x11);
|
||||||
break;
|
break;
|
||||||
case GPO_HP2300:
|
case GPO_HP2300:
|
||||||
session->val[OPT_COPY_SW].b = (value == 0x5c);
|
session->buttons[BUTTON_COPY_SW].write(value == 0x5c);
|
||||||
break;
|
break;
|
||||||
case GPO_HP3670:
|
case GPO_HP3670:
|
||||||
case GPO_HP2400:
|
case GPO_HP2400:
|
||||||
session->val[OPT_COPY_SW].b = ((value & 0x10) == 0);
|
session->buttons[BUTTON_COPY_SW].write((value & 0x10) == 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* power button */
|
// power button
|
||||||
if ((dev->model->buttons & GENESYS_HAS_POWER_SW)
|
if (dev->model->buttons & GENESYS_HAS_POWER_SW) {
|
||||||
&& session->val[OPT_POWER_SW].b == session->last_val[OPT_POWER_SW].b)
|
switch (dev->model->gpo_type) {
|
||||||
{
|
|
||||||
switch (dev->model->gpo_type)
|
|
||||||
{
|
|
||||||
case GPO_5345:
|
case GPO_5345:
|
||||||
session->val[OPT_POWER_SW].b = (value == 0x14);
|
session->buttons[BUTTON_POWER_SW].write(value == 0x14);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ocr button */
|
// ocr button
|
||||||
if ((dev->model->buttons & GENESYS_HAS_OCR_SW)
|
if (dev->model->buttons & GENESYS_HAS_OCR_SW) {
|
||||||
&& session->val[OPT_OCR_SW].b == session->last_val[OPT_OCR_SW].b)
|
switch (dev->model->gpo_type) {
|
||||||
{
|
|
||||||
switch (dev->model->gpo_type)
|
|
||||||
{
|
|
||||||
case GPO_5345:
|
case GPO_5345:
|
||||||
session->val[OPT_OCR_SW].b = (value == 0x13);
|
session->buttons[BUTTON_OCR_SW].write(value == 0x13);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* document detection */
|
// document detection
|
||||||
if ((dev->model->buttons & GENESYS_HAS_PAGE_LOADED_SW)
|
if (dev->model->buttons & GENESYS_HAS_PAGE_LOADED_SW) {
|
||||||
&& session->val[OPT_PAGE_LOADED_SW].b ==
|
switch (dev->model->gpo_type) {
|
||||||
session->last_val[OPT_PAGE_LOADED_SW].b)
|
|
||||||
{
|
|
||||||
switch (dev->model->gpo_type)
|
|
||||||
{
|
|
||||||
case GPO_XP200:
|
case GPO_XP200:
|
||||||
session->val[OPT_PAGE_LOADED_SW].b = ((value & 0x04) != 0);
|
session->buttons[BUTTON_PAGE_LOADED_SW].write((value & 0x04) != 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
|
|
|
@ -5202,15 +5202,10 @@ gl841_update_hardware_sensors (Genesys_Scanner * s)
|
||||||
|| s->dev->model->gpo_type == GPO_CANONLIDE80)
|
|| s->dev->model->gpo_type == GPO_CANONLIDE80)
|
||||||
{
|
{
|
||||||
RIE(sanei_genesys_read_register(s->dev, REG6D, &val));
|
RIE(sanei_genesys_read_register(s->dev, REG6D, &val));
|
||||||
|
s->buttons[BUTTON_SCAN_SW].write((val & 0x01) == 0);
|
||||||
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
|
s->buttons[BUTTON_FILE_SW].write((val & 0x02) == 0);
|
||||||
s->val[OPT_SCAN_SW].b = (val & 0x01) == 0;
|
s->buttons[BUTTON_EMAIL_SW].write((val & 0x04) == 0);
|
||||||
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
|
s->buttons[BUTTON_COPY_SW].write((val & 0x08) == 0);
|
||||||
s->val[OPT_FILE_SW].b = (val & 0x02) == 0;
|
|
||||||
if (s->val[OPT_EMAIL_SW].b == s->last_val[OPT_EMAIL_SW].b)
|
|
||||||
s->val[OPT_EMAIL_SW].b = (val & 0x04) == 0;
|
|
||||||
if (s->val[OPT_COPY_SW].b == s->last_val[OPT_COPY_SW].b)
|
|
||||||
s->val[OPT_COPY_SW].b = (val & 0x08) == 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->dev->model->gpo_type == GPO_XP300 ||
|
if (s->dev->model->gpo_type == GPO_XP300 ||
|
||||||
|
@ -5219,10 +5214,8 @@ gl841_update_hardware_sensors (Genesys_Scanner * s)
|
||||||
{
|
{
|
||||||
RIE(sanei_genesys_read_register(s->dev, REG6D, &val));
|
RIE(sanei_genesys_read_register(s->dev, REG6D, &val));
|
||||||
|
|
||||||
if (s->val[OPT_PAGE_LOADED_SW].b == s->last_val[OPT_PAGE_LOADED_SW].b)
|
s->buttons[BUTTON_PAGE_LOADED_SW].write((val & 0x01) == 0);
|
||||||
s->val[OPT_PAGE_LOADED_SW].b = (val & 0x01) == 0;
|
s->buttons[BUTTON_SCAN_SW].write((val & 0x02) == 0);
|
||||||
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
|
|
||||||
s->val[OPT_SCAN_SW].b = (val & 0x02) == 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
|
|
@ -4012,18 +4012,13 @@ gl843_update_hardware_sensors (Genesys_Scanner * s)
|
||||||
switch (s->dev->model->gpo_type)
|
switch (s->dev->model->gpo_type)
|
||||||
{
|
{
|
||||||
case GPO_KVSS080:
|
case GPO_KVSS080:
|
||||||
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
|
s->buttons[BUTTON_SCAN_SW].write((val & 0x04) == 0);
|
||||||
s->val[OPT_SCAN_SW].b = (val & 0x04) == 0;
|
|
||||||
break;
|
break;
|
||||||
case GPO_G4050:
|
case GPO_G4050:
|
||||||
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
|
s->buttons[BUTTON_SCAN_SW].write((val & 0x01) == 0);
|
||||||
s->val[OPT_SCAN_SW].b = (val & 0x01) == 0;
|
s->buttons[BUTTON_FILE_SW].write((val & 0x02) == 0);
|
||||||
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
|
s->buttons[BUTTON_EMAIL_SW].write((val & 0x04) == 0);
|
||||||
s->val[OPT_FILE_SW].b = (val & 0x02) == 0;
|
s->buttons[BUTTON_COPY_SW].write((val & 0x08) == 0);
|
||||||
if (s->val[OPT_EMAIL_SW].b == s->last_val[OPT_EMAIL_SW].b)
|
|
||||||
s->val[OPT_EMAIL_SW].b = (val & 0x04) == 0;
|
|
||||||
if (s->val[OPT_COPY_SW].b == s->last_val[OPT_COPY_SW].b)
|
|
||||||
s->val[OPT_COPY_SW].b = (val & 0x08) == 0;
|
|
||||||
break;
|
break;
|
||||||
case GPO_CS4400F:
|
case GPO_CS4400F:
|
||||||
case GPO_CS8400F:
|
case GPO_CS8400F:
|
||||||
|
|
|
@ -2726,14 +2726,10 @@ gl846_update_hardware_sensors (Genesys_Scanner * s)
|
||||||
}
|
}
|
||||||
RIE (sanei_genesys_read_register (s->dev, REG6D, &val));
|
RIE (sanei_genesys_read_register (s->dev, REG6D, &val));
|
||||||
|
|
||||||
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
|
s->buttons[BUTTON_SCAN_SW].write((val & scan) == 0);
|
||||||
s->val[OPT_SCAN_SW].b = (val & scan) == 0;
|
s->buttons[BUTTON_FILE_SW].write((val & file) == 0);
|
||||||
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
|
s->buttons[BUTTON_EMAIL_SW].write((val & email) == 0);
|
||||||
s->val[OPT_FILE_SW].b = (val & file) == 0;
|
s->buttons[BUTTON_COPY_SW].write((val & copy) == 0);
|
||||||
if (s->val[OPT_EMAIL_SW].b == s->last_val[OPT_EMAIL_SW].b)
|
|
||||||
s->val[OPT_EMAIL_SW].b = (val & email) == 0;
|
|
||||||
if (s->val[OPT_COPY_SW].b == s->last_val[OPT_COPY_SW].b)
|
|
||||||
s->val[OPT_COPY_SW].b = (val & copy) == 0;
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2832,14 +2832,10 @@ gl847_update_hardware_sensors (Genesys_Scanner * s)
|
||||||
}
|
}
|
||||||
RIE (sanei_genesys_read_register (s->dev, REG6D, &val));
|
RIE (sanei_genesys_read_register (s->dev, REG6D, &val));
|
||||||
|
|
||||||
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
|
s->buttons[BUTTON_SCAN_SW].write((val & scan) == 0);
|
||||||
s->val[OPT_SCAN_SW].b = (val & scan) == 0;
|
s->buttons[BUTTON_FILE_SW].write((val & file) == 0);
|
||||||
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
|
s->buttons[BUTTON_EMAIL_SW].write((val & email) == 0);
|
||||||
s->val[OPT_FILE_SW].b = (val & file) == 0;
|
s->buttons[BUTTON_COPY_SW].write((val & copy) == 0);
|
||||||
if (s->val[OPT_EMAIL_SW].b == s->last_val[OPT_EMAIL_SW].b)
|
|
||||||
s->val[OPT_EMAIL_SW].b = (val & email) == 0;
|
|
||||||
if (s->val[OPT_COPY_SW].b == s->last_val[OPT_COPY_SW].b)
|
|
||||||
s->val[OPT_COPY_SW].b = (val & copy) == 0;
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -983,13 +983,7 @@ typedef struct Genesys_Command_Set
|
||||||
SANE_Status (*bulk_read_data) (Genesys_Device * dev, uint8_t addr,
|
SANE_Status (*bulk_read_data) (Genesys_Device * dev, uint8_t addr,
|
||||||
uint8_t * data, size_t len);
|
uint8_t * data, size_t len);
|
||||||
|
|
||||||
/* Updates hardware sensor information in Genesys_Scanner.val[].
|
// Updates hardware sensor information in Genesys_Scanner.val[].
|
||||||
If possible, just get information for given option.
|
|
||||||
The sensor state in Genesys_Scanner.val[] should be merged with the
|
|
||||||
new sensor state, using the information that was last read by the frontend
|
|
||||||
in Genesys_Scanner.last_val[], in such a way that a button up/down
|
|
||||||
relative to Genesys_Scanner.last_val[] is not lost.
|
|
||||||
*/
|
|
||||||
SANE_Status (*update_hardware_sensors) (struct Genesys_Scanner * s);
|
SANE_Status (*update_hardware_sensors) (struct Genesys_Scanner * s);
|
||||||
|
|
||||||
/* functions for sheetfed scanners */
|
/* functions for sheetfed scanners */
|
||||||
|
|
Ładowanie…
Reference in New Issue