FRM: fix digital-input-message overriding output state

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@5540 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
ntruchsess 2014-04-17 08:50:48 +00:00
parent a705405737
commit 5d61a24531
2 changed files with 8 additions and 10 deletions

View File

@ -19,7 +19,7 @@ Version 0.50
=cut =cut
our $VERSION = '0.54'; our $VERSION = '0.55';
our $DEBUG = 0; our $DEBUG = 0;

View File

@ -31,6 +31,7 @@ use Device::Firmata::Base
stepper_resolutions => {}, stepper_resolutions => {},
encoder_resolutions => {}, encoder_resolutions => {},
ports => [], ports => [],
input_ports => [],
pins => {}, pins => {},
pin_modes => {}, pin_modes => {},
encoders => [], encoders => [],
@ -82,6 +83,7 @@ sub detach {
$self->{sysex_data} = []; $self->{sysex_data} = [];
$self->{analog_pins} = []; $self->{analog_pins} = [];
$self->{ports} = []; $self->{ports} = [];
$self->{input_ports} = [];
$self->{pins} = {}; $self->{pins} = {};
$self->{pin_modes} = {}; $self->{pin_modes} = {};
$self->{digital_observer} = []; $self->{digital_observer} = [];
@ -146,7 +148,7 @@ sub messages_handle {
$command eq 'DIGITAL_MESSAGE' and do { $command eq 'DIGITAL_MESSAGE' and do {
my $port_number = $message->{command} & 0x0f; my $port_number = $message->{command} & 0x0f;
my $port_state = $data->[0] | ( $data->[1] << 7 ); 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 $observers = $self->{digital_observer};
my $pinbase = $port_number << 3; my $pinbase = $port_number << 3;
for ( my $i = 0 ; $i < 8 ; $i++ ) { for ( my $i = 0 ; $i < 8 ; $i++ ) {
@ -156,17 +158,13 @@ sub messages_handle {
my $pin_mask = 1 << $i; my $pin_mask = 1 << $i;
$observer->{method}( $observer->{method}(
$pin, $pin,
defined $old_state ( $old_state & $pin_mask ) > 0 ? 1 : 0,
? ( $old_state & $pin_mask ) > 0
? 1
: 0
: undef,
( $port_state & $pin_mask ) > 0 ? 1 : 0, ( $port_state & $pin_mask ) > 0 ? 1 : 0,
$observer->{context} $observer->{context}
); );
} }
} }
$self->{ports}[$port_number] = $port_state; $self->{input_ports}[$port_number] = $port_state;
}; };
# Handle analog pin messages # Handle analog pin messages
@ -434,7 +432,7 @@ sub pin_mode {
PIN_MODE_HANDLER: { PIN_MODE_HANDLER: {
( $mode == PIN_INPUT or $mode == PIN_OUTPUT ) and do { ( $mode == PIN_INPUT ) and do {
my $port_number = $pin >> 3; 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( SET_PIN_MODE => 0, $pin, $mode ));
$self->{io}->data_write($self->{protocol}->message_prepare( REPORT_DIGITAL => $port_number, 1 )); $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 $port_number = $pin >> 3;
my $pin_offset = $pin % 8; my $pin_offset = $pin % 8;
my $pin_mask = 1 << $pin_offset; 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 ); return ( $port_state & $pin_mask ? 1 : 0 );
} }