ok, lets resume all of this i converted the python program in java, its more habitual to manipulate this language for me i combined every modes, color, grayscale and bw, all in 75ppp resolution with 2 different size *full plate a4+a little margin *semi sized a5 manually resized in paintbrush scan for the moment i really dont know how to interpret the 3 to 10 billions bytes i receive
actual results of the program: motor do the travel, light goes on yellow for bw and grayscale, and more lightening blue light in color scan it give datas, stop at the end in a4, stop at the middle in a5, and then, return at idle position results sent and received were compared succesfully with windows xp original values heres the work public class maine {static boolean continuer=true; private static DeviceHandle handle; static boolean grayscalePreview=true, colorPreview=false, blackPreview=false, sizeA4 = false; //75 ppp quality public static void main(String[] args) { getUsb(); send(new byte[]{3,9,1}); read(handle,1 );//start signal return 0x00 send(new byte[]{3,13,11}); read(handle,11 );//start signal return 0x7E 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 if(sizeA4){ if(blackPreview || grayscalePreview)send(new byte[]{3,12,17,0,0,0,1,2,5,-1,0,0,0,0,-24,19,104,27}); if(colorPreview) send(new byte[]{3,12,17,0,0,0,1,3,5,-1,0,0,0,0,-24,19,104,27}); send(new byte[]{3,11,8}); read(handle,8 );//confirmation return 0x00 0x0A 0xB4 0x0D 0xF4 0x09 0xB4 0x0D if(blackPreview || grayscalePreview)send(new byte[]{3,8,4,0,0,0,0,8,-119,0,1 }); if(colorPreview) send(new byte[]{3,8,4,0,0,0,0,24,-101,1,1 }); } if(!sizeA4){ //A5 semi height if(blackPreview )send(new byte[]{3,12,17,0,0,0,1,2,5,-1,0,0,0,0,-24,19,-56,13}); if(grayscalePreview )send(new byte[]{3,12,17,0,0,0,1,2,5,-1,0,0,0,0,-24,19,72,14}); if(colorPreview) send(new byte[]{3,12,17,0,0,0,1,3,5,-1,0,0,0,0,-24,19,104,13}); send(new byte[]{3,11,8}); read(handle,8 );//confirmation return 0x00 0x0A 0xCC 0x06 0xF4 0x09 0xCC 0x06 if(blackPreview)send(new byte[]{3,8,4,0,0,0,0,-24,68,0,1 }); if(grayscalePreview)send(new byte[]{3,8,4,0,0,0,0,104,71,0,1 }); if(colorPreview) send(new byte[]{3,8,4,0,0,0,0,-24,(byte) 203,0,1 }); } int operation = 1; while(continuer){ ByteBuffer readed =null; if(operation %32 !=0 ){ System.out.println(operation+" normal operation number "+operation); if(blackPreview || grayscalePreview)send(new byte[]{3,14,4,0,0,0,0,-6 }); if(colorPreview ) send(new byte[]{3,14,4,0,0,0,0,-16 }); if(blackPreview || grayscalePreview)readed = read(handle,64000); if(colorPreview ) readed = read(handle,61440); } else{System.out.println("strange signal every 32 operation"); if(blackPreview)send(new byte[]{3,14,4,0,0,0,0,-36 }); if(grayscalePreview && sizeA4)send(new byte[]{3,14,4,0,0,0,0,-66 }); if(grayscalePreview && !sizeA4)send(new byte[]{3,14,4,0,0,0,0,(byte) 190 }); if(colorPreview) send(new byte[]{3,14,4,0,0,0,0,60 }); if(blackPreview)readed = read(handle,56320); if(grayscalePreview)readed = read(handle,48640); if(colorPreview) readed = read(handle,15360); } //windows driver send a strange end signal when he know (i dunno how) //that the next buffer will not be full and be the last. //i didnt find in any usblib documentation how to get the _urb_header with the //size of the next packet, i manually put the operation number if( sizeA4 && grayscalePreview && operation==141){ if(sizeA4)send(new byte[]{3,14,4,0,0,0,0,70}); if(sizeA4)read(handle,17920 ); if(!sizeA4)send(new byte[]{3,14,4,0,0,0,0,(byte) 150}); if(!sizeA4)read(handle,38400 ); continuer=false; }//if the end signal is not sent in bw and grayscale mode, it will continue to receive //full 0x00 64000 sized buffers during a 60s printer busy. In color reading it goes on timeout, and motor return at idle position if(sizeA4 && blackPreview && operation==140 || !sizeA4 && blackPreview && operation==70){ if(sizeA4)send(new byte[]{3,14,4,0,0,0,0,-56}); if(!sizeA4)send(new byte[]{3,14,4,0,0,0,0,(byte) 200}); read(handle,51200 ); //last packet not changed with the A5 size Oo continuer=false; } if(sizeA4 &&colorPreview && operation==448){//strange thing here, if i stop at >449, motor go back at idle position, send(new byte[]{3,14,4,0,0,0,0,120});//printer is ready but script goes on timeout at line "readed = read(handle,61440);" read(handle,30720 ); //if i stop it at <449 i achieve the end signal reception, motor goes at idle position, but the continuer=false; //printer stay busy 60s in "pc scanning" } if(!sizeA4 &&colorPreview && operation==219) continuer=false;//i had no end signal in this semi sized A5 color scan, last buffer = 61440 too operation++; //b.put( readed); } send(new byte[]{3,9,1}); read(handle,1 ); //end signal, return 0x00 LibUsb.releaseInterface(handle, 0); LibUsb.close(handle); } -- View this message in context: http://sane.10972.n7.nabble.com/add-support-for-ricoh-aficio-sp100su-tp20705p20715.html Sent from the SANE - Dev mailing list archive at Nabble.com. -- sane-devel mailing list: sane-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/sane-devel Unsubscribe: Send mail with subject "unsubscribe your_password" to sane-devel-requ...@lists.alioth.debian.org