2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-01 01:09:47 +00:00

FRM: fix digital-input-message overriding output state

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

View File

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

View File

@ -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 );
}