diff --git a/backend/plustek-usbcal.c b/backend/plustek-usbcal.c index c56818e1a..d27f3e7d2 100644 --- a/backend/plustek-usbcal.c +++ b/backend/plustek-usbcal.c @@ -40,6 +40,10 @@ * - 0.48 - cleanup * - 0.49 - a_bRegs is now part of the device structure * - fixed lampsetting in cano_AdjustLightsource() + * - 0.50 - tried to use the settings from SANE-1.0.13 + * - added _TWEAK_GAIN to allow increasing GAIN during + * lamp coarse calibration + * - added also speedtest * * This file is part of the SANE package. * @@ -81,15 +85,20 @@ *
*/ -/** 0 for not ready, 1 pos white lamp on, 2 lamp off */ -static int strip_state=0; - +/* un-/comment the following to en-/disable lamp coarse calibration to tweak + * the initial AFE gain settings + */ +#define _TWEAK_GAIN 1 + +/** 0 for not ready, 1 pos white lamp on, 2 lamp off */ +static int strip_state = 0; + /** depending on the strip state, the sensor is moved to the shading position * and the lamp ist switched on */ static int cano_PrepareToReadWhiteCal( Plustek_Device *dev ) { - pHWDef hw = &dev->usbDev.HwSetting; + HWDef *hw = &dev->usbDev.HwSetting; switch (strip_state) { case 0: @@ -170,25 +179,24 @@ static int cano_LampOnAfterCalibration( Plustek_Device *dev ) } /** function to adjust the CIS lamp-off setting for a given channel. - * @param min - pointer to the ON point of the CIS-channel - * @param max - pointer to the max OFF point of the CIS-channel + * @param min - pointer to the min OFF point for the CIS-channel + * @param max - pointer to the max OFF point for the CIS-channel * @param off - pointer to the current OFF point of the CIS-channel * @param val - current value to check * @return returns 0 if the value is fine, 1, if we need to adjust */ -static int cano_adjLampSetting( u_short *min, - u_short *max, u_short *off, u_short val ) +static int +cano_adjLampSetting( u_short *min, u_short *max, u_short *off, u_short val ) { u_long newoff = *off; /* perfect value, no need to adjust - * val ¤ [53440..59440] is perfect + * val ¤ [53440..61440] is perfect */ - if((val < (IDEAL_GainNormal-2000)) && (val > (IDEAL_GainNormal-8000))) + if((val < (IDEAL_GainNormal)) && (val > (IDEAL_GainNormal-8000))) return 0; - if(val >= (IDEAL_GainNormal-2000)) { - + if(val >= (IDEAL_GainNormal-4000)) { DBG(_DBG_INFO2, "* TOO BRIGHT --> reduce\n" ); *max = newoff; *off = ((newoff + *min)>>1); @@ -271,7 +279,8 @@ static int cano_AdjustLightsource( Plustek_Device *dev ) DBG( _DBG_INFO2, "* Bytes = %lu\n", m_ScanParam.Size.dwBytes ); DBG( _DBG_INFO2, "* Origin.X = %u\n", m_ScanParam.Origin.x ); - max_rgb.Red = max_rgb.Green = max_rgb.Blue = 0xffff; + /* init... */ + max_rgb.Red = max_rgb.Green = max_rgb.Blue = 0x3fff; min_rgb.Red = hw->red_lamp_on; min_rgb.Green = hw->green_lamp_on; min_rgb.Blue = hw->blue_lamp_on; @@ -282,8 +291,10 @@ static int cano_AdjustLightsource( Plustek_Device *dev ) return SANE_TRUE; } - /* we probably should preset gain to some reasonably good value */ -#if 0 + /* we probably should preset gain to some reasonably good value + * i.e. 0x0a as it's done by Canon within their Windoze driver! + */ +#ifdef _TWEAK_GAIN for( i=0x3b; i<0x3e; i++ ) dev->usbDev.a_bRegs[i] = 0x0a; #endif @@ -332,13 +343,13 @@ static int cano_AdjustLightsource( Plustek_Device *dev ) if( hw->bReg_0x26 & _ONE_CH_COLOR ) { dwR += ((u_short*)scanbuf)[dw]; dwG += ((u_short*)scanbuf) - [dw+m_ScanParam.Size.dwPhyPixels+1]; + [dw+m_ScanParam.Size.dwPhyPixels+1]; dwB += ((u_short*)scanbuf) - [dw+(m_ScanParam.Size.dwPhyPixels+1)*2]; + [dw+(m_ScanParam.Size.dwPhyPixels+1)*2]; } else { - dwR += ((pRGBUShortDef)scanbuf)[dw].Red; - dwG += ((pRGBUShortDef)scanbuf)[dw].Green; - dwB += ((pRGBUShortDef)scanbuf)[dw].Blue; + dwR += ((RGBUShortDef*)scanbuf)[dw].Red; + dwG += ((RGBUShortDef*)scanbuf)[dw].Green; + dwB += ((RGBUShortDef*)scanbuf)[dw].Blue; } } else { dwG += ((u_short*)scanbuf)[dw]; @@ -388,9 +399,6 @@ static int cano_AdjustLightsource( Plustek_Device *dev ) res_g = cano_adjLampSetting( &min_rgb.Green, &max_rgb.Green, &hw->green_lamp_off, tmp_rgb.Green ); - /* need to be set in any case! */ - usb_AdjustLamps(dev); - /* nothing adjusted, so stop here */ if((res_r == 0) && (res_g == 0) && (res_b == 0)) break; @@ -402,18 +410,20 @@ static int cano_AdjustLightsource( Plustek_Device *dev ) break; /* we raise the gain for channel, that have been limited */ +#ifdef _TWEAK_GAIN if( res_r == 10 ) { - if( dev->usbDev.a_bRegs[0x3b] < 0x0b) + if( dev->usbDev.a_bRegs[0x3b] < 0xf) dev->usbDev.a_bRegs[0x3b]++; } if( res_g == 10 ) { - if( dev->usbDev.a_bRegs[0x3c] < 0x0b) + if( dev->usbDev.a_bRegs[0x3c] < 0x0f) dev->usbDev.a_bRegs[0x3c]++; } if( res_b == 10 ) { - if( dev->usbDev.a_bRegs[0x3d] < 0x0b) + if( dev->usbDev.a_bRegs[0x3d] < 0x0f) dev->usbDev.a_bRegs[0x3d]++; } +#endif /* now decide what to do: * if we were too bright, we have to rerun the loop in any @@ -424,12 +434,8 @@ static int cano_AdjustLightsource( Plustek_Device *dev ) if( i >= 10 ) { DBG(_DBG_INFO, "* 10 times limit reached, still too dark!!!\n"); break; -#if 0 - } else { - DBG(_DBG_INFO2, "* CIS-Warmup, 1s!!!\n" ); - sleep( 1 ); -#endif } + usb_AdjustLamps(dev); } DBG( _DBG_INFO, "* red_lamp_on = %u\n", hw->red_lamp_on ); @@ -575,13 +581,13 @@ static SANE_Bool cano_AdjustGain( Plustek_Device *dev ) if( hw->bReg_0x26 & _ONE_CH_COLOR ) { dwR += ((u_short*)scanbuf)[dw]; dwG += ((u_short*)scanbuf) - [dw+m_ScanParam.Size.dwPhyPixels+1]; + [dw+m_ScanParam.Size.dwPhyPixels+1]; dwB += ((u_short*)scanbuf) - [dw+(m_ScanParam.Size.dwPhyPixels+1)*2]; + [dw+(m_ScanParam.Size.dwPhyPixels+1)*2]; } else { - dwR += ((pRGBUShortDef)scanbuf)[dw].Red; - dwG += ((pRGBUShortDef)scanbuf)[dw].Green; - dwB += ((pRGBUShortDef)scanbuf)[dw].Blue; + dwR += ((RGBUShortDef*)scanbuf)[dw].Red; + dwG += ((RGBUShortDef*)scanbuf)[dw].Green; + dwB += ((RGBUShortDef*)scanbuf)[dw].Blue; } } dwR = dwR / dwDiv; @@ -597,8 +603,8 @@ static SANE_Bool cano_AdjustGain( Plustek_Device *dev ) } DBG(_DBG_INFO2, "MAX(R,G,B)= 0x%04x(%u), 0x%04x(%u), 0x%04x(%u)\n", - max_rgb.Red, max_rgb.Red, max_rgb.Green, - max_rgb.Green, max_rgb.Blue, max_rgb.Blue ); + max_rgb.Red, max_rgb.Red, max_rgb.Green, + max_rgb.Green, max_rgb.Blue, max_rgb.Blue ); adj = cano_adjGainSetting(min , max ,dev->usbDev.a_bRegs+0x3b,max_rgb.Red ); adj += cano_adjGainSetting(min+1, max+1,dev->usbDev.a_bRegs+0x3c,max_rgb.Green); @@ -760,9 +766,9 @@ static int cano_AdjustOffset( Plustek_Device *dev ) scanbuf)[dw+(m_ScanParam.Size.dwPhyPixels+1)*2]; } else { - dwSum[0] += ((pRGBUShortDef)scanbuf)[dw].Red; - dwSum[1] += ((pRGBUShortDef)scanbuf)[dw].Green; - dwSum[2] += ((pRGBUShortDef)scanbuf)[dw].Blue; + dwSum[0] += ((RGBUShortDef*)scanbuf)[dw].Red; + dwSum[1] += ((RGBUShortDef*)scanbuf)[dw].Green; + dwSum[2] += ((RGBUShortDef*)scanbuf)[dw].Blue; } } @@ -815,8 +821,8 @@ static int cano_AdjustOffset( Plustek_Device *dev ) } if( m_ScanParam.bDataType == SCANDATATYPE_Color ) { - dev->usbDev.a_bRegs[0x38] = now[0]; - dev->usbDev.a_bRegs[0x39] = now[1]; + dev->usbDev.a_bRegs[0x38] = now[0]; + dev->usbDev.a_bRegs[0x39] = now[1]; dev->usbDev.a_bRegs[0x3a] = now[2]; } else { dev->usbDev.a_bRegs[0x38] = @@ -876,7 +882,7 @@ static SANE_Bool cano_AdjustDarkShading( Plustek_Device *dev ) usb_SetScanParameters( dev, &m_ScanParam ); if( usb_ScanBegin( dev, SANE_FALSE ) && - usb_ScanReadImage( dev, scanbuf, m_ScanParam.Size.dwTotalBytes)) { + usb_ScanReadImage( dev, scanbuf, m_ScanParam.Size.dwTotalBytes)) { dumpPic( tmp, scanbuf, m_ScanParam.Size.dwTotalBytes ); @@ -910,9 +916,9 @@ static SANE_Bool cano_AdjustDarkShading( Plustek_Device *dev ) for( j=0; jbReg_0x26 & _ONE_CH_COLOR ) { - red += *bufp; bufp+=step; - green += *bufp; bufp+=step; - blue += *bufp; bufp+=step; + red += *bufp; bufp+=step; + green += *bufp; bufp+=step; + blue += *bufp; bufp+=step; } else { red += bufp[0]; @@ -970,6 +976,9 @@ static SANE_Bool cano_AdjustDarkShading( Plustek_Device *dev ) a_wDarkShading, m_ScanParam.Size.dwPhyPixels * 2); } + usb_line_statistics( "Dark", a_wDarkShading, m_ScanParam.Size.dwPhyPixels, + scan->sParam.bDataType == SCANDATATYPE_Color?1:0); + DBG( _DBG_INFO, "cano_AdjustDarkShading() done\n" ); return SANE_TRUE; } @@ -1026,15 +1035,15 @@ static SANE_Bool cano_AdjustWhiteShading( Plustek_Device *dev ) dumpPicInit( &m_ScanParam, tmp ); if( usb_SetScanParameters( dev, &m_ScanParam ) && - usb_ScanBegin( dev, SANE_FALSE ) && - usb_ScanReadImage( dev, scanbuf, m_ScanParam.Size.dwTotalBytes)) { + usb_ScanBegin( dev, SANE_FALSE ) && + usb_ScanReadImage( dev, scanbuf, m_ScanParam.Size.dwTotalBytes)) { dumpPic( tmp, scanbuf, m_ScanParam.Size.dwTotalBytes ); if(usb_HostSwap()) usb_Swap((u_short *)scanbuf, m_ScanParam.Size.dwTotalBytes); - if (!usb_ScanEnd( dev )){ + if (!usb_ScanEnd( dev )) { DBG( _DBG_ERROR, "cano_AdjustWhiteShading() failed\n" ); return SANE_FALSE; } @@ -1065,28 +1074,26 @@ static SANE_Bool cano_AdjustWhiteShading( Plustek_Device *dev ) for( j=0; jbReg_0x26 & _ONE_CH_COLOR ) { - red += *bufp; bufp+=step; - green += *bufp; bufp+=step; - blue += *bufp; bufp+=step; + red += *bufp; bufp+=step; + green += *bufp; bufp+=step; + blue += *bufp; bufp+=step; } else { - red += bufp[0]; green += bufp[1]; blue += bufp[2]; - - bufp += step; + bufp += step; } } /* tweaked by the settings in swGain --> 1000/swGain[r,g,b] */ - red = (65535.*1000./param->swGain[0]) * 16384.*m_ScanParam.Size.dwPhyLines/red; - green = (65535.*1000./param->swGain[1]) * 16384.*m_ScanParam.Size.dwPhyLines/green; - blue = (65535.*1000./param->swGain[2]) * 16384.*m_ScanParam.Size.dwPhyLines/blue; + red = (65535.*1000./(double)param->swGain[0]) * 16384.*j/red; + green = (65535.*1000./(double)param->swGain[1]) * 16384.*j/green; + blue = (65535.*1000./(double)param->swGain[2]) * 16384.*j/blue; a_wWhiteShading[i] = (red > 65535 ? 65535:red ); a_wWhiteShading[i+stepW] = (green > 65535 ? 65535:green); a_wWhiteShading[i+stepW*2] = (blue > 65535 ? 65535:blue ); - } + } if(usb_HostSwap()) usb_Swap(a_wWhiteShading, m_ScanParam.Size.dwPhyPixels * 2 * 3 ); @@ -1101,7 +1108,7 @@ static SANE_Bool cano_AdjustWhiteShading( Plustek_Device *dev ) gray += *bufp; bufp+=step; } - gray = (65535.*1000./param->swGain[0]) * 16384.*j/gray; + gray = (65535.*1000./(double)param->swGain[0]) * 16384.*j/gray; a_wWhiteShading[i]= (gray > 65535 ? 65535:gray); } @@ -1114,6 +1121,9 @@ static SANE_Bool cano_AdjustWhiteShading( Plustek_Device *dev ) a_wWhiteShading, m_ScanParam.Size.dwPhyPixels * 2); } + usb_line_statistics( "White", a_wWhiteShading, m_ScanParam.Size.dwPhyPixels, + scan->sParam.bDataType == SCANDATATYPE_Color?1:0); + DBG( _DBG_INFO, "cano_AdjustWhiteShading() done\n" ); return SANE_TRUE; } @@ -1143,6 +1153,8 @@ static int cano_DoCalibration( Plustek_Device *dev ) scaps->workaroundFlag &= ~_WAF_SKIP_FINE; scaps->workaroundFlag &= ~_WAF_BYPASS_CALIBRATION; + usb_SpeedTest( dev ); + /* Set the shading position to undefined */ strip_state = 0; usb_PrepareCalibration( dev ); @@ -1232,4 +1244,4 @@ static int cano_DoCalibration( Plustek_Device *dev ) return SANE_TRUE; } -/* END PLUSTEK-USBCAL.C_.....................................................*/ +/* END PLUSTEK-USBCAL.C .....................................................*/