File Coverage

blib/lib/HiPi/Device/OneWire.pm
Criterion Covered Total %
statement 15 39 38.4
branch 0 8 0.0
condition 0 3 0.0
subroutine 5 9 55.5
pod 0 4 0.0
total 20 63 31.7


line stmt bran cond sub pod time code
1             #########################################################################################
2             # Package HiPi::Device::OneWire
3             # Description : 1-Wire Device
4             # Copyright : Copyright (c) 2013-2017 Mark Dootson
5             # License : This is free software; you can redistribute it and/or modify it under
6             # the same terms as the Perl 5 programming language system itself.
7             #########################################################################################
8              
9             package HiPi::Device::OneWire;
10              
11             #########################################################################################
12              
13 1     1   1496 use strict;
  1         3  
  1         32  
14 1     1   6 use warnings;
  1         2  
  1         32  
15 1     1   6 use Carp;
  1         2  
  1         64  
16 1     1   13 use HiPi;
  1         4  
  1         49  
17 1     1   7 use parent qw( HiPi::Device );
  1         2  
  1         7  
18              
19             our $VERSION ='0.80';
20              
21             our %idmap = (
22             '01' => [ '2401/11', 'silicon serial number'],
23             '02' => [ '1425', 'multikey 1153bit secure'],
24             '04' => [ '2404', 'econoram time chip'],
25             '05' => [ '2405', 'Addressable Switch'],
26             '06' => [ '', '4k memory ibutton'],
27             '08' => [ '', '1k memory ibutton'],
28             '09' => [ '2502', '1k add-only memory'],
29             '0A' => [ '', '16k memory ibutton'],
30             '0B' => [ '2505', '16k add-only memory'],
31             '0C' => [ '', '64k memory ibutton'],
32             '0F' => [ '2506', '64k add-only  memory'],
33             '10' => [ '18S20', 'high precision digital thermometer'],
34             '12' => [ '2406/2407', 'dual addressable switch plus 1k memory'],
35             '14' => [ '2430A', '256 eeprom'],
36             '1A' => [ '', '4k Monetary'],
37             '1B' => [ '2436', 'battery id/monitor chip'],
38             '1C' => [ '28E04-100', '4k EEPROM with PIO'],
39             '1D' => [ '2423', '4k ram with counter'],
40             '1F' => [ '2409', 'microlan coupler'],
41             '20' => [ '2450', 'quad a/d converter'],
42             '21' => [ '', 'Thermachron'],
43             '22' => [ '1822', 'Econo Digital Thermometer'],
44             '23' => [ '2433', '4k eeprom'],
45             '24' => [ '2415', 'time chip'],
46             '26' => [ '2438', 'smart battery monitor'],
47             '27' => [ '2417', 'time chip with interrupt'],
48             '28' => [ '18B20', 'programmable resolution digital thermometer'],
49             '29' => [ '2408', '8-channel addressable switch'],
50             '2C' => [ '2890', 'digital potentiometer'],
51             '2D' => [ '2431', '1k eeprom'],
52             '2E' => [ '2770', 'battery monitor and charge controller'],
53             '30' => [ '2760/61/62', 'high-precision li+ battery monitor'],
54             '31' => [ '2720', 'efficient addressable single-cell rechargable lithium protection ic'],
55             '33' => [ '2432', '1k protected eeprom with SHA-1'],
56             '36' => [ '2740', 'high precision coulomb counter'],
57             '37' => [ '', 'Password protected 32k eeprom'],
58             '3A' => [ '2413', 'dual channel addressable switch'],
59             '41' => [ '2422', 'Temperature Logger 8k mem'],
60             '51' => [ '2751', 'multichemistry battery fuel gauge'],
61             '81' => [ '', 'Serial ID Button'],
62             '84' => [ '2404S', 'dual port plus time'],
63             '89' => [ '2502-E48/UNW', '48 bit node address chip'],
64             '8B' => [ '2505-UNW', '16k add-only'],
65             '8F' => [ '2506-UNW', '64k add-only uniqueware'],
66             'FF' => [ 'LCD', 'LCD (Swart)'],
67             );
68              
69             sub get_required_module_options {
70 0     0 0   my $moduleoptions = [
71             [ qw( w1_gpio wire ) ], # w1_therm is loaded on demand
72             ];
73 0           return $moduleoptions;
74             }
75              
76             sub list_slaves {
77 0     0 0   my( $class ) = @_;
78 0           my @rlist = ();
79 0           my $slist = qx(/bin/cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves);
80 0 0         if( $? ) {
81 0           return @rlist;
82             }
83 0           my @slaves = split(/\n/, $slist);
84 0           for my $id ( @slaves ) {
85 0           my ( $family, $discard ) = split(/-/, $id);
86 0 0         $family = '0' . $family if length($family) == 1;
87 0           my ($name, $desc) = ('','');
88 0 0         if(exists($idmap{$family})) {
89 0           $name = $idmap{$family}->[0];
90 0           $desc = $idmap{$family}->[1];
91             }
92 0           push(@rlist, { id => $id, family => $family, name => $name, description => $desc} );
93             }
94 0           return @rlist;
95             }
96              
97             sub read_data {
98 0     0 0   my( $class, $id ) = @_;
99             # return data & or errors
100 0           my $data = qx(/bin/cat /sys/bus/w1/devices/$id/w1_slave);
101 0           chomp($data);
102 0           return $data;
103             }
104              
105             sub id_exists {
106 0     0 0   my( $class, $id) = @_;
107 0           my $slist = qx(/bin/cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves);
108 0 0 0       return ( $slist =~ /\Q$id\E/ && -e qq(/sys/bus/w1/devices/$id/w1_slave) ) ? 1 : 0;
109             }
110              
111             1;