Hello! I'm added button support for gt68xx backend.

Sergey.


diff --git a/backend/genesys.c b/backend/genesys.c
index 7779fce9..b553ab0d 100644
--- a/backend/genesys.c
+++ b/backend/genesys.c
@@ -6088,8 +6088,9 @@ init_options (Genesys_Scanner * s)
   s->last_val[OPT_NEED_CALIBRATION_SW].b = 0;
 
   /* button group */
+  s->opt[OPT_BUTTON_GROUP].name = "Buttons";
   s->opt[OPT_BUTTON_GROUP].title = SANE_I18N ("Buttons");
-  s->opt[OPT_BUTTON_GROUP].desc = "";
+  s->opt[OPT_BUTTON_GROUP].desc = SANE_I18N ("Buttons");
   s->opt[OPT_BUTTON_GROUP].type = SANE_TYPE_GROUP;
   s->opt[OPT_BUTTON_GROUP].cap = SANE_CAP_ADVANCED;
   s->opt[OPT_BUTTON_GROUP].size = 0;
diff --git a/backend/gt68xx.c b/backend/gt68xx.c
index fb3bfb42..fc8cd172 100644
--- a/backend/gt68xx.c
+++ b/backend/gt68xx.c
@@ -114,6 +114,7 @@
 
 #include "gt68xx.h"
 #include "gt68xx_high.c"
+#include "gt68xx_low.h"
 #include "gt68xx_devices.c"
 
 static SANE_Int num_devices = 0;
@@ -748,6 +749,8 @@ init_options (GT68xx_Scanner * s)
   s->opt[OPT_SENSOR_GROUP].title = SANE_TITLE_SENSORS;
   s->opt[OPT_SENSOR_GROUP].desc = SANE_DESC_SENSORS;
   s->opt[OPT_SENSOR_GROUP].type = SANE_TYPE_GROUP;
