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:
parent
981e73b9ec
commit
06cc863c21
@ -19,7 +19,7 @@ Version 0.50
|
||||
|
||||
=cut
|
||||
|
||||
our $VERSION = '0.54';
|
||||
our $VERSION = '0.55';
|
||||
our $DEBUG = 0;
|
||||
|
||||
|
||||
|
@ -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 );
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user