Advertisement
Guest User

clx-3185w scanner - fixed

a guest
Jun 8th, 2012
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 7.04 KB | None | 0 0
  1. #!/usr/bin/perl
  2. # Licence: WTFPL
  3. #
  4. use IO::Socket;
  5. use strict;
  6. use File::Temp qw/ tempdir /;
  7. our $DEBUG=undef ;
  8.  
  9. our $sock;
  10. our $prefix=0X1BA8;
  11. our $PRINTERIP="192.168.1.9";
  12. our $filename=$ARGV[0];
  13. our $dpi=$ARGV[1];
  14.  
  15. our $dir=tempdir( CLEANUP => 1 );
  16. usage() if ( !defined($filename));
  17. usage() if ( -e "$filename" );
  18. if (defined($dpi) )
  19. {
  20.     usage()     if ( $dpi !~ m/^\d+$/ );
  21. }
  22.  
  23.  
  24.  
  25. doit();
  26. presentit();
  27.  
  28.  
  29. sub applypercent
  30. {
  31.     my $percent=shift;
  32.     my $max=shift,
  33.     $percent=0.01 if ($percent>1);
  34.     return $max*$percent;
  35. }
  36. # Fournit les settings a utiliser au scanner
  37. # init_scan <width%> <height%> <right corner x> <right corner y> <color type:1|2|3> <dpi>
  38. sub init_scan
  39. {
  40.     my $cmd=0X24;
  41.     my $length=0X13;
  42.     my $static1=0X30;
  43.     my $null=0X00;
  44.     my $_width=shift;
  45.     my $maxwidth=0X2778;
  46.     my $_height=shift;
  47.     my $maxheight=0X3200;
  48.     my $rightcornerx=shift;
  49.     my $rightcornery=shift;
  50.     my $color=shift;
  51.     my $_dpi=shift;
  52.  
  53. #my $height=applypercent($_height,$maxheight);
  54. #   my $width=applypercent($_width,$maxwidth);
  55.     my $height=$maxheight;
  56.     my $width=$maxwidth;
  57.     print "height : ".b2h($height)."\n" if($DEBUG);
  58.     print "Width : ".b2h($width)."\n" if($DEBUG);
  59.  
  60.  
  61.     my $colorprefix=0X0506;
  62.     if ($color==1) {
  63.         $colorprefix=0X0506;
  64.     }elsif ($color==2) {
  65.         $colorprefix=0X0306;
  66.     }elsif ($color==3) {
  67.         $colorprefix=0X0004;
  68.     }
  69.  
  70.     my $static1=0x30;
  71.     my $static2=0x0;
  72.     my $static3=0x07;
  73.     my $static4=0x02;
  74.     my $static5=0x40;
  75.  
  76.     my $dpi=0X0;
  77.     if ($_dpi<100){
  78.         $dpi=0X0;
  79.     }elsif($_dpi< 150){
  80.         $dpi=0x0a0a;
  81.     }elsif($_dpi< 200){
  82.         $dpi=0x0202;
  83.     }elsif($_dpi< 300){
  84.         $dpi=0x0909;
  85.     }elsif($_dpi< 600){
  86.         $dpi=0x0505;
  87.     }elsif($_dpi< 1200){
  88.         $dpi=0x0707;
  89.     }elsif($_dpi>= 1200){
  90.         $dpi=0x0808;
  91.     }
  92.     print "dpi $_dpi : ".b2h($dpi)."\n" if($DEBUG);
  93.  
  94.     my $pkt=pack ("nCCCnnnnnnnnCCCC",
  95.     $prefix,
  96.     $cmd,$length,
  97.     $static1,$static2,
  98.     $width,$static2,
  99.     $height,
  100.     $dpi,
  101.     $rightcornerx,$rightcornery,
  102.     $colorprefix,
  103.     $static3,$static4,$static5,$static1);
  104.     return $pkt;
  105. }
  106.  
  107. #Envoie une commande simple (pas d'arguments spécifiques)
  108. #uniquement le numéro de la commande et la longueur du padding est nécessaire.
  109. #envoie la commande $cmd, suivi 0{length} en data (la taille du paquet est géré)
  110. sub sendsimplecmd
  111. {
  112.     my $cmd=shift;
  113.     my $length=shift;
  114.     $length=0 if ($length<0);
  115.     my $pkt;
  116.     if($length==0){
  117.         $pkt=pack "nCC",$prefix,$cmd,$length
  118.     }else{
  119.         $pkt=pack "nCCx$length",$prefix,$cmd,$length;
  120.     }
  121.     return $pkt;
  122. }
  123. #Effectue le processus d'identification (cmd 12 puis 13)
  124. sub identificate
  125. {
  126.     my $data=sendsimplecmd(0x12,0);
  127.     send_data($data);
  128.     my $ret=get();
  129.     my $data=sendsimplecmd(0x13,0Xfb);
  130.     send_data($data);
  131.     $ret=get();
  132.     return $ret;
  133. }
  134. #
  135. #permet de préparer le scanner a changer les settings (cmd 16 puis 25)
  136. sub preparescan
  137. {
  138.     my $data=sendsimplecmd(0x16,0);
  139.     send_data($data);
  140.     my $ret=get();
  141.     my $data=sendsimplecmd(0x25,0Xfb);
  142.     send_data($data);
  143.     $ret=get();
  144.     return $ret;   
  145. }
  146. #demande au scanner si une partie est prête a être récuperée
  147. sub isnotfinish
  148. {
  149.     my $pkt=sendsimplecmd(0x28,0);
  150.     send_data($pkt);
  151.     my $ret=get();
  152.  
  153.     my ($valid,$size,$high)=unpack("CNN",$ret);
  154.     my $state;
  155.     $state=1 if ($valid==0x80);
  156.     $state=2 if ($valid==0x81);
  157.  
  158.     $state=0 if (defined ($state) and $size==0);
  159.     return $state,$size,$high;
  160.  
  161. }
  162. #Récupére l'ensemble des parties et les stocke dans un fichier
  163. sub waitscan
  164. {
  165.     my ($state,$size,$high)=isnotfinish();
  166.     my $number=0;
  167. SCAN:   while (defined($state)){
  168.         if ($state==1 or $state==2)
  169.         {
  170.  
  171.         print "my state is $state (".b2h($size).")\n" if ($DEBUG);
  172.             my $pkt=sendsimplecmd(0x29,0);
  173.             send_data($pkt);
  174.             getJFIF($size,$number++);
  175.         }elsif($state==0)
  176.         {
  177.             sleep(1);
  178.         }else{
  179.             last SCAN;
  180.         }
  181.         last SCAN if ($state==2);
  182.         ($state,$size,$high)=isnotfinish();
  183.     }
  184.     return $state;
  185. }
  186. #ferme la cx au scanner proprement (permet de dropper le cache chez le scanner
  187. sub endcx
  188. {
  189.     my $ret;
  190.     my $pkt=sendsimplecmd(0x6,0);
  191.     send_data($pkt);
  192.     my $ret2=get();
  193.     $pkt=sendsimplecmd(0x17,0);
  194.     send_data($pkt);
  195.     $ret2=get();
  196.     return $ret;
  197.        
  198. }
  199. sub getfilename
  200. {
  201.     my $num=shift;
  202.     if ($num<10){$num="000$num";}
  203.     elsif ($num<100){$num="00$num";}
  204.     elsif ($num<1000){$num="0$num";}
  205.     else              {$num="$num";}
  206.     return "$dir/$num.jpg";
  207. }
  208. #récupere une partie des images
  209. sub getJFIF
  210. {
  211.     my $size=shift;
  212.     my $number=shift;
  213.     if (!defined($size))
  214.     {
  215.         print "impossible de recuperer : taille non définie\n";
  216.         return;
  217.     }
  218.     open(FH,">".getfilename($number));
  219.     binmode(FH);
  220.     my $buff='';
  221.     my $rc=$sock->read($buff,$size);
  222.     print FH $buff;
  223.     return $rc;
  224. }
  225. #Affiche une chaine en hexa
  226. sub b2h {
  227.     my $bytes=shift;
  228.     my @myArray=unpack('C*', $bytes);
  229.     my $myStringHex = '';
  230.  
  231.     foreach my $c (@myArray) {
  232.       $myStringHex .= " " . sprintf ("%lx", $c);
  233.     }  
  234.     return  $myStringHex;
  235. }
  236. #envoie les données sur le socket
  237. sub send_data{
  238.     my $data=shift;
  239.     if (defined($sock))
  240.     {
  241.         print $sock $data;
  242.     }else
  243.     {
  244.         print "Paquet envoyé";
  245.         print "\n=============\n";
  246.         print $data;
  247.         print "\n=============\n";
  248.     }
  249. }
  250. #récupère les données de conf issues du serveur (tout sauf les images)
  251. sub get
  252. {
  253.     my $pf;
  254.     my $length;
  255.     my $data;
  256.     if (defined($sock)){
  257.         $sock->read($pf,2);
  258.         print "recu pf :".b2h($pf)."\n" if($DEBUG);
  259.         $sock->read($length,1);
  260.         $length=unpack("C",$length);
  261.         print "lgth = ".b2h($length)."\n" if ($DEBUG);
  262.         if ($length==0){
  263.             $sock->read($length,3);
  264.        
  265.             print "recu length longue :".b2h($length)."\n" if ($DEBUG);
  266.             (undef,undef,$length)=unpack("CCC",$length);
  267. #   $length=0xf9;
  268.         }
  269.         $sock->read($data,$length);
  270.     }
  271.  
  272.     print "read done\n" if ($DEBUG);
  273.     if (defined($data)){
  274.     #   my @array=unpack "C*",$data;
  275.     #   return \@array;
  276.         return $data;
  277.     }else{
  278.         return undef;
  279.     }
  280.  
  281. }
  282. #ouvre la cx au scanner
  283. sub createcx
  284. {
  285.     my $addr=shift;
  286.     my $port=shift;
  287.     $port=9400 if (!defined($port));
  288.     print "$addr:$port\n";
  289.  
  290.     $sock=new IO::Socket::INET (
  291.             PeerAddr => $addr,
  292.             PeerPort => $port,
  293.             Proto => 'tcp'
  294.             );
  295.     die "Could not create socket: $!\n" unless $sock;
  296.     $sock->autoflush(1);
  297.     binmode($sock);
  298.  
  299. }
  300. #effectue l'ensemble des opérations afin de récuperer
  301. sub doit
  302. {
  303.     my ($percw,$perch,$crw,$crh,$color,$_dpi)=(1,1,0,0,1,650);
  304.     $dpi=$_dpi if (!defined($dpi));
  305.     my $ret;
  306. print "====cx===\n" if($DEBUG);
  307.     #on se connecte au serveur
  308.     createcx($PRINTERIP,"9400");
  309. print "====id===\n" if($DEBUG);
  310.     #on récupère les infos du scanner
  311.     identificate();
  312. print "====pr===\n" if($DEBUG);
  313.     #on prépare le scanner a faire un scan
  314.     preparescan();
  315.     #on lui file les settings qui nous intéresse.
  316.    
  317. print "====in===\n" if($DEBUG);
  318.     my $pkt=init_scan($percw,$perch,$crw,$crh,$color,$dpi);
  319.     send_data($pkt);
  320.     $ret=get();
  321. print "====la===\n" if($DEBUG);
  322.     #on lui indique de lancer le scan
  323.     my $data=sendsimplecmd(0x31,0);
  324.     send_data($data);
  325.     $ret=get();
  326. print "====wa===\n" if($DEBUG);
  327.     $ret=waitscan();
  328. print "====en===\n" if($DEBUG);
  329.     endcx();
  330.  
  331. }
  332.  
  333. sub presentit
  334. {
  335.     `convert "$dir"/*.jpg  -append -normalize "$filename"`
  336. }
  337. sub usage
  338. {
  339.     print "Script : <nom_du_fichier_de_dest> [dpi]\n";
  340.     die;
  341. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement