From 7b62d329f964a9bd055983745a6c10395d7c99c2 Mon Sep 17 00:00:00 2001 From: ntruchsess <> Date: Sat, 2 Feb 2013 17:54:39 +0000 Subject: [PATCH] fix servo git-svn-id: https://svn.fhem.de/fhem/trunk@2635 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_FRM.pm | 2 +- fhem/FHEM/20_FRM_PWM.pm | 13 +++++++++++-- fhem/FHEM/20_FRM_SERVO.pm | 13 +++++++++++-- fhem/FHEM/lib/Device/Firmata/Platform.pm | 14 +++++++++++--- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/fhem/FHEM/10_FRM.pm b/fhem/FHEM/10_FRM.pm index 6b37a06b6..2bd37b967 100755 --- a/fhem/FHEM/10_FRM.pm +++ b/fhem/FHEM/10_FRM.pm @@ -20,7 +20,7 @@ sub FRM_Initialize($) { # Provider $hash->{Clients} = - ":FRM_IN:FRM_OUT:FRM_AD:FRM_PWM:FRM_I2C:OWX:"; + ":FRM_IN:FRM_OUT:FRM_AD:FRM_PWM:FRM_I2C:FRM_SERVO:OWX:"; $hash->{ReadyFn} = "FRM_Ready"; $hash->{ReadFn} = "FRM_Read"; diff --git a/fhem/FHEM/20_FRM_PWM.pm b/fhem/FHEM/20_FRM_PWM.pm index 0617240f6..74063842c 100755 --- a/fhem/FHEM/20_FRM_PWM.pm +++ b/fhem/FHEM/20_FRM_PWM.pm @@ -7,6 +7,11 @@ use Device::Firmata; use Device::Firmata::Constants qw/ :all /; ##################################### + +my %sets = ( + "value" => "", +); + sub FRM_PWM_Initialize($) { @@ -37,7 +42,11 @@ sub FRM_PWM_Set($@) { my ($hash, @a) = @_; - my $value = $a[1]; + return "Need at least one parameters" if(@a < 2); + return "Unknown argument $a[1], choose one of " . join(" ", sort keys %sets) + if(!defined($sets{$a[1]})); + my $command = $a[1]; + my $value = $a[2]; my $iodev = $hash->{IODev}; if (defined $iodev and defined $iodev->{FirmataDevice} and defined $iodev->{FD}) { $iodev->{FirmataDevice}->analog_write($hash->{PIN},$value); @@ -79,7 +88,7 @@ FRM_PWM_Undef($$) Set
diff --git a/fhem/FHEM/20_FRM_SERVO.pm b/fhem/FHEM/20_FRM_SERVO.pm index 6d3372881..c47d8f86e 100755 --- a/fhem/FHEM/20_FRM_SERVO.pm +++ b/fhem/FHEM/20_FRM_SERVO.pm @@ -7,6 +7,11 @@ use Device::Firmata; use Device::Firmata::Constants qw/ :all /; ##################################### + +my %sets = ( + "angle" => "", +); + sub FRM_SERVO_Initialize($) { @@ -60,7 +65,11 @@ sub FRM_SERVO_Set($@) { my ($hash, @a) = @_; - my $value = $a[1]; + return "Need at least one parameters" if(@a < 2); + return "Unknown argument $a[1], choose one of " . join(" ", sort keys %sets) + if(!defined($sets{$a[1]})); + my $command = $a[1]; + my $value = $a[2]; my $iodev = $hash->{IODev}; if (defined $iodev and defined $iodev->{FirmataDevice} and defined $iodev->{FD}) { $iodev->{FirmataDevice}->servo_write($hash->{PIN},$value); @@ -102,7 +111,7 @@ FRM_SERVO_Undef($$) Set
Get
diff --git a/fhem/FHEM/lib/Device/Firmata/Platform.pm b/fhem/FHEM/lib/Device/Firmata/Platform.pm index a5d795912..27a9834a1 100644 --- a/fhem/FHEM/lib/Device/Firmata/Platform.pm +++ b/fhem/FHEM/lib/Device/Firmata/Platform.pm @@ -436,7 +436,7 @@ sub pin_mode { last; }; - ( $mode == PIN_PWM || $mode == PIN_I2C || $mode == PIN_ONEWIRE ) and do { + ( $mode == PIN_PWM || $mode == PIN_I2C || $mode == PIN_ONEWIRE || $mode == PIN_SERVO ) and do { $self->{io}->data_write($self->{protocol}->message_prepare( SET_PIN_MODE => 0, $pin, $mode )); last; }; @@ -594,9 +594,17 @@ sub i2c_config { } sub servo_write { + + # -------------------------------------------------- + # Sets the SERVO value on an arduino + # my ( $self, $pin, $value ) = @_; - return undef unless $self->is_configured_mode($pin,PIN_SERVO); - return analog_write( $self, $pin, $value ); + return undef unless $self->is_configured_mode($pin,PIN_SERVO); + + # FIXME: 8 -> 7 bit translation should be done in the protocol module + my $byte_0 = $value & 0x7f; + my $byte_1 = $value >> 7; + return $self->{io}->data_write($self->{protocol}->message_prepare( ANALOG_MESSAGE => $pin, $byte_0, $byte_1 )); } sub servo_config {