genesys: Simplify sensor handling

merge-requests/82/head
Povilas Kanapickas 2019-06-08 14:03:47 +03:00
rodzic f901462f99
commit 3f184b795f
9 zmienionych plików z 147 dodań i 164 usunięć

Wyświetl plik

@ -5671,8 +5671,6 @@ init_options (Genesys_Scanner * s)
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
else
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 */
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;
else
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].title = SANE_TITLE_EMAIL;
@ -5698,8 +5694,6 @@ init_options (Genesys_Scanner * s)
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
else
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].title = SANE_TITLE_COPY;
@ -5711,8 +5705,6 @@ init_options (Genesys_Scanner * s)
SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
else
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].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;
else
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 */
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;
else
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 */
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;
else
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 */
s->opt[OPT_EXTRA_SW].name = "extra";
@ -5767,7 +5753,6 @@ init_options (Genesys_Scanner * s)
else
s->opt[OPT_EXTRA_SW].cap = SANE_CAP_INACTIVE;
s->val[OPT_EXTRA_SW].b = 0;
s->last_val[OPT_EXTRA_SW].b = 0;
/* calibration needed */
s->opt[OPT_NEED_CALIBRATION_SW].name = "need-calibration";
@ -5781,7 +5766,6 @@ init_options (Genesys_Scanner * s)
else
s->opt[OPT_NEED_CALIBRATION_SW].cap = SANE_CAP_INACTIVE;
s->val[OPT_NEED_CALIBRATION_SW].b = 0;
s->last_val[OPT_NEED_CALIBRATION_SW].b = 0;
/* button group */
s->opt[OPT_BUTTON_GROUP].title = SANE_I18N ("Buttons");
@ -5805,7 +5789,6 @@ init_options (Genesys_Scanner * s)
else
s->opt[OPT_CALIBRATE].cap = SANE_CAP_INACTIVE;
s->val[OPT_CALIBRATE].b = 0;
s->last_val[OPT_CALIBRATE].b = 0;
/* clear calibration cache button */
s->opt[OPT_CLEAR_CALIBRATION].name = "clear-calibration";
@ -5818,7 +5801,6 @@ init_options (Genesys_Scanner * s)
s->opt[OPT_CLEAR_CALIBRATION].cap =
SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
s->val[OPT_CLEAR_CALIBRATION].b = 0;
s->last_val[OPT_CLEAR_CALIBRATION].b = 0;
/* force calibration cache button */
s->opt[OPT_FORCE_CALIBRATION].name = "force-calibration";
@ -5831,7 +5813,6 @@ init_options (Genesys_Scanner * s)
s->opt[OPT_FORCE_CALIBRATION].cap =
SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
s->val[OPT_FORCE_CALIBRATION].b = 0;
s->last_val[OPT_FORCE_CALIBRATION].b = 0;
RIE (calc_parameters (s));
@ -6762,8 +6743,7 @@ get_option_value (Genesys_Scanner * s, int option, void *val)
case OPT_POWER_SW:
case OPT_EXTRA_SW:
RIE (s->dev->model->cmd_set->update_hardware_sensors (s));
*(SANE_Bool *) val = s->val[option].b;
s->last_val[option].b = *(SANE_Bool *) val;
*(SANE_Bool *) val = s->buttons[genesys_option_to_button(option)].read();
break;
case OPT_NEED_CALIBRATION_SW:
/* 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);
});
}
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");
}
}

Wyświetl plik

@ -52,6 +52,7 @@
#endif
#include "genesys_low.h"
#include <queue>
#ifndef PATH_MAX
# define PATH_MAX 1024
@ -145,6 +146,45 @@ enum Genesys_Option
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
*/
@ -166,8 +206,10 @@ struct Genesys_Scanner
SANE_Option_Descriptor opt[NUM_OPTIONS];
// Option values
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 params = {};
SANE_Int bpp_list[5] = {};

Wyświetl plik

@ -3574,27 +3574,18 @@ gl124_update_hardware_sensors (Genesys_Scanner * s)
if((s->dev->model->gpo_type == GPO_CANONLIDE110)
||(s->dev->model->gpo_type == GPO_CANONLIDE120))
{
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
s->val[OPT_SCAN_SW].b = (val & 0x01) == 0;
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
s->val[OPT_FILE_SW].b = (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 & 0x02) == 0;
s->buttons[BUTTON_SCAN_SW].write((val & 0x01) == 0);
s->buttons[BUTTON_FILE_SW].write((val & 0x08) == 0);
s->buttons[BUTTON_EMAIL_SW].write((val & 0x04) == 0);
s->buttons[BUTTON_COPY_SW].write((val & 0x02) == 0);
}
else
{ /* LiDE 210 case */
if (s->val[OPT_EXTRA_SW].b == s->last_val[OPT_EXTRA_SW].b)
s->val[OPT_EXTRA_SW].b = (val & 0x01) == 0;
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
s->val[OPT_SCAN_SW].b = (val & 0x02) == 0;
if (s->val[OPT_COPY_SW].b == s->last_val[OPT_COPY_SW].b)
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;
s->buttons[BUTTON_EXTRA_SW].write((val & 0x01) == 0);
s->buttons[BUTTON_SCAN_SW].write((val & 0x02) == 0);
s->buttons[BUTTON_COPY_SW].write((val & 0x04) == 0);
s->buttons[BUTTON_EMAIL_SW].write((val & 0x08) == 0);
s->buttons[BUTTON_FILE_SW].write((val & 0x10) == 0);
}
return status;
}

