d6e276332eb1dc33c340586112cd8b1fd1e3a20f
[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         s/\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0// && warn "FIXME: string 15 null bytes";
24
25         die "no escape at beginning",dump($_) unless s/^\x1B//;
26         chomp;
27         my @a = split(/;/,$_);
28         my $c = shift @a;
29         warn "# $c @a\n";
30         if ( $c eq 'Pmi' ) {
31                 my $f = $a[0] || die 'missing feeder';
32                 print "feeder $f | $feeder->{$f}\n";
33                 $a[1] eq 's' or die;
34         } elsif ( $c eq 'Pc' ) {
35                 my $color = $a[0];
36                 $a[1] eq '=' or die;
37                 my $temperature = $a[2];
38                 print "temperature $color = $temperature\n";
39         } elsif ( $c eq 'Pr' ) {
40                 print "improve $a[0]\n";
41                 # FIXME windows sends it, cups doesn't
42         } elsif ( $c eq 'Db' ) { # XXX not in cups
43                 my ( $color, $two, $data ) = @a;
44                 $two eq '2' or die '2';
45                 my $path = "page-Db-$color-$page.pbm";
46                 $page++;
47                 save_pbm $path, 648, 1015, $data;       # FIXME 1016?
48         } elsif ( $c eq 'Dbc' ) { # XXX not in cups
49                 my ( $color, $line, $len, $data ) = @a;
50                 while ( $len > length($data) ) {
51                         warn "# slurp more ",length($data), " < $len\n";
52                         $data .= <>;
53                 }
54                 $len == length $data or warn "wrong length $len != ", length $data;
55
56                 my $path = "page-Dbc-$color-$page.pbm";
57                 $page++;
58
59                 my ( $w, $h ) = ( 646, 1081 );  # from driver
60 #               ( $w, $h ) = ( 636, 994 );              # from test card
61                 $h = int( length($data) * 8 / $w );
62                 save_pbm $path, $w, $h, $data;
63
64         } else {
65                 warn "UNKNOWN: $c ", dump(@a);
66         }
67 }
68
69 sub save_pbm {
70         my ( $path, $w, $h, $data ) = @_;
71         open(my $pbm, '>', $path);
72         print $pbm "P4\n$w $h\n", $data;
73         close($pbm);
74         print "saved $path $w * $h size ", -s $path, "\n";
75 }