+  s->opt[OPT_SENSOR_GROUP].cap = SANE_CAP_ADVANCED;
+  s->opt[OPT_SENSOR_GROUP].size = 0;
   s->opt[OPT_SENSOR_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
 
   /* calibration needed */
@@ -762,6 +765,73 @@ init_options (GT68xx_Scanner * s)
     s->opt[OPT_NEED_CALIBRATION_SW].cap = SANE_CAP_INACTIVE;
   s->val[OPT_NEED_CALIBRATION_SW].b = 0;
 
+  /* scanner buttons */
+  /* scan button */
+  s->opt[OPT_SCAN_SW].name = SANE_NAME_SCAN;
+  s->opt[OPT_SCAN_SW].title = SANE_TITLE_SCAN;
+  s->opt[OPT_SCAN_SW].desc = SANE_DESC_SCAN;
+  s->opt[OPT_SCAN_SW].type = SANE_TYPE_BOOL;
+  s->opt[OPT_SCAN_SW].unit = SANE_UNIT_NONE;
+  if (s->dev->model->buttons & GT68XX_HAS_SCAN_SW)
+    s->opt[OPT_SCAN_SW].cap = 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;
+
+  /* copy button */
+  s->opt[OPT_COPY_SW].name = SANE_NAME_COPY;
+  s->opt[OPT_COPY_SW].title = SANE_TITLE_COPY;
+  s->opt[OPT_COPY_SW].desc = SANE_DESC_COPY;
+  s->opt[OPT_COPY_SW].type = SANE_TYPE_BOOL;
+  s->opt[OPT_COPY_SW].unit = SANE_UNIT_NONE;
+  if (s->dev->model->buttons & GT68XX_HAS_COPY_SW)
+    s->opt[OPT_COPY_SW].cap =
+    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;
+
+  /* fax button */
+  s->opt[OPT_FAX_SW].name = SANE_NAME_FAX;
+  s->opt[OPT_FAX_SW].title = SANE_TITLE_FAX;
+  s->opt[OPT_FAX_SW].desc = SANE_DESC_FAX;
+  s->opt[OPT_FAX_SW].type = SANE_TYPE_BOOL;
+  s->opt[OPT_FAX_SW].unit = SANE_UNIT_NONE;
+  if (s->dev->model->buttons & GT68XX_HAS_FAX_SW)
+    s->opt[OPT_FAX_SW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
+  else
+    s->opt[OPT_FAX_SW].cap = SANE_CAP_INACTIVE;
+  s->val[OPT_FAX_SW].b = 0;
+  s->last_val[OPT_FAX_SW].b = 0;
+
+  /* email button */
+  s->opt[OPT_EMAIL_SW].name = SANE_NAME_EMAIL;
+  s->opt[OPT_EMAIL_SW].title = SANE_TITLE_EMAIL;
+  s->opt[OPT_EMAIL_SW].desc = SANE_DESC_EMAIL;
+  s->opt[OPT_EMAIL_SW].type = SANE_TYPE_BOOL;
+  s->opt[OPT_EMAIL_SW].unit = SANE_UNIT_NONE;
+  if (s->dev->model->buttons & GT68XX_HAS_EMAIL_SW)
+    s->opt[OPT_EMAIL_SW].cap = 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;
+
+  /* extra button */
+  s->opt[OPT_EXTRA_SW].name = "extra";
+  s->opt[OPT_EXTRA_SW].title = "Extra button";
+  s->opt[OPT_EXTRA_SW].desc = "Extra button";
+  s->opt[OPT_EXTRA_SW].type = SANE_TYPE_BOOL;
+  s->opt[OPT_EXTRA_SW].unit = SANE_UNIT_NONE;
+  if (s->dev->model->buttons & GT68XX_HAS_EXTRA_SW)
+    s->opt[OPT_EXTRA_SW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
+  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;
+
   /* document present sensor */
   s->opt[OPT_PAGE_LOADED_SW].name = SANE_NAME_PAGE_LOADED;
   s->opt[OPT_PAGE_LOADED_SW].title = SANE_TITLE_PAGE_LOADED;
@@ -776,10 +846,11 @@ init_options (GT68xx_Scanner * s)
   s->val[OPT_PAGE_LOADED_SW].b = 0;
 
   /* button group */
-  s->opt[OPT_BUTTON_GROUP].name = "Buttons";
-  s->opt[OPT_BUTTON_GROUP].title = SANE_I18N ("Buttons");
-  s->opt[OPT_BUTTON_GROUP].desc = SANE_I18N ("Buttons");
+  s->opt[OPT_BUTTON_GROUP].title = "Buttons";
+  s->opt[OPT_BUTTON_GROUP].desc = "";
   s->opt[OPT_BUTTON_GROUP].type = SANE_TYPE_GROUP;
+  s->opt[OPT_BUTTON_GROUP].cap = SANE_CAP_ADVANCED;
+  s->opt[OPT_BUTTON_GROUP].size = 0;
   s->opt[OPT_BUTTON_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
 
   /* calibrate button */
@@ -1715,6 +1786,16 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
         case OPT_PAGE_LOADED_SW:
           s->dev->model->command_set->document_present (s->dev, val);
           break;
+          /* sensors */
+        case OPT_SCAN_SW:
+       case OPT_COPY_SW:
+        case OPT_FAX_SW:
+       case OPT_EMAIL_SW:
+       case OPT_EXTRA_SW:
+          gt68xx_update_hardware_sensors (s);
+          *(SANE_Bool *) val = s->val[option].b;
+          s->last_val[option].b = *(SANE_Bool *) val;
+          break;
         default:
           DBG (2, "sane_control_option: can't get unknown option %d\n",
                option);
diff --git a/backend/gt68xx_devices.c b/backend/gt68xx_devices.c
index 2df24f6e..f9577e61 100644
--- a/backend/gt68xx_devices.c
+++ b/backend/gt68xx_devices.c
@@ -87,7 +87,8 @@ static GT68xx_Command_Set mustek_gt6816_command_set = {
   gt68xx_generic_set_exposure_time,
   gt68xx_generic_get_id,
   /* gt68xx_generic_move_paper */ NULL,
-  /* gt6816_document_present */ NULL
+  /* gt6816_document_present */ NULL,
+  gt6816_get_buttons,
 };
 
 static GT68xx_Command_Set mustek_gt6816_sheetfed_command_set = {
@@ -128,7 +129,8 @@ static GT68xx_Command_Set mustek_gt6816_sheetfed_command_set = {
   gt68xx_generic_set_exposure_time,
   gt68xx_generic_get_id,
   gt68xx_generic_move_paper,
-  gt6816_document_present
+  gt6816_document_present,
+  NULL, /* get_buttons */
 };
 
 static GT68xx_Command_Set mustek_gt6801_command_set = {
@@ -170,7 +172,8 @@ static GT68xx_Command_Set mustek_gt6801_command_set = {
   gt68xx_generic_set_exposure_time,
   gt68xx_generic_get_id,
   /* gt68xx_generic_move_paper */ NULL,
-  /* gt6816_document_present */ NULL
+  /* gt6816_document_present */ NULL,
+  /* gt6816_update_hardware_sensors */ NULL
 };
 
 static GT68xx_Command_Set plustek_gt6801_command_set = {
@@ -211,7 +214,8 @@ static GT68xx_Command_Set plustek_gt6801_command_set = {
   /* set_exposure_time */ NULL,
   gt68xx_generic_get_id,
   /* gt68xx_generic_move_paper */ NULL,
-  /* gt6816_document_present */ NULL
+  /* gt6816_document_present */ NULL,
+  /* gt6816_update_hardware_sensors */ NULL
 };
 
 static GT68xx_Model unknown_model = {
@@ -259,7 +263,8 @@ static GT68xx_Model unknown_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_NO_STOP		/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_NO_STOP,		/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Standard values for unknown scanner */
 };
 
@@ -307,7 +312,8 @@ static GT68xx_Model mustek_2400ta_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_SCAN_FROM_HOME	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_SCAN_FROM_HOME,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* flatbed values tested */
 };
 
@@ -356,7 +362,8 @@ static GT68xx_Model mustek_2400taplus_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_USE_OPTICAL_X | GT68XX_FLAG_SCAN_FROM_HOME	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_USE_OPTICAL_X | GT68XX_FLAG_SCAN_FROM_HOME,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Setup and tested */
 };
 
@@ -405,8 +412,9 @@ static GT68xx_Model mustek_2448taplus_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_NO_STOP		/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_NO_STOP,		/* Which flags are needed for this scanner? */
     /* Based on data from Jakub Dvořák <[email protected]>. */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
 };
 
 static GT68xx_Model mustek_1200ta_model = {
@@ -454,7 +462,8 @@ static GT68xx_Model mustek_1200ta_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  0				/* Which flags are needed for this scanner? */
+  0,				/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Setup for 1200 TA */
 };
 
@@ -503,7 +512,8 @@ static GT68xx_Model mustek_1200cuplus_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_NO_STOP		/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_NO_STOP,		/* Which flags are needed for this scanner? */
+  GT68XX_HAS_SCAN_SW | GT68XX_HAS_COPY_SW | GT68XX_HAS_FAX_SW | GT68XX_HAS_EMAIL_SW | GT68XX_HAS_EXTRA_SW /* 5 buttons */
     /* Tested by Hamersky Robert r.hamersky at utanet.at */
 };
 
@@ -552,7 +562,8 @@ static GT68xx_Model mustek_1200cuplus2_model = {
   SANE_FIX (1.5),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_NO_STOP		/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_NO_STOP,		/* Which flags are needed for this scanner? */
+  GT68XX_HAS_SCAN_SW | GT68XX_HAS_COPY_SW | GT68XX_HAS_FAX_SW | GT68XX_HAS_EMAIL_SW | GT68XX_HAS_EXTRA_SW /* 5 buttons */
     /* Tested by hmg */
 };
 
@@ -601,7 +612,8 @@ static GT68xx_Model mustek_2400cuplus_model = {
   SANE_FIX (1.5),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_NO_STOP		/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_NO_STOP,		/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Setup and tested */
 };
 
@@ -653,7 +665,8 @@ static GT68xx_Model mustek_1200cu_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  0				/* Which flags are needed for this scanner? */
+  0,				/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Setup and tested */
 };
 
@@ -702,8 +715,9 @@ static GT68xx_Model mustek_scanexpress1200ubplus_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  0				/* Which flags are needed for this scanner? */
+  0,				/* Which flags are needed for this scanner? */
     /* Setup and tested */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
 };
 
 static GT68xx_Model mustek_scanexpress1248ub_model = {
@@ -751,7 +765,8 @@ static GT68xx_Model mustek_scanexpress1248ub_model = {
   SANE_FIX (1.5),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_NO_STOP		/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_NO_STOP,		/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* tested by hmg */
 };
 
@@ -801,7 +816,8 @@ static GT68xx_Model artec_ultima2000_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_MIRROR_X | GT68XX_FLAG_MOTOR_HOME | GT68XX_FLAG_OFFSET_INV	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_MIRROR_X | GT68XX_FLAG_MOTOR_HOME | GT68XX_FLAG_OFFSET_INV,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Setup for Cytron TCM MD 9385 */
 };
 
@@ -850,7 +866,8 @@ static GT68xx_Model plustek_opticslim500plus_model = {
   SANE_FIX (1.5),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_NO_CALIBRATE	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_NO_CALIBRATE,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
 };
 
 static GT68xx_Model mustek_2400cu_model = {
@@ -898,7 +915,8 @@ static GT68xx_Model mustek_2400cu_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  0				/* Which flags are needed for this scanner? */
+  0,				/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* basically tested, details may need tweaking */
 };
 
@@ -947,7 +965,8 @@ static GT68xx_Model mustek_scanexpress2400usb_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_UNTESTED | GT68XX_FLAG_SE_2400	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_UNTESTED | GT68XX_FLAG_SE_2400,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* only partly tested, from "Fan Dan" <[email protected]> */
 };
 
