create two-page pdf using pdftk
[Printer-EVOLIS.git] / evolis-printer.pl
index 896aa99..697f01d 100755 (executable)
@@ -17,14 +17,14 @@ local $/ = "\r";
 
 my $page = 1;
 
-while(<>) {
-       s/\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0// && warn "FIXME: string 15 null bytes";
+sub save_pbm;
 
-       die "no escape at beginning",dump($_) unless s/^\x1B//;
+while(<>) {
+       die "no escape at beginning",dump($_) unless s/^(\x00*)\x1B//;
+       warn "WARNING: ", length($1), " extra nulls before ESC\n" if $1;
        chomp;
        my @a = split(/;/,$_);
        my $c = shift @a;
-       warn "# $c ",dump(@a);
        if ( $c eq 'Pmi' ) {
                my $f = $a[0] || die 'missing feeder';
                print "feeder $f | $feeder->{$f}\n";
@@ -37,27 +37,57 @@ while(<>) {
        } elsif ( $c eq 'Pr' ) {
                print "improve $a[0]\n";
                # FIXME windows sends it, cups doesn't
-       } elsif ( $c eq 'Dbc' ) {
-               my ( $color, $line, $len, $data ) = @a;
-               while ( $len > length($data) ) {
-                       warn "# slurp more ",length($data), " < $len\n";
-                       $data .= <>;
+       } elsif ( $c eq 'Sv' ) {
+               print "even page on duplex printing\n";
+       } elsif ( $c eq 'Db' ) { # XXX not in cups
+               my ( $color, $two, $data ) = @a;
+               $two eq '2' or die '2';
+               my $path = "page-Db-$color-$page.pbm";
+               $page++;
+               save_pbm $path, 648, 1015, $data;       # FIXME 1016?
+       } elsif ( $c eq 'Dbc' ) { # XXX not in cups
+               my ( $color, $line, $len, $comp ) = @a;
+               while ( $len > length($comp) ) {
+                       warn "# slurp more ",length($comp), " < $len\n";
+                       $comp .= <>;
                }
-               $len == length $data or warn "wrong length $len != ", length $data;
+               $len == length $comp or warn "wrong length $len != ", length $comp;
 
-               my $path = "page-$page-$color.pbm";
-               open(my $pbm, '>', $path);
+               my $w = 648 / 2;
 
-               my ( $w, $h ) = ( 646, 1081 );  # from driver
-#              ( $w, $h ) = ( 636, 994 );              # from test card
+=for non-working
+
+               my $data;
+
+               my $i = 0;
+               while ( $i < length $comp ) {
+                       my $len = ord(substr($comp,$i,4));
+                       $i += 1;
+                       warn "$i comp $len\n";
+                       $data .= substr($comp,$i,$len);
+                       $data .= "\x00" x ( $w - $len );
+                       $i += $len;
+               }
 
-               $h = int( $len * 8 / $w );
+=cut
 
-               print $pbm "P4\n$w $h\n", $data;
-               close($pbm);
-               print "$path $w * $h size ", -s $path, "\n";
+               my $data = $comp;
+
+               my $path = "page-Dbc-$color-$page.pbm";
                $page++;
+
+               my $h = int( $len / 128 );
+               save_pbm $path, $w, $h, $data;
+
        } else {
                warn "UNKNOWN: $c ", dump(@a);
        }
 }
+
+sub save_pbm {
+       my ( $path, $w, $h, $data ) = @_;
+       open(my $pbm, '>', $path);
+       print $pbm "P4\n$w $h\n", $data;
+       close($pbm);
+       print "saved $path $w * $h size ", -s $path, "\n";
+}