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   66300 use strict;
  1         2  
  1         29  
4 1     1   6 use warnings;
  1         1  
  1         61  
5              
6             our $VERSION = '2.3607';
7             our @ISA = qw(IO::Handle);
8            
9 1     1   7 use Carp;
  1         1  
  1         89  
10 1     1   468 use IO::File;
  1         8345  
  1         104  
11 1     1   8 use Fcntl;
  1         3  
  1         310  
12            
13             require XSLoader;
14             XSLoader::load('RPi::I2C', $VERSION);
15            
16 1     1   7 use constant I2C_SLAVE_FORCE => 0x0706;
  1         3  
  1         114  
17 1     1   7 use constant DEFAULT_REGISTER => 0x00;
  1         2  
  1         894  
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           my $hex_addr = sprintf "0x%x", $addr;
37 0           croak "I2C device at address $hex_addr not found\n";
38             }
39             }
40 0           return $self;
41             }
42             sub process {
43 0     0 1   my ($self, $register_address, $value) = @_;
44 0           return _processCall($self->fileno, $register_address, $value);
45             }
46             sub check_device {
47 0     0 1   my ($self, $addr) = @_;
48 0           return _checkDevice($self->fileno, $addr);
49             }
50             sub file_error {
51 0     0 1   return $_[0]->error;
52             }
53             sub read {
54 0     0 1   return _readByte($_[0]->fileno);
55             }
56             sub read_byte {
57 0     0 1   my ($self, $reg) = @_;
58 0           $reg = _set_reg($reg);
59 0           return _readByteData($self->fileno, $reg);
60             }
61             sub read_bytes {
62 0     0 1   my ($self, $num_bytes, $reg) = @_;
63 0           $reg = _set_reg($reg);
64 0           my $retval = 0;
65 0           for (1..$num_bytes){
66 0           $retval = (0 << 8) | _readByteData(
67             $self->fileno, $reg + $num_bytes - $_
68             )
69             }
70 0           return $retval;
71             }
72             sub read_word {
73 0     0 1   my ($self, $reg) = @_;
74 0           $reg = _set_reg($reg);
75 0           return _readWordData($self->fileno, $reg);
76             }
77             sub read_block {
78 0     0 1   my ($self, $num_bytes, $reg) = @_;
79 0           $reg = _set_reg($reg);
80 0           my $read_val = '0' x ($num_bytes);
81 0           _readI2CBlockData($self->fileno, $reg, $read_val);
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__