warn about extra nulls
[Printer-EVOLIS.git] / evolis-printer.pl
1 #!/usr/bin/perl
2
3 # Simulate EVOLIS Dualys printer
4
5 use warnings;
6 use strict;
7
8 use Data::Dump qw(dump);
9
10 my $feeder = {qw(
11 F Feeder
12 M Manual
13 B Auto
14 )};
15
16 local $/ = "\r";
17
18 my $page = 1;
19
20 sub save_pbm;
21
22 while(<>) {
23         die "no escape at beginning",dump($_) unless s/^(\x00*)\x1B//;
24         warn "WARNING: ", length($1), " extra nulls before ESC\n" if $1;
25         chomp;
26         my @a = split(/;/,$_);
27         my $c = shift @a;
28         if ( $c eq 'Pmi' ) {
29                 my $f = $a[0] || die 'missing feeder';
30                 print "feeder $f | $feeder->{$f}\n";
31                 $a[1] eq 's' or die;
32         } elsif ( $c eq 'Pc' ) {
33                 my $color = $a[0];
34                 $a[1] eq '=' or die;
35                 my $temperature = $a[2];
36                 print "temperature $color = $temperature\n";
37         } elsif ( $c eq 'Pr' ) {
38                 print "improve $a[0]\n";
39                 # FIXME windows sends it, cups doesn't
40         } elsif ( $c eq 'Db' ) { # XXX not in cups
41                 my ( $color, $two, $data ) = @a;
42                 $two eq '2' or die '2';
43                 my $path = "page-Db-$color-$page.pbm";
44                 $page++;
45                 save_pbm $path, 648, 1015, $data;       # FIXME 1016?
46         } elsif ( $c eq 'Dbc' ) { # XXX not in cups
47                 my ( $color, $line, $len, $comp ) = @a;
48                 while ( $len > length($comp) ) {
49                         warn "# slurp more ",length($comp), " < $len\n";
50                         $comp .= <>;
51                 }
52                 $len == length $comp or warn "wrong length $len != ", length $comp;
53
54                 my $w = 648 / 2;
55
56 =for non-working
57
58                 my $data;
59
60                 my $i = 0;
61                 while ( $i < length $comp ) {
62                         my $len = ord(substr($comp,$i,4));
63                         $i += 1;
64                         warn "$i comp $len\n";
65                         $data .= substr($comp,$i,$len);
66                         $data .= "\x00" x ( $w - $len );
67                         $i += $len;
68                 }
69
70 =cut
71
72                 my $data = $comp;
73
74                 my $path = "page-Dbc-$color-$page.pbm";
75                 $page++;
76
77                 my $h = int( $len / 128 );
78                 save_pbm $path, $w, $h, $data;
79
80         } else {
81                 warn "UNKNOWN: $c ", dump(@a);
82         }
83 }
84
85 sub save_pbm {
86         my ( $path, $w, $h, $data ) = @_;
87         open(my $pbm, '>', $path);
88         print $pbm "P4\n$w $h\n", $data;
89         close($pbm);
90         print "saved $path $w * $h size ", -s $path, "\n";
91 }