File Coverage

blib/lib/BACnet/PDUTypes/UnconfirmedRequest.pm
Criterion Covered Total %
statement 48 56 85.7
branch 5 10 50.0
condition n/a
subroutine 12 12 100.0
pod 0 5 0.0
total 65 83 78.3


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             package BACnet::PDUTypes::UnconfirmedRequest;
4              
5 27     27   170 use warnings;
  27         59  
  27         1449  
6 27     27   134 use strict;
  27         50  
  27         690  
7              
8 27     27   119 use bytes;
  27         49  
  27         192  
9              
10 27     27   753 use BACnet::APDU;
  27         95  
  27         1187  
11 27     27   142 use BACnet::DataTypes::SequenceValue;
  27         74  
  27         971  
12              
13 27     27   13513 use BACnet::ServiceRequestSequences::COVUnconfirmedNotification;
  27         84  
  27         1263  
14              
15             require BACnet::PDUTypes::Utils;
16              
17 27     27   207 use parent 'BACnet::PDUTypes::PDU';
  27         55  
  27         149  
18              
19             our $service_choice_service_request_skeleton =
20             { 2 =>
21             $BACnet::ServiceRequestSequences::COVUnconfirmedNotification::request_skeleton,
22             };
23              
24             sub construct {
25 2     2 0 6780 my ( $class, @rest ) = @_;
26              
27 2         7 my %args = (
28             service_choice => undef,
29             service_request => undef,
30             @rest,
31             );
32              
33             my $self = {
34             data => '',
35             service_choice => $args{service_choice},
36             service_request => $args{service_request},
37 2         6 };
38              
39             $self->{data} .=
40 2         10 pack( 'C', ( $BACnet::APDU::apdu_types->{'Unconfirmed-Request'} << 4 ) );
41              
42             $self->{data} .= pack(
43             'C',
44             $BACnet::PDUTypes::Utils::unconfirmed_service->{
45             $self->{service_choice}
46             }
47 2         7 );
48              
49 2         11 $self->{data} .= $self->{service_request}->data();
50              
51 2         7 return bless $self, $class;
52              
53             }
54              
55             sub parse {
56              
57 2     2 0 5 my ( $class, $data_in, $skeleton ) = @_;
58              
59 2         4 my $self = bless { data => $data_in, }, $class;
60              
61 2 50       6 if ( length($data_in) < 2 ) {
62 0         0 $self->{error} = "Unconfirmed request: too short";
63 0         0 return $self;
64             }
65              
66 2         3 my $offset = 0;
67              
68             #flags should be 0000 but there is no point for check it
69              
70 2         3 $offset += 1;
71              
72             my $service_choice = $BACnet::PDUTypes::Utils::unconfirmed_service_rev->{
73 2         9 unpack( 'C', substr( $data_in, $offset, 1 ) ) };
74              
75 2 50       5 if ( !defined $service_choice ) {
76 0         0 $self->{error} = "Unconfirmed request: unknown service choice";
77 0         0 return $self;
78             }
79              
80 2         4 $self->{service_choice} = $service_choice;
81 2         3 $offset += 1;
82              
83 2 50       4 if ( !defined $skeleton ) {
84             $skeleton = $service_choice_service_request_skeleton->{
85             $BACnet::PDUTypes::Utils::unconfirmed_service->{
86             $self->{service_choice}
87             }
88 0         0 };
89             }
90              
91 2 50       5 if ( !defined $skeleton ) {
92 0         0 $self->{error} = "Unconfirmed Request: unknown service choice";
93 0         0 return $self;
94             }
95              
96             $self->{service_request} =
97 2         11 BACnet::DataTypes::SequenceValue->parse( substr( $data_in, $offset ),
98             $skeleton );
99              
100 2 50       7 if ( defined $self->{service_request}->{error} ) {
101 0         0 $self->{error} = "Unconfirmed request: error in service request";
102             }
103 2         5 return $self;
104             }
105              
106             sub service_choice {
107 4     4 0 2747 my ($self) = @_;
108              
109 4         11 return $self->{service_choice};
110             }
111              
112             sub service_request {
113 4     4 0 6 my ($self) = @_;
114              
115 4         10 return $self->{service_request};
116             }
117              
118             sub flags {
119 4     4 0 6 my ($self) = @_;
120              
121 4         10 return 0;
122             }
123              
124             1;