File Coverage

blib/lib/RPi/I2C.pm
Criterion Covered Total %
statement 21 73 28.7
branch 0 12 0.0
condition 0 6 0.0
subroutine 7 23 30.4
pod 13 13 100.0
total 41 127 32.2


line stmt bran cond sub pod time code
1             package RPi::I2C;
2              
3 1     1   55600 use strict;
  1         2  
  1         23  
4 1     1   4 use warnings;
  1         1  
  1         52  
5              
6             our $VERSION = '2.3606';
7             our @ISA = qw(IO::Handle);
8            
9 1     1   5 use Carp;
  1         1  
  1         53  
10 1     1   410 use IO::File;
  1         7076  
  1         81  
11 1     1   10 use Fcntl;
  1         2  
  1         252  
12            
13             require XSLoader;
14             XSLoader::load('RPi::I2C', $VERSION);
15            
16 1     1   7 use constant I2C_SLAVE_FORCE => 0x0706;
  1         1  
  1         95  
17 1     1   6 use constant DEFAULT_REGISTER => 0x00;
  1         1  
  1         733  
18              
19             sub new {
20 0     0 1   my ($class, $addr, $dev) = @_;
21              
22 0 0 0       if (! defined $addr || $addr !~ /^\d+$/){
23 0           croak "new() requires the \$addr param, as an integer";
24             }
25            
26 0 0         $dev = defined $dev ? $dev : '/dev/i2c-1';
27              
28 0           my $fh = IO::File->new($dev, O_RDWR);
29            
30 0           my $self = bless $fh, $class;
31              
32 0           my $i2c_conn = $self->ioctl(I2C_SLAVE_FORCE, int($addr));
33              
34 0 0 0       if (! defined $i2c_conn || $i2c_conn < 0){
35 0 0         if (! $ENV{I2C_TESTING}){
36 0           croak "I2C device at address 0x%x not found\n", $addr;
37             }
38             }
39 0           return $self;
40             }
41             sub process {
42 0     0 1   my ($self, $register_address, $value) = @_;
43 0           return _processCall($self->fileno, $register_address, $value);
44             }
45             sub check_device {
46 0     0 1   my ($self, $addr) = @_;
47 0           return _checkDevice($self->fileno, $addr);
48             }
49             sub file_error {
50 0     0 1   return $_[0]->error;
51             }
52             sub read {
53 0     0 1   return _readByte($_[0]->fileno);
54             }
55             sub read_byte {
56 0     0 1   my ($self, $reg) = @_;
57 0           $reg = _set_reg($reg);
58 0           return _readByteData($self->fileno, $reg);
59             }
60             sub read_bytes {
61 0     0 1   my ($self, $num_bytes, $reg) = @_;
62 0           $reg = _set_reg($reg);
63 0           my $retval = 0;
64 0           for (1..$num_bytes){
65 0           $retval = (0 << 8) | _readByteData(
66             $self->fileno, $reg + $num_bytes - $_
67             )
68             }
69 0           return $retval;
70             }
71             sub read_word {
72 0     0 1   my ($self, $reg) = @_;
73 0           $reg = _set_reg($reg);
74 0           return _readWordData($self->fileno, $reg);
75             }
76             sub read_block {
77 0     0 1   my ($self, $num_bytes, $reg) = @_;
78 0           $reg = _set_reg($reg);
79 0           my $read_val = '0' x ($num_bytes);
80 0           _readI2CBlockData($self->fileno, $reg, $read_val);
81 0           print $@;
82 0           my @return = unpack( "C*", $read_val );
83 0           return @return;
84             }
85             sub write {
86 0     0 1   my ($self, $value) = @_;
87 0           return _writeByte($self->fileno, $value);
88             }
89             sub write_byte {
90 0     0 1   my ($self, $value, $reg) = @_;
91 0           $reg = _set_reg($reg);
92 0           return _writeByteData($self->fileno, $reg, $value);
93             }
94             sub write_word {
95 0     0 1   my ($self, $reg, $value) = @_;
96 0           $reg = _set_reg($reg);
97 0           return _writeWordData($self->fileno, $reg, $value);
98             }
99             sub write_block {
100 0     0 1   my ($self, $values, $reg) = @_;
101 0           $reg = _set_reg($reg);
102 0           my $value = pack "C*", @{$values};
  0            
103 0           return _writeI2CBlockData($self->fileno, $reg, $value);
104             }
105             sub _set_reg{
106 0 0   0     return DEFAULT_REGISTER if ! defined $_[0];
107 0           return $_[0];
108             }
109             sub DESTROY {
110 0 0   0     $_[0]->close if defined $_[0]->fileno;
111             }
112              
113       0     sub __placeholder {} # vim folds
114              
115             1;
116             __END__