@@ -996,7 +1015,8 @@ static GT68xx_Model mustek_a3usb_model = {
   SANE_FIX (1.5),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_CIS_LAMP 		/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_CIS_LAMP, 		/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Tested by hmg. This scanner is a bit strange as it uses a CIS sensor but
        it also has a lamp. So the lamp needs to be heated but CIS mode must be
        used for scanning and calibration. There is no TA for that scanner */
@@ -1047,7 +1067,8 @@ static GT68xx_Model lexmark_x73_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  0				/* Which flags are needed for this scanner? */
+  0,				/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* When using automatic gain pictures are too dark. Only some ad hoc tests for
        lexmark x70 were done so far. WARNING: Don't use the Full scan option
        with the above settings, otherwise the sensor may bump at the end of
@@ -1099,7 +1120,8 @@ static GT68xx_Model plustek_op1248u_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* tested */
 };
 
@@ -1149,8 +1171,9 @@ static GT68xx_Model plustek_u16b_model = {
 
   SANE_FALSE,			/* Is this a CIS scanner? */
   GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_NO_POWER_STATUS |
-    GT68XX_FLAG_NO_LINEMODE
+    GT68XX_FLAG_NO_LINEMODE,
     /* Which flags are needed for this scanner? */
+    GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Tested with a U16B by Henning Meier-Geinitz. 600 dpi is maximum
        vertically. Line mode does not work. That's a hardware/firmware
        issue. */
@@ -1201,7 +1224,8 @@ static GT68xx_Model plustek_ops12_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Seems to work */
 };
 
