} elsif ( $up_down eq 'down' && $function_code == 0x03 ) {
# type A
+ # 0x03 => 'Downstream read parameter frame',
$data_range = substr($data,0,1);
$data = substr($data,1);
} elsif ( $up_down eq 'up' && ( $function_code == 0x07 || $function_code == 0x08 || $function_code == 0x03 ) ) {
# type B
+ # 0x07 => 'Upstream Heartbeat Frame',
+ # 0x08 => 'Upstream alarm frame',
+ # 0x03 => 'Upstream Read Parameter Frame',
$data_len = unpack('C', substr($data,1,1));
$data_range = substr($data,2, $data_len);
} elsif ( $up_down eq 'down' && $function_code == 0x06 ) {
# type B
+ # 0x06 => 'Downstream write parameter frame',
$data_len = unpack('C', substr($data,1,1));
$data_range = substr($data,2, $data_len);
} elsif ( $up_down eq 'up' && $function_code == 0x06 ) {
# type C
+ # 0x06 => 'Upstream return write parameter frame',
- # FIXME check first byte?
- my $data_range = substr($data,1,1);
+ $data_len = unpack('C', substr($data,1,1));
+ $data_range = substr($data,2, $data_len);
+ if ( $data_len == 1 ) {
+ # XXX return is OK/not OK
+ $pack_fmt = 'C';
+ }
- $data = substr($data,2);
+ $data = substr($data,2 + $data_len);
} else {
$hash->{error}->{function_code_unknown} = $function_code;
- warn "ERROR unknown function_code = $function_code";
+ print STDERR "ERROR unknown function_code = $function_code\n";
+ return $hash;
}
my @v = unpack($pack_fmt, $data_range);