File Coverage

blib/lib/Device/Arduino/LCD.pm
Criterion Covered Total %
statement 12 106 11.3
branch 0 32 0.0
condition 0 22 0.0
subroutine 4 24 16.6
pod 1 20 5.0
total 17 204 8.3


line stmt bran cond sub pod time code
1             package Device::Arduino::LCD;
2              
3 1     1   20260 use strict;
  1         2  
  1         32  
4 1     1   1210 use Device::SerialPort qw[ :ALL ];
  1         34142  
  1         349  
5              
6             our $VERSION = '1.02';
7              
8             $|++;
9              
10             # defaults.
11             $Device::Arduino::LCD::Device = '/dev/tty.usbserial';
12             $Device::Arduino::LCD::Baud = 9600;
13             $Device::Arduino::LCD::READ_TIMEOUT = 10;
14              
15 1     1   1607 use Class::MethodMaker [ scalar => [ qw[ port baud ] ]];
  1         24819  
  1         9  
16              
17             use constant {
18 1         2593 ROW_ONE_TEXT => '01',
19             ROW_TWO_TEXT => '02',
20             SCROLL_UP => '03',
21             PLACE_STRING => '04',
22             SCROLL_LEFT => '05',
23             CLEAR => '06',
24             SET_GAUGE => '07',
25             MAKE_CHAR => '08',
26             SEND_CMD => '09',
27             PRINT => '10',
28             WRITE_ASCII => '11',
29             RESET => '99',
30 1     1   33682 };
  1         2  
