File Coverage

blib/lib/RPi/WiringPi.pm
Criterion Covered Total %
statement 9 9 100.0
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 12 12 100.0


line stmt bran cond sub pod time code
1             package RPi::WiringPi;
2              
3 1     1   76221 use strict;
  1         3  
  1         25  
4 1     1   4 use warnings;
  1         2  
  1         23  
5              
6 1     1   302 use parent 'RPi::WiringPi::Core';
  1         266  
  1         4  
7              
8             use GPSD::Parse;
9             use RPi::ADC::ADS;
10             use RPi::ADC::MCP3008;
11             use RPi::BMP180;
12             use RPi::DAC::MCP4922;
13             use RPi::DigiPot::MCP4XXXX;
14             use RPi::HCSR04;
15             use RPi::I2C;
16             use RPi::LCD;
17             use RPi::Pin;
18             use RPi::Serial;
19             use RPi::SPI;
20             use RPi::Const qw(:all);
21              
22             our $VERSION = '2.3621';
23              
24             my $fatal_exit = 1;
25              
26             BEGIN {
27             sub _error {
28             my $err = shift;
29             RPi::WiringPi::Core::cleanup();
30             print "\ncleaned up, exiting...\n";
31             print "\noriginal error: $err\n";
32             exit if $fatal_exit;
33             }
34              
35             $SIG{__DIE__} = \&_error;
36             $SIG{INT} = \&_error;
37             };
38              
39             # core
40              
41             sub new {
42             my ($self, %args) = @_;
43             $self = bless {%args}, $self;
44              
45             if (! $ENV{NO_BOARD}){
46             if (my $scheme = $ENV{RPI_PIN_MODE}){
47             # this checks if another application has already run
48             # a setup routine
49              
50             $self->pin_scheme($scheme);
51             }
52             else {
53             # we default to gpio mode
54              
55             if (! defined $self->{setup}) {
56             $self->SUPER::setup_gpio();
57             $self->pin_scheme(RPI_MODE_GPIO);
58             }
59             else {
60             if ($self->_setup =~ /^w/) {
61             $self->SUPER::setup();
62             $self->pin_scheme(RPI_MODE_WPI);
63             }
64             elsif ($self->_setup =~ /^g/) {
65             $self->SUPER::setup_gpio();
66             $self->pin_scheme(RPI_MODE_GPIO);
67             }
68             elsif ($self->_setup =~ /^p/) {
69             $self->SUPER::setup_phys();
70             $self->pin_scheme(RPI_MODE_PHYS);
71             }
72             elsif ($self->_setup =~ /^W/){
73             $self->pin_scheme(RPI_MODE_WPI);
74             }
75             else {
76             $self->pin_scheme(RPI_MODE_UNINIT);
77             }
78             }
79             }
80             # set the env var so we can catch multiple
81             # setup calls properly
82              
83             $ENV{RPI_SCHEME} = $self->pin_scheme;
84             }
85             $self->_fatal_exit;
86             return $self;
87             }
88             sub adc {
89             my ($self, %args) = @_;
90              
91             my $adc;
92              
93             if (defined $args{model} && $args{model} eq 'MCP3008'){
94             my $pin = $self->pin($args{channel});
95             $adc = RPi::ADC::MCP3008->new($pin->num);
96             }
97             else {
98             # ADSxxxx ADCs don't require any pins
99             $adc = RPi::ADC::ADS->new(%args);
100             }
101             return $adc;
102             }
103             sub bmp {
104             return RPi::BMP180->new($_[1]);
105             }
106             sub dac {
107             my ($self, %args) = @_;
108             $self->pin($args{cs});
109             $self->pin($args{shdn}) if defined $args{shdn};
110             $args{model} = 'MCP4922' if ! defined $args{model};
111             my $dac = RPi::DAC::MCP4922->new(%args);
112             return $dac;
113             }
114             sub dpot {
115             my ($self, $cs, $channel) = @_;
116             $self->pin($cs);
117             my $dpot = RPi::DigiPot::MCP4XXXX->new($cs, $channel);
118             return $dpot;
119             }
120             sub gps {
121             my ($self, %args) = @_;
122             my $gps = GPSD::Parse->new(%args);
123             return $gps;
124             }
125             sub hcsr04 {
126             my ($self, $t, $e) = @_;
127             $self->pin($t);
128             $self->pin($e);
129             return RPi::HCSR04->new($t, $e);
130             }
131             sub hygrometer {
132             my ($self, $pin) = @_;
133             $self->register_pin($pin);
134             my $sensor = RPi::DHT11->new($pin);
135             return $sensor;
136             }
137             sub i2c {
138             my ($self, $addr, $i2c_device) = @_;
139             return RPi::I2C->new($addr, $i2c_device);
140             }
141             sub lcd {
142             my ($self, %args) = @_;
143              
144             # pre-register all pins so we can clean them up
145             # accordingly upon cleanup
146              
147             for (qw(rs strb d0 d1 d2 d3 d4 d5 d6 d7)){
148             if (! exists $args{$_} || $args{$_} !~ /^\d+$/){
149             die "lcd() requires pin configuration within a hash\n";
150             }
151             next if $args{$_} == 0;
152             $self->pin($args{$_});
153             }
154              
155             my $lcd = RPi::LCD->new;
156             $lcd->init(%args);
157             return $lcd;
158             }
159             sub pin {
160             my ($self, $pin_num) = @_;
161              
162             $self->registered_pins;
163             my $gpio = $self->pin_to_gpio($pin_num);
164              
165             if (grep {$gpio == $_} @{ $self->registered_pins }){
166             die "\npin $pin_num is already in use... can't create second object\n";
167             }
168              
169             my $pin = RPi::Pin->new($pin_num);
170             $self->register_pin($pin);
171             return $pin;
172             }
173             sub serial {
174             my ($self, $device, $baud) = @_;
175             return RPi::Serial->new($device, $baud);
176             }
177             sub servo {
178             my ($self, $pin_num) = @_;
179              
180             if ($> != 0){
181             die "\n\nat this time, servo() requires PWM functionality, and PWM " .
182             "requires your script to be run as the 'root' user (sudo)\n\n";
183             }
184              
185             $self->_pwm_in_use(1);
186              
187             my $servo = $self->pin($pin_num);
188             $servo->mode(PWM_OUT);
189              
190             $self->pwm_mode(PWM_MODE_MS);
191             $self->pwm_clock(192);
192             $self->pwm_range(2000);
193              
194             return $servo;
195             }
196             sub shift_register {
197             my ($self, $base, $num_pins, $data, $clk, $latch) = @_;
198              
199             my @pin_nums;
200              
201             for ($data, $clk, $latch){
202             my $pin = $self->pin($_);
203             push @pin_nums, $pin->num;
204             }
205             $self->shift_reg_setup($base, $num_pins, @pin_nums);
206             }
207             sub spi {
208             my ($self, $chan, $speed) = @_;
209             my $spi = RPi::SPI->new($chan, $speed);
210             return $spi;
211             }
212              
213             # private
214              
215             sub _fatal_exit {
216             my $self = shift;
217             $self->{fatal_exit} = shift if @_;
218             $fatal_exit = $self->{fatal_exit} if defined $self->{fatal_exit};
219             return $self->{fatal_exit};
220             }
221             sub _pwm_in_use {
222             my $self = shift;
223             $ENV{PWM_IN_USE} = 1 if @_;
224             return $self->{pwm_in_use};
225             }
226             sub _setup {
227             return $_[0]->{setup};
228             }
229              
230             sub _vim{};
231             1;
232             __END__