diff --git a/FHEM/lib/Device/Firmata.pm b/FHEM/lib/Device/Firmata.pm index a7cf37c8d..307ae88a6 100644 --- a/FHEM/lib/Device/Firmata.pm +++ b/FHEM/lib/Device/Firmata.pm @@ -19,7 +19,7 @@ Version 0.50 =cut -our $VERSION = '0.54'; +our $VERSION = '0.55'; our $DEBUG = 0; diff --git a/FHEM/lib/Device/Firmata/Platform.pm b/FHEM/lib/Device/Firmata/Platform.pm index fb5b097b9..678e330da 100644 --- a/FHEM/lib/Device/Firmata/Platform.pm +++ b/FHEM/lib/Device/Firmata/Platform.pm @@ -31,6 +31,7 @@ use Device::Firmata::Base stepper_resolutions => {}, encoder_resolutions => {}, ports => [], + input_ports => [], pins => {}, pin_modes => {}, encoders => [], @@ -82,6 +83,7 @@ sub detach { $self->{sysex_data} = []; $self->{analog_pins} = []; $self->{ports} = []; + $self->{input_ports} = []; $self->{pins} = {}; $self->{pin_modes} = {}; $self->{digital_observer} = []; @@ -146,7 +148,7 @@ sub messages_handle { $command eq 'DIGITAL_MESSAGE' and do { my $port_number = $message->{command} & 0x0f; my $port_state = $data->[0] | ( $data->[1] << 7 ); - my $old_state = $self->{ports}[$port_number]; + my $old_state = $self->{input_ports}[$port_number] ||= 0; my $observers = $self->{digital_observer}; my $pinbase = $port_number << 3; for ( my $i = 0 ; $i < 8 ; $i++ ) { @@ -156,17 +158,13 @@ sub messages_handle { my $pin_mask = 1 << $i; $observer->{method}( $pin, - defined $old_state - ? ( $old_state & $pin_mask ) > 0 - ? 1 - : 0 - : undef, + ( $old_state & $pin_mask ) > 0 ? 1 : 0, ( $port_state & $pin_mask ) > 0 ? 1 : 0, $observer->{context} ); } } - $self->{ports}[$port_number] = $port_state; + $self->{input_ports}[$port_number] = $port_state; }; # Handle analog pin messages @@ -434,7 +432,7 @@ sub pin_mode { PIN_MODE_HANDLER: { - ( $mode == PIN_INPUT or $mode == PIN_OUTPUT ) and do { + ( $mode == PIN_INPUT ) and do { my $port_number = $pin >> 3; $self->{io}->data_write($self->{protocol}->message_prepare( SET_PIN_MODE => 0, $pin, $mode )); $self->{io}->data_write($self->{protocol}->message_prepare( REPORT_DIGITAL => $port_number, 1 )); @@ -497,7 +495,7 @@ sub digital_read { my $port_number = $pin >> 3; my $pin_offset = $pin % 8; my $pin_mask = 1 << $pin_offset; - my $port_state = $self->{ports}[$port_number] ||= 0; + my $port_state = $self->{input_ports}[$port_number] ||= 0; return ( $port_state & $pin_mask ? 1 : 0 ); }