@@ -1250,8 +1274,9 @@ static GT68xx_Model plustek_ops24_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE
+  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE,
   				/* Which flags are needed for this scanner? */
+          GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Works (tested by Filip Kaluza). Based on genius Colorpage Vivid 1200 X. */
 };
 
@@ -1302,8 +1327,9 @@ static GT68xx_Model genius_vivid4_model = {
 
   SANE_FALSE,			/* Is this a CIS scanner? */
   GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_NO_POWER_STATUS |
-    GT68XX_FLAG_NO_LINEMODE
+    GT68XX_FLAG_NO_LINEMODE,
     /* Which flags are needed for this scanner? */
+    GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* This scanner seems to be very similar to Plustelk U16B and is reported to work. */
 };
 
@@ -1353,7 +1379,8 @@ static GT68xx_Model genius_vivid3x_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Tested to some degree, based on the Plustek OpticPro 1248U */
 };
 
@@ -1402,7 +1429,8 @@ static GT68xx_Model genius_vivid4x_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Is reported to work, copied from 3x, some values from Claudio Filho <[email protected]> */
 };
 
@@ -1451,7 +1479,8 @@ static GT68xx_Model genius_vivid4xe_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* tested a bit */
 };
 
@@ -1500,7 +1529,8 @@ static GT68xx_Model genius_vivid3xe_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* mostly untested, based on the Genius Vivid3x */
 };
 
