File Coverage

blib/lib/Device/USB/PX1674.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1            
2             # CMD-Class for Revolt USB Dongle PX-1674-675
3            
4             package Device::USB::PX1674;
5            
6             $VERSION = '1.02';
7            
8 1     1   13494 use strict;
  1         2  
  1         23  
9 1     1   2 use warnings;
  1         1  
  1         19  
10 1     1   3 use Carp;
  1         4  
  1         59  
11 1     1   239 use Device::USB;
  0            
  0            
12            
13             sub new{
14             my $class = shift;
15             my %cfg = (
16             vid => 0xFFFF, # Vendor ID
17             pid => 0x1122, # Product ID
18             ept => 0x02, # Endpoint Out
19             addr => 0x1A1A, # Hauscode
20             intf => 0, # Interface
21             cfg => 1, # Configuration
22             verb => 0, # Verbose
23             @_);
24             my $self = bless{
25             CMD => {
26             1 => { On => 0xF0, Off => 0xE0 },
27             2 => { On => 0xD0, Off => 0xC0 },
28             3 => { On => 0xB0, Off => 0xA0 },
29             4 => { On => 0x90, Off => 0x80 },
30             5 => { On => 0x70, Off => 0x60 },
31             6 => { On => 0x50, Off => 0x40 },
32             group => { On => 0x20, Off => 0x10 },
33             },
34             CFG => \%cfg,
35             }, $class;
36            
37             eval{
38             my $vid = sprintf "%04X", $cfg{vid};
39             my $pid = sprintf "%04X", $cfg{pid};
40             my $usb = Device::USB->new();
41             $usb->find_busses || die "No USB busses found!\n";
42             my $dev = $usb->find_device($cfg{vid}, $cfg{pid} ) or die "Device Vendor '$vid', Product '$pid' not found\n";
43             $dev->open || die "Error open device!\n";
44            
45             if( $dev->set_configuration($cfg{cfg}) != 0 ){
46             die "Can not set configuration!\n";
47             }
48             if( $dev->claim_interface($cfg{intf}) != 0 ){
49             die "Can not claim interface\n";
50             }
51            
52             $self->{usb_dev} = $dev;
53             $self;
54             };
55             }
56             # On|Off|switch
57             # Übergeben wird die Gerätenummer
58             # Ansonsten wird die Gruppe geschaltet
59             # __ANON__
60             my $OnOff = sub{
61             my $self = shift;
62             my $dest = shift;
63             my $devnr = shift || 'group';
64             my $payload = $self->_payload($devnr, $dest);
65            
66             print join(" ", map{sprintf("%02X", $_)}unpack "C*", $payload) if $self->{CFG}{verb};
67             return $self->{usb_dev}->bulk_write( $self->{CFG}{ept}, $payload, 8, 5000);
68             };
69             ############################ Private ######################################
70             sub _payload{
71             my $self = shift;
72             my $devnr = shift;
73             my $dest = shift;
74            
75             my $cmd = $self->{CMD}{$devnr}{$dest} || croak "CMD '$dest' for device '$devnr' not found!";
76             my ($b1, $b2) = unpack "CC", pack "n", $self->{CFG}{addr};
77             my $chk = 255 - ($b1 + $b2 + $cmd) % 256;
78             return pack "C8", $b1,$b2,$cmd,$chk,0x20,0x0A,0x00,0x18;
79             }
80            
81             # On || Off || switch über eine anonyme Funktion
82             sub AUTOLOAD{
83             my $self = shift;
84             my $name = our $AUTOLOAD =~ /::(\w+)$/ ? $1 : '';
85             if( $name eq 'On' || $name eq 'Off' ){
86             $self->$OnOff($name, @_);
87             }
88             elsif( $name eq 'switch'){
89             $self->$OnOff(@_);
90             }
91             else{ die "Unbekannte Funktion: '$name'!\n" }
92             }
93             sub DESTROY{}
94             1;#########################################################################
95             # my $px = Device::USB::PX1674->new or die $@;
96             # $px->Off;
97             __END__