File Coverage

blib/lib/Device/ProXR/RelayControl.pm
Criterion Covered Total %
statement 6 136 4.4
branch 0 60 0.0
condition 0 24 0.0
subroutine 2 17 11.7
pod 12 12 100.0
total 20 249 8.0


line stmt bran cond sub pod time code
1             package Device::ProXR::RelayControl;
2             ##----------------------------------------------------------------------------
3             ## :mode=perl:indentSize=2:tabSize=2:noTabs=true:
4             ##****************************************************************************
5             ##****************************************************************************
6            
7             =head1 NAME
8            
9             Device::ProXR::RelayControl - A subclass of Device::ProXR object for relay
10             control.
11            
12             =head1 VERSION
13            
14             Version 0.06
15            
16             =head1 NOTES
17            
18             * Before comitting this file to the repository, ensure Perl Critic can be
19             invoked at the HARSH [3] level with no errors
20            
21             =head1 SYNOPSIS
22            
23             use Device::ProXR::RelayControl;
24            
25             my $board = Device::ProXR::RelayControl->new(port => qq{COM2});
26            
27             $board->all_off;
28             $board->relay_on(1, 1);
29            
30             =head1 SEE ALSO
31            
32             See L for attributes and methods of the base class.
33            
34             =cut
35            
36             ##****************************************************************************
37             ##****************************************************************************
38 1     1   25253 use Readonly;
  1         3  
  1         41  
39 1     1   718 use Moo;
  1         13680  
  1         5  