@@ -1549,8 +1579,9 @@ static GT68xx_Model genius_vivid1200x_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE
+  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE,
   				/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Tested. */
 };
 
@@ -1600,7 +1631,8 @@ static GT68xx_Model genius_vivid1200xe_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_FALSE,			/* Is this a CIS scanner? */
-  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE	/* Which flags are needed for this scanner? */
+  GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_ALWAYS_LINEMODE,	/* Which flags are needed for this scanner? */
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
     /* Tested by hmg */
 };
 
@@ -1650,7 +1682,8 @@ static GT68xx_Model iriscan_express_2_model = {
   SANE_FIX (2.0),			/* Default gamma value */
 
   SANE_TRUE,				/* Is this a CIS scanner? */
-  GT68XX_FLAG_NO_POWER_STATUS | GT68XX_FLAG_SHEET_FED | GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_HAS_CALIBRATE
+  GT68XX_FLAG_NO_POWER_STATUS | GT68XX_FLAG_SHEET_FED | GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_HAS_CALIBRATE,
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
 };
 
 
@@ -1699,7 +1732,8 @@ static GT68xx_Model plustek_opticslim_m12_model = {
   SANE_FIX (2.0),			/* Default gamma value */
 
   SANE_TRUE,				/* Is this a CIS scanner? */
-  GT68XX_FLAG_NO_POWER_STATUS | GT68XX_FLAG_SHEET_FED | GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_HAS_CALIBRATE
+  GT68XX_FLAG_NO_POWER_STATUS | GT68XX_FLAG_SHEET_FED | GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_HAS_CALIBRATE,
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
 };
 
 static GT68xx_Model genius_sf600_model = {
@@ -1747,7 +1781,8 @@ static GT68xx_Model genius_sf600_model = {
   SANE_FIX (2.0),			/* Default gamma value */
 
   SANE_TRUE,				/* Is this a CIS scanner? */
-  GT68XX_FLAG_NO_POWER_STATUS | GT68XX_FLAG_UNTESTED | GT68XX_FLAG_SHEET_FED | GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_HAS_CALIBRATE | GT68XX_FLAG_NO_STOP
+  GT68XX_FLAG_NO_POWER_STATUS | GT68XX_FLAG_UNTESTED | GT68XX_FLAG_SHEET_FED | GT68XX_FLAG_OFFSET_INV | GT68XX_FLAG_HAS_CALIBRATE | GT68XX_FLAG_NO_STOP,
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
 };
 
 /* Untested but should work according to Ryan Reading <[email protected]>. Based on Plustek M12 */
@@ -1797,7 +1832,8 @@ static GT68xx_Model plustek_opticslim1200_model = {
   SANE_FIX (2.0),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  0
+  0,
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
 };
 
 static GT68xx_Model plustek_opticslim2400_model = {
@@ -1845,7 +1881,8 @@ static GT68xx_Model plustek_opticslim2400_model = {
   SANE_FIX (1.5),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  0
+  0,
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
 /* By Detlef Gausepohl <[email protected]>. Fixed and tested by hmg. */
 };
 
@@ -1894,7 +1931,8 @@ static GT68xx_Model visioneer_onetouch_7300_model = {
   SANE_FIX (1.5),		/* Default gamma value */
 
   SANE_TRUE,			/* Is this a CIS scanner? */
-  0
+  0,
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
 };
 
 /* Tested by Jason Novek. Based on Plustek OpticSlim 2400. */
@@ -1947,7 +1985,8 @@ static GT68xx_Model genius_colorpageslim_1200_model = {
   SANE_FIX (1.5),               /* Default gamma value */
 
   SANE_TRUE,                    /* Is this a CIS scanner? */
-  GT68XX_FLAG_ALWAYS_LINEMODE | GT68XX_FLAG_SE_2400
+  GT68XX_FLAG_ALWAYS_LINEMODE | GT68XX_FLAG_SE_2400,
+  GT68XX_HAS_NO_BUTTONS /* no buttons by default */
 };
 /* tested by  Aleksey Nedorezov <aleksey at nedorezov.com> */
 
diff --git a/backend/gt68xx_gt6816.c b/backend/gt68xx_gt6816.c
index a7880bdb..9bf796b7 100644
--- a/backend/gt68xx_gt6816.c
+++ b/backend/gt68xx_gt6816.c
@@ -88,6 +88,7 @@ gt6816_download_firmware (GT68xx_Device * dev,
   SANE_Byte *block;
   SANE_Word addr, bytes_left;
   GT68xx_Packet boot_req;
+  GT68xx_Packet pool_start;
   SANE_Word block_size = MAX_DOWNLOAD_BLOCK_SIZE;
 
   CHECK_DEV_ACTIVE (dev, "gt6816_download_firmware");
@@ -119,7 +120,9 @@ gt6816_download_firmware (GT68xx_Device * dev,
   boot_req[2] = LOBYTE (addr);
   boot_req[3] = HIBYTE (addr);
   RIE (gt68xx_device_req (dev, boot_req, boot_req));
-
+  pool_start[0] = 0x71;
+  pool_start[1] = 0x01;
+  RIE (gt68xx_device_req (dev, pool_start, pool_start));
   return SANE_STATUS_GOOD;
 }
 
@@ -247,7 +250,7 @@ gt6816_document_present (GT68xx_Device * dev, SANE_Bool * present)
   req[0] = 0x59;
   req[1] = 0x01;
 
-  RIE (gt68xx_device_req (dev, req, req));
+  RIE (gt68xx_device_small_req (dev, req, req));
 
   if (req[0] == 0x00 && req[1] == 0x59)
     {
@@ -261,3 +264,23 @@ gt6816_document_present (GT68xx_Device * dev, SANE_Bool * present)
 
   return SANE_STATUS_GOOD;
 }
+
+SANE_Status
+gt6816_get_buttons (GT68xx_Device * dev, SANE_Word * b_state)
+{
+  SANE_Status status;
+  GT68xx_Packet req;
+
+  memset (req, 0, sizeof (req));
+  req[0] = 0x74;
+  req[1] = 0x01;
+
+  RIE (gt68xx_device_small_req (dev, req, req));
+
+  if (req[0] == 0x00 && req[1] == 0x74)
+      *b_state = req[2];
+  else
+    return SANE_STATUS_IO_ERROR;
+
+  return SANE_STATUS_GOOD;
+}
diff --git a/backend/gt68xx_gt6816.h b/backend/gt68xx_gt6816.h
index f9418113..b89fa46a 100644
--- a/backend/gt68xx_gt6816.h
+++ b/backend/gt68xx_gt6816.h
@@ -68,5 +68,6 @@ static SANE_Status gt6816_carriage_home (GT68xx_Device * dev);
 static SANE_Status gt6816_stop_scan (GT68xx_Device * dev);
 
 static SANE_Status gt6816_document_present (GT68xx_Device * dev, SANE_Bool * present);
+static SANE_Status gt6816_get_buttons (GT68xx_Device * dev, SANE_Word * b_state);
 
 #endif /* not GT68XX_GT6816_H */
diff --git a/backend/gt68xx_high.c b/backend/gt68xx_high.c
index 782b4f36..af5c679f 100644
--- a/backend/gt68xx_high.c
+++ b/backend/gt68xx_high.c
@@ -463,6 +463,35 @@ gt68xx_scanner_wait_for_positioning (GT68xx_Scanner * scanner)
   return SANE_STATUS_GOOD;
 }
 
+static SANE_Status
+gt68xx_update_hardware_sensors (GT68xx_Scanner * s)
+{
+  /* do what is needed to get a new set of events, but try to not lose
+     any of them.
+   */
+  SANE_Status status = SANE_STATUS_GOOD;
+  SANE_Word val;
+  uint8_t scan, fax, email, copy, extra;
+  scan=0x10;
+  email=0x08;
+  copy=0x04;
+  extra=0x01;
+	fax=0x02;
+
+  status = gt68xx_device_get_buttons(s->dev, &val);
+	if (status == SANE_STATUS_GOOD)
+     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_FAX_SW].b == s->last_val[OPT_FAX_SW].b)
+       s->val[OPT_FAX_SW].b = (val & fax) == 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;
+		 if (s->val[OPT_EXTRA_SW].b == s->last_val[OPT_EXTRA_SW].b)
+	     s->val[OPT_EXTRA_SW].b = (val & extra) == 0;
+  return status;
+}
 
 static SANE_Status
 gt68xx_scanner_internal_start_scan (GT68xx_Scanner * scanner)
