[sane-devel] [PATCH 09/10] epjitsu: refactor coarsecal()
Hiroshi Miura
miurahr at linux.com
Sun Nov 4 10:38:53 UTC 2012
Now refactoring coarsecal() for S1100 support.
it is carefully changed not to break S300/1300/1500.
the chunk come from http://ubuntuforums.org/showthread.php?t=1678335
Signed-off-by: Hiroshi Miura <miurahr at linux.com>
---
backend/epjitsu.c | 333 +++++++++++++++++++++++++----------------------------
1 file changed, 160 insertions(+), 173 deletions(-)
diff --git a/backend/epjitsu.c b/backend/epjitsu.c
index 9bcd1eb..91b0d59 100644
--- a/backend/epjitsu.c
+++ b/backend/epjitsu.c
@@ -2399,43 +2399,123 @@ setup_buffers(struct scanner *s)
*/
static SANE_Status
-coarsecal(struct scanner *s)
+coarsecal_send_cal(struct scanner *s, unsigned char *pay)
{
SANE_Status ret = SANE_STATUS_GOOD;
-
- size_t cmdLen = 2;
unsigned char cmd[2];
-
- size_t statLen = 1;
unsigned char stat[1];
+ size_t cmdLen,statLen,payLen;
+
+ DBG (5, "coarsecal_send_cal: start\n");
+ /* send coarse cal (c6) */
+ cmd[0] = 0x1b;
+ cmd[1] = 0xc6;
+ cmdLen = 2;
+ stat[0] = 0;
+ statLen = 1;
+
+ ret = do_cmd(
+ s, 0,
+ cmd, cmdLen,
+ NULL, 0,
+ stat, &statLen
+ );
+ if(ret){
+ DBG (5, "coarsecal_send_cal: error sending c6 cmd\n");
+ return ret;
+ }
+ if(stat[0] != 6){
+ DBG (5, "coarsecal_send_cal: cmd bad c6 status?\n");
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /*send coarse cal payload*/
+ stat[0] = 0;
+ statLen = 1;
+ payLen = 28;
- size_t payLen = 28;
- unsigned char pay[28];
+ ret = do_cmd(
+ s, 0,
+ pay, payLen,
+ NULL, 0,
+ stat, &statLen
+ );
+ if(ret){
+ DBG (5, "coarsecal_send_cal: error sending c6 payload\n");
+ return ret;
+ }
+ if(stat[0] != 6){
+ DBG (5, "coarsecal_send_cal: c6 payload bad status?\n");
+ return SANE_STATUS_IO_ERROR;
+ }
- int try_count, cal_good[2], x, i, j;
- int param[2], zcount[2], high_param[2], low_param[2], avg[2], maxval[2];
- int rgb_avg[2][3], rgb_hicount[2][3];
+ DBG (5, "coarsecal_send_cal: finish\n");
+ return ret;
+}
- DBG (10, "coarsecal: start\n");
+static SANE_Status
+coarsecal_get_line(struct scanner *s, struct image *img)
+{
+ SANE_Status ret = SANE_STATUS_GOOD;
+ unsigned char cmd[2];
+ unsigned char stat[1];
+ size_t cmdLen,statLen;
- if(s->model == MODEL_S300){
- memcpy(pay,coarseCalData_S300,payLen);
- }
- else{
- memcpy(pay,coarseCalData_FI60F,payLen);
- }
+ DBG (5, "coarsecal_get_line: start\n");
- /* ask for 1 line */
- ret = set_window(s, WINDOW_COARSECAL);
+ /* send scan d2 command */
+ cmd[0] = 0x1b;
+ cmd[1] = 0xd2;
+ cmdLen = 2;
+ stat[0] = 0;
+ statLen = 1;
+
+ ret = do_cmd(
+ s, 0,
+ cmd, cmdLen,
+ NULL, 0,
+ stat, &statLen
+ );
if(ret){
- DBG (5, "coarsecal: error sending setwindow\n");
+ DBG (5, "coarsecal_get_line: error sending d2 cmd\n");
return ret;
}
+ if(stat[0] != 6){
+ DBG (5, "coarsecal_get_line: cmd bad d2 status?\n");
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ s->cal_image.image = img;
+ update_transfer_totals(&s->cal_image);
+
+ while(!s->cal_image.done){
+ ret = read_from_scanner(s,&s->cal_image);
+ if(ret){
+ DBG (5, "coarsecal_get_line: cant read from scanner\n");
+ return ret;
+ }
+ }
+ /* convert the raw data into normal packed pixel data */
+ descramble_raw(s, &s->cal_image);
+
+ DBG (5, "coarsecal_get_line: finish\n");
+ return ret;
+}
+
+static SANE_Status
+coarsecal_dark(struct scanner *s, unsigned char *pay)
+{
+ SANE_Status ret = SANE_STATUS_GOOD;
+
+ int try_count, cal_good[2], x, j;
+ int param[2], zcount[2], high_param[2], low_param[2], avg[2], maxval[2];
+
+ DBG (5, "coarsecal_dark: start\n");
/* dark cal, lamp off */
ret = lamp(s,0);
if(ret){
- DBG (5, "coarsecal: error lamp off\n");
+ DBG (5, "coarsecal_dark: error lamp off\n");
return ret;
}
@@ -2462,81 +2542,11 @@ coarsecal(struct scanner *s)
pay[9] = param[0];
}
- /* send coarse cal (c6) */
- cmd[0] = 0x1b;
- cmd[1] = 0xc6;
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- cmd, cmdLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending c6 cmd\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: cmd bad c6 status?\n");
- return SANE_STATUS_IO_ERROR;
- }
-
- /*send coarse cal payload*/
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- pay, payLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending c6 payload\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: c6 payload bad status?\n");
- return SANE_STATUS_IO_ERROR;
- }
+ ret = coarsecal_send_cal(s, pay);
- DBG(15, "coarsecal offset: parameter front: %i back: %i\n", param[0], param[1]);
+ DBG(15, "coarsecal_dark offset: parameter front: %i back: %i\n", param[0], param[1]);
- /* send scan d2 command */
- cmd[0] = 0x1b;
- cmd[1] = 0xd2;
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- cmd, cmdLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending d2 cmd\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: cmd bad d2 status?\n");
- return SANE_STATUS_IO_ERROR;
- }
-
- s->cal_image.image = &s->coarsecal;
- update_transfer_totals(&s->cal_image);
-
- while(!s->cal_image.done){
- ret = read_from_scanner(s,&s->cal_image);
- if(ret){
- DBG (5, "coarsecal: cant read from scanner\n");
- return ret;
- }
- }
- /* convert the raw data into normal packed pixel data */
- descramble_raw(s, &s->cal_image);
+ ret = coarsecal_get_line(s, &s->coarsecal);
/* gather statistics: count the proportion of 0-valued pixels */
/* since the lamp is off, there's no point in looking at the green or blue data - they're all from the same sensor anyway */
@@ -2560,9 +2570,9 @@ coarsecal(struct scanner *s)
avg[j] /= s->coarsecal.width_bytes;
zcount[j] = zcount[j] * 1000 / s->coarsecal.width_bytes;
}
- DBG(15, "coarsecal offset: average pixel values front: %i back: %i\n", avg[0], avg[1]);
- DBG(15, "coarsecal offset: maximum pixel values front: %i back: %i\n", maxval[0], maxval[1]);
- DBG(15, "coarsecal offset: 0-valued pixel count front: %f%% back: %f%%\n", zcount[0] / 10.0f, zcount[1] / 10.0f);
+ DBG(15, "coarsecal_dark offset: average pixel values front: %i back: %i\n", avg[0], avg[1]);
+ DBG(15, "coarsecal_dark offset: maximum pixel values front: %i back: %i\n", maxval[0], maxval[1]);
+ DBG(15, "coarsecal_dark offset: 0-valued pixel count front: %f%% back: %f%%\n", zcount[0] / 10.0f, zcount[1] / 10.0f);
/* check the values, adjust parameters if they are not within the target range */
for (j = 0; j < s->coarsecal.pages; j++)
@@ -2586,10 +2596,25 @@ coarsecal(struct scanner *s)
} /* continue looping for up to 8 tries */
+ DBG (5, "coarsecal_dark: finish\n");
+ return ret;
+}
+
+static SANE_Status
+coarsecal_light(struct scanner *s, unsigned char *pay)
+{
+ SANE_Status ret = SANE_STATUS_GOOD;
+
+ int try_count, cal_good[2], x, i, j;
+ int param[2], zcount[2], high_param[2], low_param[2], avg[2];
+ int rgb_avg[2][3], rgb_hicount[2][3];
+
+ DBG (5, "coarsecal_light: start\n");
+
/* light cal, lamp on */
ret = lamp(s,1);
if(ret){
- DBG (5, "coarsecal: error lamp on\n");
+ DBG (5, "coarsecal_light: error lamp on\n");
return ret;
}
@@ -2603,82 +2628,12 @@ coarsecal(struct scanner *s)
while (try_count > 0){
try_count--;
- /* send coarse cal (c6) */
- cmd[0] = 0x1b;
- cmd[1] = 0xc6;
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- cmd, cmdLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending c6 cmd\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: cmd bad c6 status?\n");
- return SANE_STATUS_IO_ERROR;
- }
-
- /*send coarse cal payload*/
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- pay, payLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending c6 payload\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: c6 payload bad status?\n");
- return SANE_STATUS_IO_ERROR;
- }
+ ret = coarsecal_send_cal(s, pay);
- DBG(15, "coarsecal gain: parameter front: %i back: %i\n", param[0], param[1]);
+ DBG(15, "coarsecal_light gain: parameter front: %i back: %i\n", param[0], param[1]);
- /* send scan d2 command */
- cmd[0] = 0x1b;
- cmd[1] = 0xd2;
- stat[0] = 0;
- statLen = 1;
+ ret = coarsecal_get_line(s, &s->coarsecal);
- ret = do_cmd(
- s, 0,
- cmd, cmdLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending d2 cmd\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: cmd bad d2 status?\n");
- return SANE_STATUS_IO_ERROR;
- }
-
- s->cal_image.image = &s->coarsecal;
- update_transfer_totals(&s->cal_image);
-
- while(!s->cal_image.done){
- ret = read_from_scanner(s,&s->cal_image);
- if(ret){
- DBG (5, "coarsecal: cant read from scanner\n");
- return ret;
- }
- }
- /* convert the raw data into normal packed pixel data */
- descramble_raw(s, &s->cal_image);
-
/* gather statistics: count the proportion of 255-valued pixels in each color channel */
/* count the average pixel value in each color channel */
for (i = 0; i < s->coarsecal.pages; i++)
@@ -2718,9 +2673,9 @@ coarsecal(struct scanner *s)
}
zcount[i] = MAX3(rgb_hicount[i][0], rgb_hicount[i][1], rgb_hicount[i][2]);
}
- DBG(15, "coarsecal gain: average RGB values front: (%i,%i,%i) back: (%i,%i,%i)\n",
+ DBG(15, "coarsecal_light gain: average RGB values front: (%i,%i,%i) back: (%i,%i,%i)\n",
rgb_avg[0][0], rgb_avg[0][1], rgb_avg[0][2], rgb_avg[1][0], rgb_avg[1][1], rgb_avg[1][2]);
- DBG(15, "coarsecal gain: 255-valued pixel count front: (%g,%g,%g) back: (%g,%g,%g)\n",
+ DBG(15, "coarsecal_light gain: 255-valued pixel count front: (%g,%g,%g) back: (%g,%g,%g)\n",
rgb_hicount[0][0]/10.0f, rgb_hicount[0][1]/10.0f, rgb_hicount[0][2]/10.0f,
rgb_hicount[1][0]/10.0f, rgb_hicount[1][1]/10.0f, rgb_hicount[1][2]/10.0f);
@@ -2758,6 +2713,38 @@ coarsecal(struct scanner *s)
}
}
+ DBG (5, "coarsecal_light: finish\n");
+ return ret;
+}
+
+static SANE_Status
+coarsecal(struct scanner *s)
+{
+ SANE_Status ret = SANE_STATUS_GOOD;
+ unsigned char pay[28];
+ size_t payLen;
+
+ DBG (10, "coarsecal: start\n");
+
+ payLen = sizeof(pay);
+
+ if(s->model == MODEL_S300){
+ memcpy(pay,coarseCalData_S300,payLen);
+ }
+ else{
+ memcpy(pay,coarseCalData_FI60F,payLen);
+ }
+
+ /* ask for 1 line */
+ ret = set_window(s, WINDOW_COARSECAL);
+ if(ret){
+ DBG (5, "coarsecal: error sending setwindow\n");
+ return ret;
+ }
+
+ ret = coarsecal_dark(s, pay);
+ ret = coarsecal_light(s, pay);
+
DBG (10, "coarsecal: finish\n");
return ret;
}
--
1.7.9.5
More information about the sane-devel
mailing list