File Coverage

blib/lib/Device/WebIO.pm
Criterion Covered Total %
statement 311 311 100.0
branch 26 30 86.6
condition 17 27 62.9
subroutine 67 67 100.0
pod 54 59 91.5
total 475 494 96.1


line stmt bran cond sub pod time code
1             # Copyright (c) 2014 Timm Murray
2             # All rights reserved.
3             #
4             # Redistribution and use in source and binary forms, with or without
5             # modification, are permitted provided that the following conditions are met:
6             #
7             # * Redistributions of source code must retain the above copyright notice,
8             # this list of conditions and the following disclaimer.
9             # * Redistributions in binary form must reproduce the above copyright
10             # notice, this list of conditions and the following disclaimer in the
11             # documentation and/or other materials provided with the distribution.
12             #
13             # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14             # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15             # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16             # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
17             # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18             # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19             # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20             # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21             # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22             # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
23             # POSSIBILITY OF SUCH DAMAGE.
24             package Device::WebIO;
25             $Device::WebIO::VERSION = '0.022';
26             # ABSTRACT: Duct Tape for the Internet of Things
27 16     16   827287 use v5.12;
  16         167  
28 16     16   6648 use Moo;
  16         142291  
  16         116  
29 16     16   29466 use namespace::clean;
  16         177404  
  16         266  
30 16     16   10962 use Device::WebIO::Exceptions;
  16         41  
  16         56443  