diff --git a/backend/gt68xx_high.h b/backend/gt68xx_high.h
index da4ab6a6..7fb453f4 100644
--- a/backend/gt68xx_high.h
+++ b/backend/gt68xx_high.h
@@ -231,6 +231,11 @@ enum GT68xx_Option
 
   OPT_SENSOR_GROUP,
   OPT_NEED_CALIBRATION_SW,      /* signals calibration is needed */
+  OPT_SCAN_SW,                  /* csan button */
+  OPT_EMAIL_SW,                 /* email button */
+  OPT_COPY_SW,                  /* copy button */
+  OPT_FAX_SW,                   /* fax button */
+  OPT_EXTRA_SW,                 /* extra button */
   OPT_PAGE_LOADED_SW,           /* signals that a document is inserted in feeder */
 
   OPT_BUTTON_GROUP,
@@ -260,6 +265,7 @@ struct GT68xx_Scanner
   SANE_Bool scanning;			   /**< We are currently scanning */
   SANE_Option_Descriptor opt[NUM_OPTIONS]; /**< Option descriptors */
   Option_Value val[NUM_OPTIONS];	   /**< Option values */
+  Option_Value last_val[NUM_OPTIONS];	   /**< Option values as read by the frontend. used for sensors. */
   SANE_Parameters params;		   /**< SANE Parameters */
   SANE_Int line;			   /**< Current line */
   SANE_Int total_bytes;			   /**< Bytes already transmitted */