40             ## Moo enables strictures
41             ## no critic (TestingAndDebugging::RequireUseStrict)
42             ## no critic (TestingAndDebugging::RequireUseWarnings)
43            
44             extends 'Device::ProXR';
45            
46             our $VERSION = "0.06";
47            
48             ##--------------------------------------------------------
49             ## Symbolic constants
50             ##--------------------------------------------------------
51            
52             ## Command to check 2-way communications
53             Readonly::Scalar my $PROXR_CMD_TEST_2WAY_COMMS => 0x21;
54             ## Response to the check 2-way comms
55             Readonly::Scalar my $PROXR_MODE_RUN => 0x55;
56             Readonly::Scalar my $PROXR_MODE_CONFIG => 0x56;
57             Readonly::Scalar my $PROXR_MODE_LOCKDOWN => 0x57;
58            
59             ## The folowing commands are used for individual relays
60             Readonly::Scalar my $PROXR_CMD_BANK_DIRECTED_RELAY_OFF => 0x64;
61             Readonly::Scalar my $PROXR_CMD_BANK_DIRECTED_RELAY_ON => 0x6C;
62             Readonly::Scalar my $PROXR_CMD_BANK_DIRECTED_RELAY_STATUS => 0x74;
63            
64             ## The folowing commands are used for all relays in a specified bank
65             Readonly::Scalar my $PROXR_CMD_BANK_DIRECTED_STATUS => 0x7C;
66             Readonly::Scalar my $PROXR_CMD_BANK_DIRECTED_RELAY_ALL_OFF => 0x81;
67             Readonly::Scalar my $PROXR_CMD_BANK_DIRECTED_RELAY_ALL_ON => 0x82;
68             Readonly::Scalar my $PROXR_CMD_BANK_DIRECTED_RELAY_INVERT => 0x83;
69             Readonly::Scalar my $PROXR_CMD_BANK_DIRECTED_RELAY_MIRROR => 0x84;
70            
71             ## Response to ACKnowledge the command
72             Readonly::Scalar my $PROXR_RESP_ACK => 0x55;
73            
74             ##****************************************************************************
75             ## Object Attributes
76             ##****************************************************************************
77            
78             =head1 ATTRIBUTES
79            
80             =cut
81            
82             ##****************************************************************************
83             ## Object Methods
84             ##****************************************************************************
85            
86             =head1 METHODS
87            
88             =cut
89            
90             ##****************************************************************************
91             ##****************************************************************************
92            
93             =head2 get_mode()
94            
95             =over 2
96            
97             =item B
98            
99             Returns the current mode of operation
100            
101             =item B
102            
103             NONE
104            
105             =item B
106            
107             Value indicating run mode
108            
109             =back
110            
111             =cut
112            
113             ##----------------------------------------------------------------------------
114             sub get_mode
115             {
116 0     0 1   my $self = shift;
117            
118             ## Send the command
119 0           $self->send_command($PROXR_CMD_TEST_2WAY_COMMS);
120            
121 0           return $self->get_response;
122             }
123            
124             ##****************************************************************************
125             ##****************************************************************************
126            
127             =head2 relay_on($relay)
128            
129             =head2 relay_on($bank, $relay)
130            
131             =over 2
132            
133             =item B
134            
135             Turn on the relay
136            
137             =item B
138            
139             $bank - Bank number of the relay to control (1 based)
140             $relay - Relay number of the relay to control (0 based)
141            
142             =item B
143            
144             UNDEF on error (with last_error set)
145            
146             =item B
147            
148             If only one parameter is specified, it is treated as a 0 based relay number
149             and the bank is calculated as (relay / 8) + 1, and the relay within the bank
150             is caluclated as (relay % 8)
151            
152             =back
153            
154             =cut
155            
156             ##----------------------------------------------------------------------------
157             sub relay_on
158             {
159 0     0 1   my $self = shift;
160 0           my $bank = shift;
161 0           my $relay = shift;
162            
163             ## See if we just received 1 parameter
164 0 0 0       if (defined($bank) and (!defined($relay)))
165             {
166             ## Convert this into bank and relay
167 0           $relay = $bank % 8;
168 0           $bank = int($bank / 8) + 1; ## Bank numbers are 1 based
169             }
170            
171             ## Validate parameters
172 0 0         return unless ($self->_valid_bank_and_relay($bank, $relay));
173             ## Make sure bank != 0
174 0 0         unless ($bank)
175             {
176 0           $self->_error_message(qq{Bank parameter cannot be 0!});
177 0           return;
178             }
179            
180             ## Send the command
181 0           $self->send_command($PROXR_CMD_BANK_DIRECTED_RELAY_ON + $relay, $bank);
182            
183 0           return $self->get_response;
184             }
185            
186             ##****************************************************************************
187             ##****************************************************************************
188            
189             =head2 relay_off($relay)
190            
191             =head2 relay_off($bank, $relay)
192            
193             =over 2
194            
195             =item B
196            
197             Turn off the relay of the specified bank
198            
199             =item B
200            
201             $bank - Bank number of the relay to control (1 based)
202             $relay - Relay number of the relay to control (0 based)
203            
204             =item B
205            
206             UNDEF on error (with last_error set)
207            
208             =item B
209            
210             If only one parameter is specified, it is treated as a 0 based relay number
211             and the bank is calculated as (relay / 8) + 1, and the relay within the bank
212             is caluclated as (relay % 8)
213            
214             =back
215            
216             =cut
217            
218             ##----------------------------------------------------------------------------
219             sub relay_off
220             {
221 0     0 1   my $self = shift;
222 0           my $bank = shift;
223 0           my $relay = shift;
224            
225             ## See if we just received 1 parameter
226 0 0 0       if (defined($bank) and (!defined($relay)))
227             {
228             ## Convert this into bank and relay
229 0           $relay = $bank % 8;
230 0           $bank = int($bank/8);
231             }
232            
233             ## Validate parameters
234 0 0         return unless ($self->_valid_bank_and_relay($bank, $relay));
235             ## Make sure bank != 0
236 0 0         unless ($bank)
237             {
238 0           $self->_error_message(qq{Bank parameter cannot be 0!});
239 0           return;
240             }
241            
242             ## Send the command
243 0           $self->send_command($PROXR_CMD_BANK_DIRECTED_RELAY_OFF + $relay, $bank);
244            
245 0           return $self->get_response;
246             }
247            
248             ##****************************************************************************
249             ##****************************************************************************
250            
251             =head2 relay_status($bank, $relay)
252            
253             =over 2
254            
255             =item B
256            
257             Get the status of the relay of the specified bank
258            
259             =item B
260            
261             $bank - Bank number of the relay to control
262             $relay - Relay number of the relay to control
263            
264             =item B
265            
266             UNDEF on error (with last_error set)
267             0 == Relay is OFF
268             1 == Relay is ON
269            
270             =back
271            
272             =cut
273            
274             ##----------------------------------------------------------------------------
275             sub relay_status
276             {
277 0     0 1   my $self = shift;
278 0           my $bank = shift;
279 0           my $relay = shift;
280            
281             ## Validate parameters
282 0 0         return unless ($self->_valid_bank_and_relay($bank, $relay));
283             ## Make sure bank != 0
284 0 0         unless ($bank)
285             {
286 0           $self->_error_message(qq{Bank parameter cannot be 0!});
287 0           return;
288             }
289            
290             ## Send the command
291 0           $self->send_command($PROXR_CMD_BANK_DIRECTED_RELAY_STATUS + $relay, $bank);
292            
293             ## Get the response
294 0           my $resp = $self->get_response;
295 0 0 0       if (defined($resp) && length($resp))
296             {
297 0           return(ord(substr($resp, 0, 1)));
298             }
299 0           return;
300             }
301            
302             ##****************************************************************************
303             ##****************************************************************************
304            
305             =head2 relay_control($on, $relay)
306            
307             =head2 relay_control($on, $bank, $relay)
308            
309             =over 2
310            
311             =item B
312            
313             Turn the relay on or off
314            
315             =item B
316            
317             $on - Indicates if the relay should be turned on or off
318             $bank - Bank number of the relay to control (1 based)
319             $relay - Relay number of the relay to control (0 based)
320            
321             =item B
322            
323             UNDEF on error (with last_error set)
324            
325             =item B
326            
327             If only two parameters are specified, the second parameter is treated as a
328             0 based relay number and the bank is calculated as (relay / 8) + 1, and the
329             relay within the bank is caluclated as (relay % 8)
330            
331             =back
332            
333             =cut
334            
335             ##----------------------------------------------------------------------------
336             sub relay_control
337             {
338 0     0 1   my $self = shift;
339 0           my $on = shift;
340 0           my $bank = shift;
341 0           my $relay = shift;
342            
343             ## See if we just received 1 parameter
344 0 0 0       if (defined($bank) and (!defined($relay)))
345             {
346             ## Convert this into bank and relay
347 0           $relay = $bank % 8;
348 0           $bank = int($bank / 8) + 1; ## Bank numbers are 1 based
349             }
350            
351             ## Validate parameters
352 0 0         return unless ($self->_valid_bank_and_relay($bank, $relay));
353             ## Make sure bank != 0
354 0 0         unless ($bank)
355             {
356 0           $self->_error_message(qq{Bank parameter cannot be 0!});
357 0           return;
358             }
359            
360             ## Set the command to be sent
361 0 0         my $cmd = ($on ? $PROXR_CMD_BANK_DIRECTED_RELAY_ON : $PROXR_CMD_BANK_DIRECTED_RELAY_OFF);
362            
363             ## Send the command
364 0           $self->send_command($cmd + $relay, $bank);
365            
366 0           return $self->get_response;
367             }
368            
369             ##****************************************************************************
370             ##****************************************************************************
371            
372             =head2 all_on()
373            
374             =over 2
375            
376             =item B
377            
378             Turn on all relays on all banks
379            
380             =item B
381            
382             NONE
383            
384             =item B
385            
386             NONE
387            
388             =back
389            
390             =cut
391            
392             ##----------------------------------------------------------------------------
393             sub all_on
394             {
395 0     0 1   my $self = shift;
396            
397             ## Send the command
398 0           $self->send_command($PROXR_CMD_BANK_DIRECTED_RELAY_ALL_ON, 0);
399            
400             ## Return the response
401 0           return $self->get_response;
402             }
403            
404            
405             ##****************************************************************************
406             ##****************************************************************************
407            
408             =head2 all_off()
409            
410             =over 2
411            
412             =item B
413            
414             Turn off all relays on all banks
415            
416             =item B
417            
418             NONE
419            
420             =item B
421            
422             NONE
423            
424             =back
425            
426             =cut
427            
428             ##----------------------------------------------------------------------------
429             sub all_off
430             {
431 0     0 1   my $self = shift;
432            
433             ## Send the command
434 0           $self->send_command($PROXR_CMD_BANK_DIRECTED_RELAY_ALL_OFF, 0);
435            
436             ## Return the response
437 0           return $self->get_response;
438             }
439            
440             ##****************************************************************************
441             ##****************************************************************************
442            
443             =head2 bank_on($bank)
444            
445             =over 2
446            
447             =item B
448            
449             Turn on all relays on the specified bank
450            
451             =item B
452            
453             $bank - Bank number of bank to control
454            
455             =item B
456            
457             NONE
458            
459             =back
460            
461             =cut
462            
463             ##----------------------------------------------------------------------------
464             sub bank_on
465             {
466 0     0 1   my $self = shift;
467 0           my $bank = shift;
468            
469             ## Validate parameters
470 0 0         return unless ($self->_valid_bank($bank));
471             ## Make sure bank != 0
472 0 0         unless ($bank)
473             {
474 0           $self->_error_message(qq{Bank parameter cannot be 0!});
475 0           return;
476             }
477            
478             ## Send the command
479 0           $self->send_command($PROXR_CMD_BANK_DIRECTED_RELAY_ALL_ON, $bank);
480            
481             ## Return the response
482 0           return $self->get_response;
483             }
484            
485             ##****************************************************************************
486             ##****************************************************************************
487            
488             =head2 bank_off($bank)
489            
490             =over 2
491            
492             =item B
493            
494             Turn off all relays on the specified bank
495            
496             =item B
497            
498             $bank - Bank number of bank to control
499            
500             =item B
501            
502             NONE
503            
504             =back
505            
506             =cut
507            
508             ##----------------------------------------------------------------------------
509             sub bank_off
510             {
511 0     0 1   my $self = shift;
512 0           my $bank = shift;
513            
514             ## Validate parameters
515 0 0         return unless ($self->_valid_bank($bank));
516             ## Make sure bank != 0
517 0 0         unless ($bank)
518             {
519 0           $self->_error_message(qq{Bank parameter cannot be 0!});
520 0           return;
521             }
522            
523             ## Send the command
524 0           $self->send_command($PROXR_CMD_BANK_DIRECTED_RELAY_ALL_OFF, $bank);
525            
526             ## Return the response
527 0           return $self->get_response;
528             }
529            
530             ##****************************************************************************
531             ##****************************************************************************
532            
533             =head2 bank_invert($bank)
534            
535             =over 2
536            
537             =item B
538            
539             Invert the status of all relays on the specified bank
540            
541             =item B
542            
543             $bank - Bank number of bank to control
544            
545             =item B
546            
547             NONE
548            
549             =back
550            
551             =cut
552            
553             ##----------------------------------------------------------------------------
554             sub bank_invert
555             {
556 0     0 1   my $self = shift;
557 0           my $bank = shift;
558            
559             ## Validate parameters
560 0 0         return unless ($self->_valid_bank($bank));
561             ## Make sure bank != 0
562 0 0         unless ($bank)
563             {
564 0           $self->_error_message(qq{Bank parameter cannot be 0!});
565 0           return;
566             }
567            
568             ## Send the command
569 0           $self->send_command($PROXR_CMD_BANK_DIRECTED_RELAY_INVERT, $bank);
570            
571             ## Return the response
572 0           return $self->get_response;
573             }
574            
575             ##****************************************************************************
576             ##****************************************************************************
577            
578             =head2 bank_reverse($bank)
579            
580             =over 2
581            
582             =item B
583            
584             Reverse / mirror the status of all relays on the specified bank
585            
586             =item B
587            
588             $bank - Bank number of bank to control
589            
590             =item B
591            
592             NONE
593            
594             =back
595            
596             =cut
597            
598             ##----------------------------------------------------------------------------
599             sub bank_reverse
600             {
601 0     0 1   my $self = shift;
602 0           my $bank = shift;
603            
604             ## Validate parameters
605 0 0         return unless ($self->_valid_bank($bank));
606             ## Make sure bank != 0
607 0 0         unless ($bank)
608             {
609 0           $self->_error_message(qq{Bank parameter cannot be 0!});
610 0           return;
611             }
612            
613             ## Send the command
614 0           $self->send_command($PROXR_CMD_BANK_DIRECTED_RELAY_MIRROR, $bank);
615            
616             ## Return the response
617 0           return $self->get_response;
618             }
619            
620             ##****************************************************************************
621             ##****************************************************************************
622            
623             =head2 bank_status($bank)
624            
625             =over 2
626            
627             =item B
628            
629             Return a byte with the statTurn on all relays on the specified bank
630            
631             =item B
632            
633             $bank - Bank number of bank to control
634            
635             =item B
636            
637             SCALAR - Each bit represents relay 0-7 status
638            
639             =back
640            
641             =cut
642            
643             ##----------------------------------------------------------------------------
644             sub bank_status
645             {
646 0     0 1   my $self = shift;
647 0           my $bank = shift;
648            
649             ## Validate parameters
650 0 0         return unless ($self->_valid_bank($bank));
651             ## Make sure bank != 0
652 0 0         unless ($bank)
653             {
654 0           $self->_error_message(qq{Bank parameter cannot be 0!});
655 0           return;
656             }
657            
658             ## Send the command
659 0           $self->send_command($PROXR_CMD_BANK_DIRECTED_STATUS, $bank);
660            
661             ## Get the response
662 0           my $resp = $self->get_response;
663 0 0 0       if (defined($resp) && length($resp))
664             {
665 0           return(ord(substr($resp, 0, 1)));
666             }
667 0           return;
668             }
669            
670             ##----------------------------------------------------------------------------
671             ## @fn _valid_bank_and_relay($bank, $relay)
672             ## @brief Returns TRUE value if bank AND relay are valid, or UNDEF if
673             ## either bank OR relay is invalid
674             ## @param $bank - Bank number
675             ## @param $relay - Relay number
676             ## @return UNDEF with error_message set if bank OR relay is invalid
677             ## 1 if bank AND relay are valid
678             ## @note
679             ##----------------------------------------------------------------------------
680             sub _valid_bank_and_relay
681             {
682 0     0     my $self = shift;
683 0           my $bank = shift;
684 0           my $relay = shift;
685            
686 0   0       return ($self->_valid_bank($bank) && $self->_valid_relay($relay));
687             }
688            
689             ##----------------------------------------------------------------------------
690             ## @fn _valid_bank($bank)
691             ## @brief Returns TRUE value if bank is valid, or UNDEF if bank is invalid
692             ## @param $bank - Bank number
693             ## @return UNDEF with error_message set if bank is invalid
694             ## 1 if bank is valid
695             ## @note
696             ##----------------------------------------------------------------------------
697             sub _valid_bank
698             {
699 0     0     my $self = shift;
700 0           my $bank = shift;
701            
702 0 0         unless (defined($bank))
703             {
704 0           $self->_error_message(qq{Bank parameter missing!});
705 0           return;
706             }
707 0 0         unless ($bank =~ /\A\d+\Z/x)
708             {
709 0           $self->_error_message(qq{Bank must be a number!});
710 0           return;
711             }
712 0 0 0       if (($bank < 0) || ($bank > 255))
713             {
714 0           $self->_error_message(qq{Bank must be a number between 0 and 255!});
715 0           return;
716             }
717            
718 0           return 1;
719             }
720            
721             ##----------------------------------------------------------------------------
722             ## @fn _valid_relay($relay)
723             ## @brief Returns TRUE value if relay is valid, or UNDEF if relay is invalid
724             ## @param $relay - Relay number
725             ## @return UNDEF with error_message set if relay is invalid
726             ## 1 if relay is valid
727             ## @note
728             ##----------------------------------------------------------------------------
729             sub _valid_relay
730             {
731 0     0     my $self = shift;
732 0           my $relay = shift;
733            
734 0 0         unless (defined($relay))
735             {
736 0           $self->_error_message(qq{Relay parameter missing!});
737 0           return;
738             }
739 0 0         unless ($relay =~ /\A\d+\Z/x)
740             {
741 0           $self->_error_message(qq{Relay must be a number!});
742 0           return;
743             }
744 0 0 0       if (($relay < 0) || ($relay > 7))
745             {
746 0           $self->_error_message(qq{Relay must be a number between 0 and 7!});
747 0           return;
748             }
749            
750 0           return 1;
751             }
752            
753            
754            
755             ##****************************************************************************
756             ## Additional POD documentation
757             ##****************************************************************************
758            
759             =head1 AUTHOR
760            
761             Paul Durden Ealabamapaul AT gmail.comE
762            
763             =head1 COPYRIGHT & LICENSE
764            
765             Copyright (C) 2015 by Paul Durden.
766            
767             This program is free software; you can redistribute it and/or modify it
768             under the same terms as Perl itself.
769            
770             =cut
771            
772             1; ## End of module
773             __END__