Wyświetl plik

@ -4556,7 +4556,7 @@ simple_move (Genesys_Device * dev, SANE_Int distance)
/**
* 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
gl646_update_hardware_sensors (Genesys_Scanner * session)
@ -4576,109 +4576,90 @@ gl646_update_hardware_sensors (Genesys_Scanner * session)
}
DBG(DBG_io, "%s: GPIO=0x%02x\n", __func__, value);
/* scan button */
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)
{
// scan button
if (dev->model->buttons & GENESYS_HAS_SCAN_SW) {
switch (dev->model->gpo_type) {
case GPO_XP200:
session->val[OPT_SCAN_SW].b = ((value & 0x02) != 0);
break;
session->buttons[BUTTON_SCAN_SW].write((value & 0x02) != 0);
break;
case GPO_5345:
session->val[OPT_SCAN_SW].b = (value == 0x16);
break;
session->buttons[BUTTON_SCAN_SW].write(value == 0x16);
break;
case GPO_HP2300:
session->val[OPT_SCAN_SW].b = (value == 0x6c);
break;
session->buttons[BUTTON_SCAN_SW].write(value == 0x6c);
break;
case GPO_HP3670:
case GPO_HP2400:
session->val[OPT_SCAN_SW].b = ((value & 0x20) == 0);
break;
session->buttons[BUTTON_SCAN_SW].write((value & 0x20) == 0);
break;
default:
return SANE_STATUS_UNSUPPORTED;
return SANE_STATUS_UNSUPPORTED;
}
}
/* email button */
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)
{
// email button
if (dev->model->buttons & GENESYS_HAS_EMAIL_SW) {
switch (dev->model->gpo_type) {
case GPO_5345:
session->val[OPT_EMAIL_SW].b = (value == 0x12);
break;
session->buttons[BUTTON_EMAIL_SW].write(value == 0x12);
break;
case GPO_HP3670:
case GPO_HP2400:
session->val[OPT_EMAIL_SW].b = ((value & 0x08) == 0);
break;
session->buttons[BUTTON_EMAIL_SW].write((value & 0x08) == 0);
break;
default:
return SANE_STATUS_UNSUPPORTED;
return SANE_STATUS_UNSUPPORTED;
}
}
/* copy button */
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)
{
// copy button
if (dev->model->buttons & GENESYS_HAS_COPY_SW) {
switch (dev->model->gpo_type) {
case GPO_5345:
session->val[OPT_COPY_SW].b = (value == 0x11);
break;
session->buttons[BUTTON_COPY_SW].write(value == 0x11);
break;
case GPO_HP2300:
session->val[OPT_COPY_SW].b = (value == 0x5c);
break;
session->buttons[BUTTON_COPY_SW].write(value == 0x5c);
break;
case GPO_HP3670:
case GPO_HP2400:
session->val[OPT_COPY_SW].b = ((value & 0x10) == 0);
break;
session->buttons[BUTTON_COPY_SW].write((value & 0x10) == 0);
break;
default:
return SANE_STATUS_UNSUPPORTED;
}
}
/* power button */
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)
{
// power button
if (dev->model->buttons & GENESYS_HAS_POWER_SW) {
switch (dev->model->gpo_type) {
case GPO_5345:
session->val[OPT_POWER_SW].b = (value == 0x14);
break;
session->buttons[BUTTON_POWER_SW].write(value == 0x14);
break;
default:
return SANE_STATUS_UNSUPPORTED;
return SANE_STATUS_UNSUPPORTED;
}
}
/* ocr button */
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)
{
// ocr button
if (dev->model->buttons & GENESYS_HAS_OCR_SW) {
switch (dev->model->gpo_type) {
case GPO_5345:
session->val[OPT_OCR_SW].b = (value == 0x13);
break;
session->buttons[BUTTON_OCR_SW].write(value == 0x13);
break;
default:
return SANE_STATUS_UNSUPPORTED;
return SANE_STATUS_UNSUPPORTED;
}
}
/* document detection */
if ((dev->model->buttons & GENESYS_HAS_PAGE_LOADED_SW)
&& session->val[OPT_PAGE_LOADED_SW].b ==
session->last_val[OPT_PAGE_LOADED_SW].b)
{
switch (dev->model->gpo_type)
{
// document detection
if (dev->model->buttons & GENESYS_HAS_PAGE_LOADED_SW) {
switch (dev->model->gpo_type) {
case GPO_XP200:
session->val[OPT_PAGE_LOADED_SW].b = ((value & 0x04) != 0);
break;
session->buttons[BUTTON_PAGE_LOADED_SW].write((value & 0x04) != 0);
break;
default:
return SANE_STATUS_UNSUPPORTED;
return SANE_STATUS_UNSUPPORTED;
}
}

Wyświetl plik

@ -5201,28 +5201,21 @@ gl841_update_hardware_sensors (Genesys_Scanner * s)
if (s->dev->model->gpo_type == GPO_CANONLIDE35
|| s->dev->model->gpo_type == GPO_CANONLIDE80)
{
RIE(sanei_genesys_read_register(s->dev, REG6D, &val));
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
s->val[OPT_SCAN_SW].b = (val & 0x01) == 0;
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
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;
RIE(sanei_genesys_read_register(s->dev, REG6D, &val));
s->buttons[BUTTON_SCAN_SW].write((val & 0x01) == 0);
s->buttons[BUTTON_FILE_SW].write((val & 0x02) == 0);
s->buttons[BUTTON_EMAIL_SW].write((val & 0x04) == 0);
s->buttons[BUTTON_COPY_SW].write((val & 0x08) == 0);
}
if (s->dev->model->gpo_type == GPO_XP300 ||
s->dev->model->gpo_type == GPO_DP665 ||
s->dev->model->gpo_type == GPO_DP685)
{
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->val[OPT_PAGE_LOADED_SW].b = (val & 0x01) == 0;
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
s->val[OPT_SCAN_SW].b = (val & 0x02) == 0;
s->buttons[BUTTON_PAGE_LOADED_SW].write((val & 0x01) == 0);
s->buttons[BUTTON_SCAN_SW].write((val & 0x02) == 0);
}
return status;

Wyświetl plik

@ -4011,24 +4011,19 @@ gl843_update_hardware_sensors (Genesys_Scanner * s)
switch (s->dev->model->gpo_type)
{
case GPO_KVSS080:
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
s->val[OPT_SCAN_SW].b = (val & 0x04) == 0;
break;
case GPO_G4050:
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
s->val[OPT_SCAN_SW].b = (val & 0x01) == 0;
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
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;
break;
case GPO_CS4400F:
case GPO_CS8400F:
default:
break;
case GPO_KVSS080:
s->buttons[BUTTON_SCAN_SW].write((val & 0x04) == 0);
break;
case GPO_G4050:
s->buttons[BUTTON_SCAN_SW].write((val & 0x01) == 0);
s->buttons[BUTTON_FILE_SW].write((val & 0x02) == 0);
s->buttons[BUTTON_EMAIL_SW].write((val & 0x04) == 0);
s->buttons[BUTTON_COPY_SW].write((val & 0x08) == 0);
break;
case GPO_CS4400F:
case GPO_CS8400F:
default:
break;
}
return status;

Wyświetl plik

@ -2726,14 +2726,10 @@ gl846_update_hardware_sensors (Genesys_Scanner * s)
}
RIE (sanei_genesys_read_register (s->dev, REG6D, &val));
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
s->val[OPT_SCAN_SW].b = (val & scan) == 0;
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
s->val[OPT_FILE_SW].b = (val & file) == 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;
s->buttons[BUTTON_SCAN_SW].write((val & scan) == 0);
s->buttons[BUTTON_FILE_SW].write((val & file) == 0);
s->buttons[BUTTON_EMAIL_SW].write((val & email) == 0);
s->buttons[BUTTON_COPY_SW].write((val & copy) == 0);
return status;
}

Wyświetl plik

@ -2832,14 +2832,10 @@ gl847_update_hardware_sensors (Genesys_Scanner * s)
}
RIE (sanei_genesys_read_register (s->dev, REG6D, &val));
if (s->val[OPT_SCAN_SW].b == s->last_val[OPT_SCAN_SW].b)
s->val[OPT_SCAN_SW].b = (val & scan) == 0;
if (s->val[OPT_FILE_SW].b == s->last_val[OPT_FILE_SW].b)
s->val[OPT_FILE_SW].b = (val & file) == 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;
s->buttons[BUTTON_SCAN_SW].write((val & scan) == 0);
s->buttons[BUTTON_FILE_SW].write((val & file) == 0);
s->buttons[BUTTON_EMAIL_SW].write((val & email) == 0);
s->buttons[BUTTON_COPY_SW].write((val & copy) == 0);
return status;
}

Wyświetl plik

@ -983,13 +983,7 @@ typedef struct Genesys_Command_Set
SANE_Status (*bulk_read_data) (Genesys_Device * dev, uint8_t addr,
uint8_t * data, size_t len);
/* 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.
*/
// Updates hardware sensor information in Genesys_Scanner.val[].
SANE_Status (*update_hardware_sensors) (struct Genesys_Scanner * s);
/* functions for sheetfed scanners */