File Coverage

blib/lib/BACnet/DataTypes/BitString.pm
Criterion Covered Total %
statement 30 32 93.7
branch 3 4 75.0
condition n/a
subroutine 7 7 100.0
pod 0 2 0.0
total 40 45 88.8


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             package BACnet::DataTypes::BitString;
4              
5 27     27   170 use warnings;
  27         44  
  27         1698  
6 27     27   141 use strict;
  27         47  
  27         734  
7              
8 27     27   117 use bytes;
  27         41  
  27         178  
9              
10 27     27   775 use BACnet::DataTypes::Utils;
  27         45  
  27         1280  
11              
12 27     27   13266 use parent 'BACnet::DataTypes::DataType';
  27         8543  
  27         164  
13              
14             sub construct {
15 122     122 0 1280200 my ( $class, $input_bit_string, $modified_tag ) = @_;
16              
17 122         642 my $self = {
18             data => '',
19             val => $input_bit_string,
20             };
21              
22             # Context Tag doc. page 378
23              
24 122         777 $self->{data} .= BACnet::DataTypes::Utils::_construct_head(
25             BACnet::DataTypes::Utils::BIT_STRING_TAG,
26             $modified_tag,
27             BACnet::DataTypes::Utils::_upper_bound_division(
28             length($input_bit_string), 8 ) + 1
29             );
30              
31 122 100       480 if ( ( length($input_bit_string) % 8 ) == 0 ) { #unused bits
32 26         83 $self->{data} .= pack( 'C', 0 );
33             }
34             else {
35             $self->{data} .=
36 96         392 pack( 'C', 8 - ( length($input_bit_string) % 8 ) );
37             }
38              
39 122         5498 $self->{data} .= pack( 'B*', $input_bit_string );
40              
41 122         495 return bless $self, $class;
42             }
43              
44             sub parse {
45 122     122 0 366 my ( $class, $data_in ) = @_;
46              
47 122         371 my $self = bless { data => $data_in, }, $class;
48              
49             #my ( $head, $unused_bits, $untrimmed_val ) = unpack( "C C B*", $data_in );
50              
51 122         563 my $headache = BACnet::DataTypes::Utils::_correct_head(
52             data_in => $data_in,
53             expected_tag => BACnet::DataTypes::Utils::BIT_STRING_TAG
54             );
55              
56 122 50       321 if ( $headache ne "" ) {
57 0         0 $self->{error} = "Bit string: $headache";
58 0         0 return $self;
59             }
60              
61 122         388 my ( $unused_bits, $untrimmed_val ) = unpack(
62             'C B*',
63             substr( $data_in, BACnet::DataTypes::Utils::_get_head_length($data_in) )
64             );
65              
66             $self->{val} =
67 122         3399 substr( $untrimmed_val, 0, length($untrimmed_val) - $unused_bits );
68              
69 122         411 return $self;
70             }
71              
72             1;