1
0
mirror of https://github.com/hybridgroup/gobot.git synced 2025-04-27 13:48:56 +08:00

Merge pull request #300 from losinggeneration/servo_config

Fix the ServoConfig byte order
This commit is contained in:
Ron Evans 2016-07-29 22:03:43 +02:00 committed by GitHub
commit 64d520c756
4 changed files with 75 additions and 12 deletions

View File

@ -218,10 +218,10 @@ func (b *Client) ServoConfig(pin int, max int, min int) error {
ret := []byte{ ret := []byte{
ServoConfig, ServoConfig,
byte(pin), byte(pin),
byte(max & 0x7F),
byte((max >> 7) & 0x7F),
byte(min & 0x7F), byte(min & 0x7F),
byte((min >> 7) & 0x7F), byte((min >> 7) & 0x7F),
byte(max & 0x7F),
byte((max >> 7) & 0x7F),
} }
return b.writeSysex(ret) return b.writeSysex(ret)
} }

View File

@ -1,6 +1,7 @@
package client package client
import ( import (
"bytes"
"testing" "testing"
"time" "time"
@ -11,10 +12,11 @@ import (
type readWriteCloser struct{} type readWriteCloser struct{}
func (readWriteCloser) Write(p []byte) (int, error) { func (readWriteCloser) Write(p []byte) (int, error) {
return len(p), nil return testWriteData.Write(p)
} }
var testReadData = []byte{} var testReadData = []byte{}
var testWriteData = bytes.Buffer{}
func (readWriteCloser) Read(b []byte) (int, error) { func (readWriteCloser) Read(b []byte) (int, error) {
size := len(b) size := len(b)
@ -218,3 +220,38 @@ func TestConnect(t *testing.T) {
gobottest.Assert(t, b.Connect(readWriteCloser{}), nil) gobottest.Assert(t, b.Connect(readWriteCloser{}), nil)
} }
func TestServoConfig(t *testing.T) {
b := New()
b.connection = readWriteCloser{}
tests := []struct {
description string
arguments [3]int
expected []byte
result error
}{
{
description: "Min values for min & max",
arguments: [3]int{9, 0, 0},
expected: []byte{0xF0, 0x70, 9, 0, 0, 0, 0, 0xF7},
},
{
description: "Max values for min & max",
arguments: [3]int{9, 0x3FFF, 0x3FFF},
expected: []byte{0xF0, 0x70, 9, 0x7F, 0x7F, 0x7F, 0x7F, 0xF7},
},
{
description: "Clipped max values for min & max",
arguments: [3]int{9, 0xFFFF, 0xFFFF},
expected: []byte{0xF0, 0x70, 9, 0x7F, 0x7F, 0x7F, 0x7F, 0xF7},
},
}
for _, test := range tests {
testWriteData.Reset()
err := b.ServoConfig(test.arguments[0], test.arguments[1], test.arguments[2])
gobottest.Assert(t, testWriteData.Bytes(), test.expected)
gobottest.Assert(t, err, test.result)
}
}

View File

@ -34,6 +34,7 @@ type firmataBoard interface {
I2cRead(int, int) error I2cRead(int, int) error
I2cWrite(int, []byte) error I2cWrite(int, []byte) error
I2cConfig(int) error I2cConfig(int) error
ServoConfig(int, int, int) error
Event(string) *gobot.Event Event(string) *gobot.Event
} }
@ -115,6 +116,16 @@ func (f *FirmataAdaptor) Port() string { return f.port }
// Name returns the FirmataAdaptors name // Name returns the FirmataAdaptors name
func (f *FirmataAdaptor) Name() string { return f.name } func (f *FirmataAdaptor) Name() string { return f.name }
// ServoConfig sets the pulse width in microseconds for a pin attached to a servo
func (f *FirmataAdaptor) ServoConfig(pin string, min, max int) error {
p, err := strconv.Atoi(pin)
if err != nil {
return err
}
return f.board.ServoConfig(p, max, min)
}
// ServoWrite writes the 0-180 degree angle to the specified pin. // ServoWrite writes the 0-180 degree angle to the specified pin.
func (f *FirmataAdaptor) ServoWrite(pin string, angle byte) (err error) { func (f *FirmataAdaptor) ServoWrite(pin string, angle byte) (err error) {
p, err := strconv.Atoi(pin) p, err := strconv.Atoi(pin)

View File

@ -1,8 +1,11 @@
package firmata package firmata
import ( import (
"bytes"
"errors" "errors"
"fmt"
"io" "io"
"strings"
"testing" "testing"
"time" "time"
@ -14,10 +17,11 @@ import (
type readWriteCloser struct{} type readWriteCloser struct{}
func (readWriteCloser) Write(p []byte) (int, error) { func (readWriteCloser) Write(p []byte) (int, error) {
return len(p), nil return testWriteData.Write(p)
} }
var testReadData = []byte{} var testReadData = []byte{}
var testWriteData = bytes.Buffer{}
func (readWriteCloser) Read(b []byte) (int, error) { func (readWriteCloser) Read(b []byte) (int, error) {
size := len(b) size := len(b)
@ -61,14 +65,15 @@ func (m mockFirmataBoard) Disconnect() error {
func (m mockFirmataBoard) Pins() []client.Pin { func (m mockFirmataBoard) Pins() []client.Pin {
return m.pins return m.pins
} }
func (mockFirmataBoard) AnalogWrite(int, int) error { return nil } func (mockFirmataBoard) AnalogWrite(int, int) error { return nil }
func (mockFirmataBoard) SetPinMode(int, int) error { return nil } func (mockFirmataBoard) SetPinMode(int, int) error { return nil }
func (mockFirmataBoard) ReportAnalog(int, int) error { return nil } func (mockFirmataBoard) ReportAnalog(int, int) error { return nil }
func (mockFirmataBoard) ReportDigital(int, int) error { return nil } func (mockFirmataBoard) ReportDigital(int, int) error { return nil }
func (mockFirmataBoard) DigitalWrite(int, int) error { return nil } func (mockFirmataBoard) DigitalWrite(int, int) error { return nil }
func (mockFirmataBoard) I2cRead(int, int) error { return nil } func (mockFirmataBoard) I2cRead(int, int) error { return nil }
func (mockFirmataBoard) I2cWrite(int, []byte) error { return nil } func (mockFirmataBoard) I2cWrite(int, []byte) error { return nil }
func (mockFirmataBoard) I2cConfig(int) error { return nil } func (mockFirmataBoard) I2cConfig(int) error { return nil }
func (mockFirmataBoard) ServoConfig(int, int, int) error { return nil }
func initTestFirmataAdaptor() *FirmataAdaptor { func initTestFirmataAdaptor() *FirmataAdaptor {
a := NewFirmataAdaptor("board", "/dev/null") a := NewFirmataAdaptor("board", "/dev/null")
@ -166,3 +171,13 @@ func TestFirmataAdaptorI2cWrite(t *testing.T) {
a := initTestFirmataAdaptor() a := initTestFirmataAdaptor()
a.I2cWrite(0x00, []byte{0x00, 0x01}) a.I2cWrite(0x00, []byte{0x00, 0x01})
} }
func TestServoConfig(t *testing.T) {
a := initTestFirmataAdaptor()
err := a.ServoConfig("9", 0, 0)
gobottest.Assert(t, err, nil)
// test atoi error
err = a.ServoConfig("a", 0, 0)
gobottest.Assert(t, true, strings.Contains(fmt.Sprintf("%v", err), "invalid syntax"))
}