31              
32             has '_device_by_name' => (
33             is => 'ro',
34             default => sub {{
35             }},
36             );
37              
38              
39             sub register
40             {
41 16     16 1 5001 my ($self, $name, $device) = @_;
42 16         84 $self->_device_by_name->{$name} = $device;
43 16         35 return 1;
44             }
45              
46             sub device_names
47             {
48 1     1 1 5 my ($self) = @_;
49 1         2 return keys %{ $self->_device_by_name };
  1         7  
50             }
51              
52              
53             sub pin_desc
54             {
55 1     1 1 5 my ($self, $name) = @_;
56 1         3 my $obj = $self->_get_obj( $name );
57 1         7 return $obj->pin_desc;
58             }
59              
60             sub all_desc
61             {
62 2     2 1 1167 my ($self, $name) = @_;
63 2         4 my $obj = $self->_get_obj( $name );
64 2         7 return $obj->all_desc;
65             }
66              
67              
68             sub set_as_input
69             {
70 7     7 1 1695 my ($self, $name, $pin) = @_;
71 7         21 my $obj = $self->_get_obj( $name );
72 7         21 $self->_role_check( $obj, 'DigitalInput' );
73 7         20 $self->_pin_count_check( $name, $obj, $pin, 'DigitalInput' );
74 6         18 $obj->set_as_input( $pin );
75 6         45 return 1;
76             }
77              
78             sub set_as_output
79             {
80 5     5 1 2287 my ($self, $name, $pin) = @_;
81 5         11 my $obj = $self->_get_obj( $name );
82 5         13 $self->_role_check( $obj, 'DigitalOutput' );
83 5         12 $self->_pin_count_check( $name, $obj, $pin, 'DigitalOutput' );
84 3         9 $obj->set_as_output( $pin );
85 3         16 return 1;
86             }
87              
88             sub is_set_input
89             {
90 8     8 1 1476 my ($self, $name, $pin) = @_;
91 8         20 my $obj = $self->_get_obj( $name );
92 8         19 $self->_role_check( $obj, 'DigitalInput' );
93 8         28 $self->_pin_count_check( $name, $obj, $pin, 'DigitalInput' );
94 8         21 return $obj->is_set_input( $pin );
95             }
96              
97             sub is_set_output
98             {
99 4     4 1 771 my ($self, $name, $pin) = @_;
100 4         11 my $obj = $self->_get_obj( $name );
101 4         10 $self->_role_check( $obj, 'DigitalOutput' );
102 4         9 $self->_pin_count_check( $name, $obj, $pin, 'DigitalOutput' );
103 4         11 return $obj->is_set_output( $pin );
104             }
105              
106             sub digital_input_pin_count
107             {
108 3     3 1 567 my ($self, $name) = @_;
109 3         11 my $obj = $self->_get_obj( $name );
110 3         20 $self->_role_check( $obj, 'DigitalInput' );
111 3         11 my $count = $obj->input_pin_count;
112 3         15 return $count;
113             }
114              
115             sub digital_output_pin_count
116             {
117 2     2 1 420 my ($self, $name) = @_;
118 2         6 my $obj = $self->_get_obj( $name );
119 2         5 $self->_role_check( $obj, 'DigitalOutput' );
120 2         6 my $count = $obj->output_pin_count;
121 2         7 return $count;
122             }
123              
124             sub digital_input
125             {
126 5     5 1 1560 my ($self, $name, $pin) = @_;
127 5         15 my $obj = $self->_get_obj( $name );
128 5         15 $self->_role_check( $obj, 'DigitalInput' );
129 4         13 $self->_pin_count_check( $name, $obj, $pin, 'DigitalInput' );
130 3         32 return $obj->input_pin( $pin );
131             }
132              
133             sub digital_input_port
134             {
135 2     2 1 319 my ($self, $name) = @_;
136 2         7 my $obj = $self->_get_obj( $name );
137 2         6 $self->_role_check( $obj, 'DigitalInput' );
138 2         10 return $obj->input_port;
139             }
140              
141             sub digital_input_callback
142             {
143 3     3 1 9 my ($self, $name, $pin, $type, $callback) = @_;
144 3         8 my $obj = $self->_get_obj( $name );
145 3         9 $self->_role_check( $obj, 'DigitalInputCallback' );
146 3         8 $self->_pin_count_check( $name, $obj, $pin, 'DigitalInputCallback' );
147 3         8 return $obj->input_callback_pin( $pin, $type, $callback );
148             }
149              
150             sub digital_input_begin_loop
151             {
152 1     1 1 5 my ($self, $name) = @_;
153 1         4 my $obj = $self->_get_obj( $name );
154 1         5 $self->_role_check( $obj, 'DigitalInputCallback' );
155 1         4 return $obj->input_begin_loop();
156             }
157              
158             sub set_anyevent_condvar
159             {
160 1     1 1 953 my ($self, $name, $pin, $cv) = @_;
161 1         6 my $obj = $self->_get_obj( $name );
162 1         5 $self->_role_check( $obj, 'DigitalInputAnyEvent' );
163              
164 1         5 $obj->set_anyevent_condvar( $pin, $cv );
165              
166 1         10 return;
167             }
168              
169             sub digital_output_port
170             {
171 2     2 1 7 my ($self, $name, $out) = @_;
172 2         9 my $obj = $self->_get_obj( $name );
173 2         5 $self->_role_check( $obj, 'DigitalOutput' );
174 2         12 $obj->output_port( $out );
175 2         3 return 1;
176             }
177              
178             sub digital_output
179             {
180 7     7 1 1800 my ($self, $name, $pin, $val) = @_;
181 7         19 my $obj = $self->_get_obj( $name );
182 7         26 $self->_role_check( $obj, 'DigitalOutput' );
183 4         8 $self->_pin_count_check( $name, $obj, $pin, 'DigitalOutput' );
184 3         9 $obj->output_pin( $pin, $val );
185 3         18 return 1;
186             }
187              
188             sub adc_count
189             {
190 1     1 1 5 my ($self, $name) = @_;
191 1         4 my $obj = $self->_get_obj( $name );
192 1         3 $self->_role_check( $obj, 'ADC' );
193 1         5 return $obj->adc_pin_count;
194             }
195              
196             sub adc_resolution
197             {
198 2     2 1 354 my ($self, $name, $pin) = @_;
199 2         4 my $obj = $self->_get_obj( $name );
200 2         5 $self->_role_check( $obj, 'ADC' );
201 2         7 return $obj->adc_bit_resolution( $pin );
202             }
203              
204             sub adc_max_int
205             {
206 2     2 1 712 my ($self, $name, $pin) = @_;
207 2         5 my $obj = $self->_get_obj( $name );
208 2         5 $self->_role_check( $obj, 'ADC' );
209 2         6 return $obj->adc_max_int( $pin );
210             }
211              
212             sub adc_volt_ref
213             {
214 2     2 1 6 my ($self, $name, $pin) = @_;
215 2         4 my $obj = $self->_get_obj( $name );
216 2         5 $self->_role_check( $obj, 'ADC' );
217 2         6 return $obj->adc_volt_ref( $pin );
218             }
219              
220             sub adc_input_int
221             {
222 4     4 1 1077 my ($self, $name, $pin) = @_;
223 4         7 my $obj = $self->_get_obj( $name );
224 4         12 $self->_role_check( $obj, 'ADC' );
225 4         10 $self->_pin_count_check( $name, $obj, $pin, 'ADC' );
226 3         6 return $obj->adc_input_int( $pin );
227             }
228              
229             sub adc_input_float
230             {
231 3     3 1 696 my ($self, $name, $pin) = @_;
232 3         7 my $obj = $self->_get_obj( $name );
233 3         7 $self->_role_check( $obj, 'ADC' );
234 3         8 $self->_pin_count_check( $name, $obj, $pin, 'ADC' );
235 2         5 return $obj->adc_input_float( $pin );
236             }
237              
238             sub adc_input_volts
239             {
240 3     3 1 236 my ($self, $name, $pin) = @_;
241 3         7 my $obj = $self->_get_obj( $name );
242 3         8 $self->_role_check( $obj, 'ADC' );
243 3         8 $self->_pin_count_check( $name, $obj, $pin, 'ADC' );
244 2         5 return $obj->adc_input_volts( $pin );
245             }
246              
247             sub pwm_count
248             {
249 1     1 1 5 my ($self, $name) = @_;
250 1         4 my $obj = $self->_get_obj( $name );
251 1         4 $self->_role_check( $obj, 'PWM' );
252 1         6 return $obj->pwm_pin_count;
253             }
254              
255             sub pwm_resolution
256             {
257 2     2 1 4 my ($self, $name, $pin) = @_;
258 2         5 my $obj = $self->_get_obj( $name );
259 2         5 $self->_role_check( $obj, 'PWM' );
260 2         6 return $obj->pwm_bit_resolution( $pin );
261             }
262              
263             sub pwm_max_int
264             {
265 2     2 1 798 my ($self, $name, $pin) = @_;
266 2         5 my $obj = $self->_get_obj( $name );
267 2         5 $self->_role_check( $obj, 'PWM' );
268 2         7 return $obj->pwm_max_int( $pin );
269             }
270              
271             sub pwm_output_int
272             {
273 3     3 1 1091 my ($self, $name, $pin, $value) = @_;
274 3         6 my $obj = $self->_get_obj( $name );
275 3         7 $self->_role_check( $obj, 'PWM' );
276 3         7 $self->_pin_count_check( $name, $obj, $pin, 'PWM' );
277 2         5 return $obj->pwm_output_int( $pin, $value );
278             }
279              
280             sub pwm_output_float
281             {
282 2     2 1 323 my ($self, $name, $pin, $value) = @_;
283 2         3 my $obj = $self->_get_obj( $name );
284 2         6 $self->_role_check( $obj, 'PWM' );
285 2         5 $self->_pin_count_check( $name, $obj, $pin, 'PWM' );
286 1         4 return $obj->pwm_output_float( $pin, $value );
287             }
288              
289             sub vid_channels
290             {
291 1     1 1 680 my ($self, $name) = @_;
292 1         3 my $obj = $self->_get_obj( $name );
293 1         4 $self->_role_check( $obj, 'VideoOutput' );
294 1         4 return $obj->vid_channels;
295             }
296              
297             sub vid_width
298             {
299 2     2 1 398 my ($self, $name, $pin) = @_;
300 2         11 my $obj = $self->_get_obj( $name );
301 2         6 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
302 2         3 $self->_role_check( $obj, 'VideoOutput' );
303 2         4 return $obj->vid_width( $pin );
304             }
305              
306             sub vid_height
307             {
308 2     2 1 732 my ($self, $name, $pin) = @_;
309 2         5 my $obj = $self->_get_obj( $name );
310 2         6 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
311 2         5 $self->_role_check( $obj, 'VideoOutput' );
312 2         8 return $obj->vid_height( $pin );
313             }
314              
315             sub vid_fps
316             {
317 2     2 1 698 my ($self, $name, $pin) = @_;
318 2         5 my $obj = $self->_get_obj( $name );
319 2         5 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
320 2         5 $self->_role_check( $obj, 'VideoOutput' );
321 2         5 return $obj->vid_fps( $pin );
322             }
323              
324             sub vid_kbps
325             {
326 2     2 1 691 my ($self, $name, $pin) = @_;
327 2         4 my $obj = $self->_get_obj( $name );
328 2         5 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
329 2         4 $self->_role_check( $obj, 'VideoOutput' );
330 2         5 return $obj->vid_kbps( $pin );
331             }
332              
333             sub vid_set_width
334             {
335 1     1 1 343 my ($self, $name, $pin, $value) = @_;
336 1         2 my $obj = $self->_get_obj( $name );
337 1         3 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
338 1         3 $self->_role_check( $obj, 'VideoOutput' );
339 1         3 return $obj->vid_set_width( $pin, $value );
340             }
341              
342             sub vid_set_height
343             {
344 1     1 1 9 my ($self, $name, $pin, $value) = @_;
345 1         3 my $obj = $self->_get_obj( $name );
346 1         3 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
347 1         3 $self->_role_check( $obj, 'VideoOutput' );
348 1         2 return $obj->vid_set_height( $pin, $value );
349             }
350              
351             sub vid_set_fps
352             {
353 1     1 0 9 my ($self, $name, $pin, $value) = @_;
354 1         2 my $obj = $self->_get_obj( $name );
355 1         3 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
356 1         3 $self->_role_check( $obj, 'VideoOutput' );
357 1         4 return $obj->vid_set_fps( $pin, $value );
358             }
359              
360             sub vid_set_kbps
361             {
362 1     1 0 8 my ($self, $name, $pin, $value) = @_;
363 1         2 my $obj = $self->_get_obj( $name );
364 1         3 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
365 1         3 $self->_role_check( $obj, 'VideoOutput' );
366 1         3 return $obj->vid_set_kbps( $pin, $value );
367             }
368              
369             sub vid_allowed_content_types
370             {
371 1     1 1 338 my ($self, $name, $pin) = @_;
372 1         3 my $obj = $self->_get_obj( $name );
373 1         3 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
374 1         3 $self->_role_check( $obj, 'VideoOutput' );
375 1         3 return $obj->vid_allowed_content_types( $pin );
376             }
377              
378             sub vid_stream
379             {
380 1     1 1 223 my ($self, $name, $pin, $type) = @_;
381 1         3 my $obj = $self->_get_obj( $name );
382 1         3 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
383 1         3 $self->_role_check( $obj, 'VideoOutput' );
384 1         4 return $obj->vid_stream( $pin, $type );
385             }
386              
387             sub vid_stream_callback
388             {
389 1     1 1 1406 my ($self, $name, $pin, $type, $callback) = @_;
390 1         3 my $obj = $self->_get_obj( $name );
391 1         3 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
392 1         2 $self->_role_check( $obj, 'VideoOutputCallback' );
393 1         2 return $obj->vid_stream_callback( $pin, $type, $callback );
394             }
395              
396             sub vid_stream_begin_loop
397             {
398 1     1 1 485 my ($self, $name, $pin) = @_;
399 1         4 my $obj = $self->_get_obj( $name );
400 1         3 $self->_pin_count_check( $name, $obj, $pin, 'VideoOutput' );
401 1         6 $self->_role_check( $obj, 'VideoOutputCallback' );
402 1         4 return $obj->vid_stream_begin_loop( $pin );
403             }
404              
405             sub img_channels
406             {
407 1     1 1 5 my ($self, $name) = @_;
408 1         3 my $obj = $self->_get_obj( $name );
409 1         4 $self->_role_check( $obj, 'StillImageOutput' );
410 1         3 return $obj->img_channels;
411             }
412              
413             sub img_width
414             {
415 2     2 1 531 my ($self, $name, $pin) = @_;
416 2         5 my $obj = $self->_get_obj( $name );
417 2         5 $self->_role_check( $obj, 'StillImageOutput' );
418 2         6 $self->_pin_count_check( $name, $obj, $pin, 'StillImageOutput' );
419 2         5 return $obj->img_width( $pin );
420             }
421              
422             sub img_height
423             {
424 2     2 1 744 my ($self, $name, $pin) = @_;
425 2         3 my $obj = $self->_get_obj( $name );
426 2         5 $self->_role_check( $obj, 'StillImageOutput' );
427 2         6 $self->_pin_count_check( $name, $obj, $pin, 'StillImageOutput' );
428 2         4 return $obj->img_height( $pin );
429             }
430              
431             sub img_quality
432             {
433 2     2 1 722 my ($self, $name, $pin) = @_;
434 2         5 my $obj = $self->_get_obj( $name );
435 2         10 $self->_role_check( $obj, 'StillImageOutput' );
436 2         5 $self->_pin_count_check( $name, $obj, $pin, 'StillImageOutput' );
437 2         5 return $obj->img_quality( $pin );
438             }
439              
440             sub img_set_width
441             {
442 1     1 1 342 my ($self, $name, $pin, $value) = @_;
443 1         3 my $obj = $self->_get_obj( $name );
444 1         3 $self->_role_check( $obj, 'StillImageOutput' );
445 1         3 $self->_pin_count_check( $name, $obj, $pin, 'StillImageOutput' );
446 1         2 return $obj->img_set_width( $pin, $value );
447             }
448              
449             sub img_set_height
450             {
451 1     1 1 9 my ($self, $name, $pin, $value) = @_;
452 1         2 my $obj = $self->_get_obj( $name );
453 1         3 $self->_role_check( $obj, 'StillImageOutput' );
454 1         3 $self->_pin_count_check( $name, $obj, $pin, 'StillImageOutput' );
455 1         3 return $obj->img_set_height( $pin, $value );
456             }
457              
458             sub img_set_quality
459             {
460 1     1 1 7 my ($self, $name, $pin, $value) = @_;
461 1         3 my $obj = $self->_get_obj( $name );
462 1         3 $self->_role_check( $obj, 'StillImageOutput' );
463 1         3 $self->_pin_count_check( $name, $obj, $pin, 'StillImageOutput' );
464 1         3 return $obj->img_set_quality( $pin, $value );
465             }
466              
467             sub img_allowed_content_types
468             {
469 1     1 1 348 my ($self, $name, $pin) = @_;
470 1         2 my $obj = $self->_get_obj( $name );
471 1         4 $self->_pin_count_check( $name, $obj, $pin, 'StillImageOutput' );
472 1         2 return $obj->img_allowed_content_types( $pin );
473             }
474              
475             sub img_stream
476             {
477 1     1 1 259 my ($self, $name, $pin, $type) = @_;
478 1         3 my $obj = $self->_get_obj( $name );
479 1         3 $self->_pin_count_check( $name, $obj, $pin, 'StillImageOutput' );
480 1         3 return $obj->img_stream( $pin, $type );
481             }
482              
483             sub i2c_read
484             {
485 2     2 1 34 my ($self, $name, $pin, $addr, $register, $num_bytes) = @_;
486 2         4 my $obj = $self->_get_obj( $name );
487 2         5 $self->_pin_count_check( $name, $obj, $pin, 'I2CProvider' );
488 2         6 return $obj->i2c_read( $pin, $addr, $register, $num_bytes );
489             }
490              
491             sub i2c_write
492             {
493 2     2 1 1641 my ($self, $name, $pin, $addr, $register, @bytes) = @_;
494 2         5 my $obj = $self->_get_obj( $name );
495 2         6 $self->_pin_count_check( $name, $obj, $pin, 'I2CProvider' );
496 2         6 return $obj->i2c_write( $pin, $addr, $register, @bytes );
497             }
498              
499             sub temp_celsius
500             {
501 2     2 0 10 my ($self, $name) = @_;
502 2         4 my $obj = $self->_get_obj( $name );
503 2 50       8 Device::WebIO::FunctionNotSupportedException->throw(
504             message => "Asked for temperature, but $name does not do the"
505             . " TempSensor role"
506             ) if ! $obj->does( 'Device::WebIO::Device::TempSensor' );
507 2         63 return $obj->temp_celsius;
508             }
509              
510             sub temp_kelvins
511             {
512 2     2 0 6 my ($self, $name) = @_;
513 2         4 my $obj = $self->_get_obj( $name );
514 2 50       7 Device::WebIO::FunctionNotSupportedException->throw(
515             message => "Asked for temperature, but $name does not do the"
516             . " TempSensor role"
517             ) if ! $obj->does( 'Device::WebIO::Device::TempSensor' );
518 2         33 return $obj->temp_kelvins;
519             }
520              
521             sub temp_fahrenheit
522             {
523 2     2 0 5 my ($self, $name) = @_;
524 2         5 my $obj = $self->_get_obj( $name );
525 2 50       8 Device::WebIO::FunctionNotSupportedException->throw(
526             message => "Asked for temperature, but $name does not do the"
527             . " TempSensor role"
528             ) if ! $obj->does( 'Device::WebIO::Device::TempSensor' );
529 2         32 return $obj->temp_fahrenheit;
530             }
531              
532             sub spi_set_speed
533             {
534 1     1 1 6 my ($self, $name, $pin, $speed) = @_;
535 1         3 my $obj = $self->_get_obj( $name );
536 1         4 $self->_pin_count_check( $name, $obj, $pin, 'SPI' );
537 1         4 return $obj->spi_set_speed( $pin, $speed );
538             }
539              
540             sub spi_read
541             {
542 1     1 1 1069 my ($self, $name, $pin, $len) = @_;
543 1         4 my $obj = $self->_get_obj( $name );
544 1         24 $self->_pin_count_check( $name, $obj, $pin, 'SPI' );
545 1         4 return $obj->spi_read( $pin, $len );
546             }
547              
548             sub spi_write
549             {
550 1     1 1 550 my ($self, $name, $pin, $data) = @_;
551 1         2 my $obj = $self->_get_obj( $name );
552 1         3 $self->_pin_count_check( $name, $obj, $pin, 'SPI' );
553 1         4 return $obj->spi_write( $pin, $data );
554             }
555              
556              
557             sub _get_obj
558             {
559 122     122   195 my ($self, $name) = @_;
560 122         276 my $obj = $self->_device_by_name->{$name};
561 122         234 return $obj;
562             }
563              
564             sub _pin_count_check
565             {
566 84     84   156 my ($self, $name, $obj, $pin, $type) = @_;
567 84         136 my $pin_count = $self->_pin_count_for_obj( $obj, $type );
568              
569 84 100       144 if( $pin_count <= $pin ) {
570 10         112 Device::WebIO::PinDoesNotExistException->throw(
571             message => "Asked for $type pin $pin, but device $name"
572             . " only has $pin_count pins",
573             );
574             }
575              
576 74         101 return 1;
577             }
578              
579             sub _pin_count_for_obj
580             {
581 84     84   126 my ($self, $obj, $type) = @_;
582              
583 84         98 my $count;
584 84 100 66     514 if( $type eq 'DigitalInput' &&
    100 66        
    100 66        
    100 66        
    100 66        
    100 66        
    100 66        
    100 66        
    50 33        
585             $obj->does( 'Device::WebIO::Device::DigitalInput' ) ) {
586 19         272 $count = $obj->input_pin_count;
587             }
588             elsif( $type eq 'DigitalInputCallback' &&
589             $obj->does( 'Device::WebIO::Device::DigitalInputCallback' ) ) {
590 3         53 $count = $obj->input_pin_count;
591             }
592             elsif( $type eq 'DigitalOutput' &&
593             $obj->does( 'Device::WebIO::Device::DigitalOutput' ) ) {
594 13         142 $count = $obj->output_pin_count;
595             }
596             elsif( $type eq 'ADC' &&
597             $obj->does( 'Device::WebIO::Device::ADC' ) ) {
598 10         115 $count = $obj->adc_pin_count;
599             }
600             elsif( $type eq 'PWM' &&
601             $obj->does( 'Device::WebIO::Device::PWM' ) ) {
602 5         62 $count = $obj->pwm_pin_count;
603             }
604             elsif( $type eq 'VideoOutput' &&
605             $obj->does( 'Device::WebIO::Device::VideoOutput' ) ) {
606 16         255 $count = $obj->vid_channels;
607             }
608             elsif( $type eq 'StillImageOutput' &&
609             $obj->does( 'Device::WebIO::Device::StillImageOutput' ) ) {
610 11         131 $count = $obj->img_channels;
611             }
612             elsif( $type eq 'I2CProvider' &&
613             $obj->does( 'Device::WebIO::Device::I2CProvider' ) ) {
614 4         88 $count = $obj->i2c_channels;
615             }
616             elsif( $type eq 'SPI' &&
617             $obj->does( 'Device::WebIO::Device::SPI' ) ) {
618 3         85 $count = $obj->spi_channels;
619             }
620              
621 84         152 return $count;
622             }
623              
624             sub _role_check
625             {
626 104     104   178 my ($self, $obj, @want_types) = @_;
627              
628 104         157 my $does = 0;
629 104         170 for (@want_types) {
630 104         172 my $full_type = 'Device::WebIO::Device::' . $_;
631 104 100       242 if( $obj->does( $full_type ) ) {
632 100         1407 $does = 1;
633 100         151 last;
634             }
635             }
636 104 100       281 if(! $does ) {
637 4         55 Device::WebIO::FunctionNotSupportedException->throw( message =>
638             "Object of type " . ref($obj)
639             . " does not any of the " . join( ', ', @want_types ) . " roles"
640             );
641             }
642              
643 100         128 return 1;
644             }
645              
646              
647             1;
648             __END__