@@ -369,6 +375,8 @@ static SANE_Status gt68xx_write_calibration (GT68xx_Scanner * scanner);
  */
 static SANE_Status gt68xx_read_calibration (GT68xx_Scanner * scanner);
 
+static SANE_Status gt68xx_update_hardware_sensors (GT68xx_Scanner * s);
+
 #endif /* not GT68XX_HIGH_H */
 
 /* vim: set sw=2 cino=>2se-1sn-1s{s^-1st0(0u0 smarttab expandtab: */
diff --git a/backend/gt68xx_low.c b/backend/gt68xx_low.c
index 3ea45900..6ff0cd4a 100644
--- a/backend/gt68xx_low.c
+++ b/backend/gt68xx_low.c
@@ -1023,6 +1023,16 @@ gt68xx_device_get_id (GT68xx_Device * dev)
     return SANE_STATUS_UNSUPPORTED;
 }
 
+SANE_Status
+gt68xx_device_get_buttons (GT68xx_Device * dev, SANE_Word * b_state)
+{
+  CHECK_DEV_ACTIVE (dev, "gt68xx_device_get_buttons");
+  if (dev->model->command_set->get_buttons)
+    return (*dev->model->command_set->get_buttons) (dev, b_state);
+  else
+    return SANE_STATUS_UNSUPPORTED;
+}
+
 static void
 gt68xx_device_fix_descriptor (GT68xx_Device * dev)
 {
diff --git a/backend/gt68xx_low.h b/backend/gt68xx_low.h
index 89bd3657..3b5c0d49 100644
--- a/backend/gt68xx_low.h
+++ b/backend/gt68xx_low.h
@@ -110,11 +110,15 @@
 #define GT68XX_FLAG_USE_OPTICAL_X   (1 << 10)	/* Use optical xdpi for 50 dpi and below */
 #define GT68XX_FLAG_ALWAYS_LINEMODE (1 << 11)	/* Linemode must be used for any resolution */
 #define GT68XX_FLAG_SHEET_FED       (1 << 12)	/* we have a sheet fed scanner */
-#define GT68XX_FLAG_HAS_CALIBRATE   (1 << 13)	/* for sheet fed scanners that be calibrated with
-                                                   an calibration sheet */
+#define GT68XX_FLAG_HAS_CALIBRATE   (1 << 13)	 /* for sheet fed scanners that be calibrated with an calibration sheet */
 #define GT68XX_FLAG_NO_CALIBRATE   (1 << 14)	/* don't calibrate, because calibration is broken */
-
-
+#define GT68XX_HAS_NO_BUTTONS       0              /**< scanner has no supported button */
+#define GT68XX_HAS_SCAN_SW          (1 << 0)       /**< scanner has SCAN button */
+#define GT68XX_HAS_COPY_SW          (1 << 1)       /**< scanner has COPY button */
+#define GT68XX_HAS_FAX_SW           (1 << 2)       /**< scanner has FAX button */
+#define GT68XX_HAS_EMAIL_SW         (1 << 3)       /**< scanner has EMAIL button */
+#define GT68XX_HAS_PAGE_LOADED_SW   (1 << 4)       /**< scanner has paper in detection */
+#define GT68XX_HAS_EXTRA_SW         (1 << 5)       /**< scanner has extra function button */
 
 /* Forward typedefs */
 typedef struct GT68xx_USB_Device_Entry GT68xx_USB_Device_Entry;
@@ -408,6 +412,7 @@ struct GT68xx_Command_Set
     SANE_Status (*document_present) (GT68xx_Device * dev,
 			             SANE_Bool *present);
   /*@} */
+    SANE_Status (*get_buttons) (GT68xx_Device * dev, SANE_Word * b_state);
 };
 
 #define MAX_RESOLUTIONS 12
@@ -489,6 +494,8 @@ struct GT68xx_Model
   SANE_Bool is_cis;		/* Is this a CIS or CCD scanner? */
 
   SANE_Word flags;		/* Which hacks are needed for this scanner? */
+
+  SANE_Word buttons;  /* buttons flags */
   /*@} */
 };
 

Attachment: signature.asc
Description: OpenPGP digital signature

-- 
sane-devel mailing list: [email protected]
https://alioth-lists.debian.net/cgi-bin/mailman/listinfo/sane-devel
Unsubscribe: Send mail with subject "unsubscribe your_password"
             to [email protected]

Reply via email to