File Coverage

blib/lib/Device/GPIB/Prologix.pm
Criterion Covered Total %
statement 6 176 3.4
branch 0 70 0.0
condition n/a
subroutine 2 33 6.0
pod 27 30 90.0
total 35 309 11.3


line stmt bran cond sub pod time code
1             # Prologix.pm
2              
3             # Author: Mike McCauley (mikem@airspayce.com),
4             # Copyright (C) AirSpayce Pty Ltd
5             # $Id: $
6              
7             package Device::GPIB::Prologix;
8              
9 1     1   20652 use strict;
  1         2  
  1         38  
10 1     1   810 use Device::SerialPort;
  1         34495  
  1         2631  
11              
12             $Device::GPIB::Prologix::VERSION = '0.04';
13             $Device::GPIB::Prologix::debug = 0;
14              
15             sub new
16             {
17 0     0 1   my ($class, $port) = @_;
18              
19 0           my $self = {};
20 0           bless $self, $class;
21              
22             # Defaults:
23 0           $self->{Port} = '/dev/ttyUSB0';
24 0           $self->{Baudrate} = '9600';
25 0           $self->{Databits} = '8';
26 0           $self->{Parity} = 'n';
27 0           $self->{Stopbits} = '1';
28 0           $self->{Handshake} = 'rts';
29 0           $self->{ReadCharTimeout} = 2000; # ms
30              
31 0 0         $self->{Port} = $port if defined $port;
32              
33 0           my ($portname, $baudrate, $databits, $parity, $stopbits, $handshake)
34             = split(/:/, $self->{Port});
35 0 0         $self->{Baudrate} = $baudrate if defined $baudrate;
36 0 0         $self->{Databits} = $databits if defined $databits;
37 0 0         $self->{Parity} = $parity if defined $parity;
38 0 0         $self->{Stopbits} = $stopbits if defined $stopbits;
39 0 0         $self->{Handshake} = $handshake if defined $handshake;
40              
41 0           debug("$class is connecting to $portname with $self->{Databits}:$self->{Parity}:$self->{Stopbits}:$self->{Handshake}");
42              
43 0           $self->{serialport} = new Device::SerialPort($portname);
44 0 0         if (!$self->{serialport})
45             {
46 0           warning("Could not open serial port $portname: $!");
47 0           return;
48             }
49 0           $self->{serialport}->baudrate($self->{Baudrate});
50 0           $self->{serialport}->databits($self->{Databits});
51 0           $self->{serialport}->parity($self->{Parity});
52 0           $self->{serialport}->stopbits($self->{Stopbits});
53 0           $self->{serialport}->handshake($self->{Handshake});
54 0           $self->{serialport}->read_char_time($self->{ReadCharTimeout});
55 0           $self->{serialport}->read_const_time(0);
56 0           $self->{serialport}->stty_icanon(0);
57              
58 0 0         return unless $self->initialised();
59              
60 0           return $self;
61             }
62              
63             sub initialised
64             {
65 0     0 0   my ($self) = @_;
66              
67 0 0         return unless $self->version() =~ /^Prologix/;
68             # Set the Prologix into a state we like
69 0           $self->auto(0);
70 0 0         return unless $self->auto() == 0;
71              
72 0           return 1; # OK
73             }
74              
75             sub send
76             {
77 0     0 1   my ($self, $s) = @_;
78            
79 0           debug("Sending: '$s'");
80              
81             # TODO:
82             # Escape $s, prepend CR, LF or ESC with ESC
83 0           $self->{serialport}->write($s);
84 0           $self->{serialport}->write("\n"); # Trigger transmission
85             }
86              
87             sub read_to_timeout
88             {
89 0     0 1   my ($self) = @_;
90              
91 0           my $buf;
92 0           while (1)
93             {
94 0           my ($count, $ch) = $self->{serialport}->read(1);
95 0           my $x = unpack('H*', $ch);
96 0           debug("got $count, $ch: $x");
97 0 0         return $buf
98             unless $count;
99 0           $buf .= $ch;
100             }
101             }
102              
103             sub read_to_eol
104             {
105 0     0 1   my ($self) = @_;
106              
107 0           my $buf;
108 0           while (1)
109             {
110 0           my ($count, $ch) = $self->{serialport}->read(1);
111 0 0         if ($count)
112             {
113 0           my $x = unpack('H*', $ch);
114 0           debug("got $count, $ch: $x");
115 0 0         if ($ch eq "\r")
    0          
116             {
117             # ignore CR
118             }
119             elsif ($ch eq "\n")
120             {
121             # NL, end of message (unless we are reading binary)
122 0           last;
123             }
124             else
125             {
126 0           $buf .= $ch;
127             }
128             }
129             else
130             {
131 0           last;
132             }
133             }
134              
135             # Got a buffer full
136 0           debug("Read: '$buf'");
137 0           return $buf;
138             }
139              
140             sub read
141             {
142 0     0 1   my ($self, $eoi) = @_;
143              
144 0           my $cmd = '++read';
145 0 0         $cmd .= ' eoi'
146             if defined($eoi);
147 0           $self->send($cmd);
148 0           return $self->read_to_eol();
149             }
150              
151             sub read_binary
152             {
153 0     0 1   my ($self) = @_;
154              
155 0           $self->send('++read eoi');
156 0           return $self->read_to_timeout();
157             }
158              
159             sub warning
160             {
161 0     0 0   my ($s) = @_;
162              
163 0           print "WARNING: $s\n";
164             }
165              
166             sub debug
167             {
168 0     0 0   my ($s) = @_;
169              
170 0 0         print "DEBUG: $s\n"
171             if $Device::GPIB::Prologix::debug;
172             }
173              
174             sub close
175             {
176 0     0 1   my ($self) = @_;
177              
178 0 0         if ($self->{serialport})
179             {
180 0           $self->{serialport}->close();
181 0           undef $self->{serialport};
182             }
183             }
184              
185             sub DESTROY
186             {
187 0     0     my ($self) = @_;
188              
189 0           $self->close();
190             }
191              
192             ###
193             ### Implementations of low level Prologix commands
194             ###
195              
196             sub version
197             {
198 0     0 1   my ($self) = @_;
199              
200             # Send the command
201 0           $self->send('++ver');
202             # Read the result
203 0           return $self->read_to_eol();
204             }
205              
206             sub auto
207             {
208 0     0 1   my ($self, $value) = @_;
209            
210 0 0         if (defined($value))
211             {
212 0           $self->send("++auto $value");
213 0           return;
214             }
215             else
216             {
217 0           $self->send("++auto");
218 0           return $self->read_to_eol();
219             }
220             }
221              
222             sub addr
223             {
224 0     0 1   my ($self, $addr, $sad) = @_;
225            
226 0 0         if (defined($addr))
227             {
228 0           my $cmd = "++addr $addr";
229 0 0         $cmd .= " $sad"
230             if defined $sad;
231 0           $self->send($cmd);
232 0           return;
233             }
234             else
235             {
236 0           $self->send('++addr');
237 0           return $self->read_to_eol();
238             }
239             }
240              
241             sub clr
242             {
243 0     0 1   my ($self) = @_;
244              
245 0           $self->send('++clr');
246             }
247              
248             sub eoi
249             {
250 0     0 1   my ($self, $val) = @_;
251              
252 0 0         if (defined($val))
253             {
254 0 0         $self->send('++eoi ' . $val ? '1' : '0');
255 0           return;
256             }
257             else
258             {
259 0           $self->send('++eoi');
260 0           return $self->read_to_eol();
261             }
262             }
263              
264             sub eos
265             {
266 0     0 1   my ($self, $val) = @_;
267              
268 0 0         if (defined($val))
269             {
270 0           $self->send("++eos $val");
271 0           return;
272             }
273             else
274             {
275 0           $self->send('++eos');
276 0           return $self->read_to_eol();
277             }
278             }
279              
280             sub eot_enable
281             {
282 0     0 1   my ($self, $val) = @_;
283              
284 0 0         if (defined($val))
285             {
286 0 0         $self->send('++eot_enable ' . $val ? '1' : '0');
287 0           return;
288             }
289             else
290             {
291 0           $self->send('++eot_enable');
292 0           return $self->read_to_eol();
293             }
294             }
295              
296             sub eot_char
297             {
298 0     0 1   my ($self, $val) = @_;
299              
300 0 0         if (defined($val))
301             {
302 0           $self->send('++eot_char ' . ord($val));
303 0           return;
304             }
305             else
306             {
307 0           $self->send('++eot_char');
308 0           return $self->read_to_eol();
309             }
310             }
311              
312             sub ifc
313             {
314 0     0 1   my ($self) = @_;
315              
316 0           $self->send('++ifc');
317             }
318              
319             sub llo
320             {
321 0     0 1   my ($self) = @_;
322              
323 0           $self->send('++llo');
324             }
325              
326             sub loc
327             {
328 0     0 1   my ($self) = @_;
329              
330 0           $self->send('++loc');
331             }
332              
333             sub lon
334             {
335 0     0 1   my ($self, $val) = @_;
336              
337 0 0         if (defined($val))
338             {
339 0 0         $self->send('++lon ' . $val ? '1' : '0');
340 0           return;
341             }
342             else
343             {
344 0           $self->send('++lon');
345 0           return $self->read_to_eol();
346             }
347             }
348              
349             sub mode
350             {
351 0     0 1   my ($self, $val) = @_;
352              
353 0 0         if (defined($val))
354             {
355 0 0         $self->send('++mode ' . $val ? '1' : '0');
356 0           return;
357             }
358             else
359             {
360 0           $self->send('++mode');
361 0           return $self->read_to_eol();
362             }
363             }
364              
365             sub read_tmo_ms
366             {
367 0     0 1   my ($self, $val) = @_;
368              
369 0           $self->send('++read_tmo_ms ' . int($val));
370             }
371              
372             sub rst
373             {
374 0     0 1   my ($self) = @_;
375              
376 0           $self->send('++rst');
377             }
378              
379             sub savecfg
380             {
381 0     0 1   my ($self, $val) = @_;
382              
383 0 0         if (defined($val))
384             {
385 0 0         $self->send('++savecfg ' . $val ? '1' : '0');
386 0           return;
387             }
388             else
389             {
390 0           $self->send('++savecfg');
391 0           return $self->read_to_eol();
392             }
393             }
394              
395             sub spoll
396             {
397 0     0 1   my ($self, $addr, $sad) = @_;
398            
399 0           my $cmd = 'spoll';
400 0 0         $cmd .= " $addr"
401             if defined($addr);
402 0 0         $cmd .= " $sad"
403             if defined($sad);
404 0           $self->send($cmd);
405             }
406              
407             sub srq
408             {
409 0     0 1   my ($self) = @_;
410              
411 0           $self->send('++srq');
412 0           return $self->read_to_eol();
413             }
414              
415             sub status
416             {
417 0     0 1   my ($self, $val) = @_;
418              
419 0 0         if (defined($val))
420             {
421 0           $self->send('++status ' . $val);
422 0           return;
423             }
424             else
425             {
426 0           $self->send('++status');
427 0           return $self->read_to_eol();
428             }
429             }
430              
431             sub trg
432             {
433 0     0 1   my ($self, @addrs) = @_;
434              
435 0           my $cmd = '++trg';
436 0           while (@addrs)
437             {
438 0           $cmd .+ ' ' . shift(@addrs);
439             }
440 0           $self->send($cmd);
441             }
442              
443              
444             1;
445              
446             __END__