31              
32             # transmission control.
33             our $HEADER_START = "\x1A";
34             our $DATA_START = "\x1B";
35             our $DATA_END = "\x1C";
36             our $STRING_TOK = "\x1D";
37              
38             sub new {
39 0     0 1   my $class = shift;
40 0           my ($device, $baud) = @_;
41 0   0       $device ||= $Device::Arduino::LCD::Device;
42 0   0       $baud ||= $Device::Arduino::LCD::Baud;
43 0 0         my $port = Device::SerialPort->new($device)
44             or die "can't open serial device: $!";
45 0           $port->baudrate($baud);
46 0           $port->read_char_time(0);
47 0           $port->read_const_time(1000);
48 0           return bless { port => $port, baud => $baud }, $class;
49             }
50              
51             sub send {
52 0     0 0   my ($self, $command, $payload) = @_;
53 0           my $cmd = $self->encapsulate($command, $payload);
54 0           $self->port->write($cmd);
55             }
56              
57             sub encapsulate {
58 0     0 0   my ($self, $command, $payload) = @_;
59 0           return join '' => $HEADER_START, $command, $DATA_START, $payload, $DATA_END;
60             }
61              
62             sub receive {
63 0     0 0   my $self = shift;
64 0           my ($buffer, $chars, $timeout) =
65             ("", 0, $Device::Arduino::LCD::READ_TIMEOUT);
66 0           while ($timeout > 0) {
67 0           my ($count, $saw) = $self->port->read(255);
68 0 0         if ($count > 0) {
69 0           $chars += $count;
70 0           $buffer .= $saw;
71 0 0         last if $chars;
72             }
73             else {
74 0           $timeout--;
75             }
76             }
77 0           return $buffer;
78             }
79              
80             sub reset {
81 0     0 0   my $self = shift;
82 0           $self->send(RESET);
83             }
84              
85             sub first_line {
86 0     0 0   my ($self, $text) = @_;
87 0           $self->send(ROW_ONE_TEXT, $text);
88             }
89              
90             sub second_line {
91 0     0 0   my ($self, $text) = @_;
92 0           $self->send(ROW_TWO_TEXT, $text);
93             }
94              
95             sub clear {
96 0     0 0   my ($self, $pre_delay, $post_delay) = @_;
97 0   0       sleep ($pre_delay || 0);
98 0           $self->send(CLEAR);
99 0   0       sleep ($post_delay || 0);
100             }
101              
102             sub scroll_left {
103 0     0 0   my ($self, $delay) = @_;
104 0           $self->send(SCROLL_LEFT, $delay);
105             }
106              
107             sub scroll_up {
108 0     0 0   my ($self, $text, $pre_delay, $internal_delay, $post_delay) = @_;
109 0 0         my @text = ref $text eq 'ARRAY' ? @$text : ($text);
110 0   0       sleep ($pre_delay || 0);
111 0           for (@text) {
112 0           $self->send(SCROLL_UP, $_);
113 0   0       sleep ($internal_delay || 0);
114             }
115 0   0       sleep ($post_delay || 0);
116             }
117              
118             sub place_string {
119 0     0 0   my ($self, $text, $row, $col) = @_;
120 0           my $payload = join $STRING_TOK => $row, $col, $text;
121 0           $self->send(PLACE_STRING, $payload);
122             }
123              
124             sub gauge_pct {
125 0     0 0   my ($self, $gauge, $pct) = @_;
126 0 0         $pct = $pct > 1 ? $pct/100 : $pct;
127 0           my $step_level = 255 * $pct;
128 0           my $payload = join $STRING_TOK => $gauge, $step_level;
129 0           $self->send(SET_GAUGE, $payload);
130             }
131              
132             sub command {
133 0     0 0   my ($self, $command) = @_;
134 0           $self->send(SEND_CMD, $command);
135             }
136              
137             sub print_char {
138 0     0 0   my ($self, $char) = @_;
139 0           $self->send(PRINT, ord(substr($char, 0, 1)));
140             }
141              
142             sub write_ascii {
143 0     0 0   my ($self, $ascii, $row, $col) = @_;
144 0           my $payload = join $STRING_TOK => $row, $col, $ascii;
145 0           $self->send(WRITE_ASCII, $payload);
146             }
147              
148             sub make_char {
149 0     0 0   my ($self, $ascii, @data) = @_;
150              
151 0 0 0       die "out out bounds" unless $ascii <= 7 and $ascii >=0;
152 0 0         @data = ref $data[0] eq 'ARRAY' ? @{ $data[0] } : @data;
  0            
153 0 0         die "bad character data" unless scalar @data == 8;
154 0           my $payload = join $STRING_TOK => $ascii, @data;
155 0           $self->send(MAKE_CHAR, $payload);
156             }
157              
158             sub convert_to_char {
159 0     0 0   my ($self, $ascii, @lines) = @_;
160 0 0 0       return undef unless $ascii >=0 and $ascii <= 7;
161              
162 0           my @values = ();
163              
164 0           for my $line_number (0 .. 7) { # starting at the top
165 0           $values[$line_number] = 128;
166 0           my $line = $lines[$line_number];
167 0 0         return undef unless (ref $line eq 'ARRAY');
168 0           my @line = @$line;
169 0           for my $i (0 .. 4) {
170 0 0         $values[$line_number] += (2 ** (4-$i)) if lc $line[$i] eq 'x';
171             }
172             }
173              
174 0           $self->make_char($ascii, @values);
175 0           return \@values;
176             }
177              
178              
179              
180             # bargraph support.
181              
182             sub graph {
183 0     0 0   my ($self, $val, $row, $col) = @_;
184 0 0         if ($val == 0) { # print a space.
    0          
185 0           $self->place_string(" ", $row, $col);
186             }
187             elsif ($val <= 8) {
188 0           $self->write_ascii($val - 1, $row, $col);
189             }
190             }
191              
192             sub tallgraph {
193 0     0 0   my ($self, $val, $col) = @_;
194 0 0         if ($val == 0) {
    0          
    0          
195 0           $self->place_string(" ", 1, $col);
196 0           $self->place_string(" ", 2, $col);
197             }
198             elsif ($val <= 8) {
199 0           $self->place_string(" ", 1, $col);
200 0           $self->write_ascii($val - 1, 2, $col);
201             }
202             elsif ($val <= 16) {
203 0           $self->write_ascii($val - 9, 1, $col);
204 0           $self->write_ascii(7, 2, $col);
205             }
206             }
207              
208             sub init_bargraph {
209 0     0 0   my ($self) = shift;
210 0           my $data = [ [128,128,128,128,128,128,128,159],
211             [128,128,128,128,128,128,159,159],
212             [128,128,128,128,128,159,159,159],
213             [128,128,128,128,159,159,159,159],
214             [128,128,128,159,159,159,159,159],
215             [128,128,159,159,159,159,159,159],
216             [128,159,159,159,159,159,159,159],
217             [159,159,159,159,159,159,159,159] ];
218 0           my $i = 0;
219 0           for (@$data) { $self->make_char($i++, $_) };
  0            
220             }
221              
222              
223              
224             1;
225              
226             __END__