From 2e7e59b1ce82999c3580041abd4e8f8767cf7781 Mon Sep 17 00:00:00 2001 From: deadprogram Date: Wed, 13 Dec 2017 15:20:07 +0100 Subject: [PATCH] spi: add support for MCP3004 A/D converter Signed-off-by: deadprogram --- drivers/spi/mcp3004.go | 74 +++++++++++++++++++++++++++++++++++++ drivers/spi/mcp3004_test.go | 35 ++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 drivers/spi/mcp3004.go create mode 100644 drivers/spi/mcp3004_test.go diff --git a/drivers/spi/mcp3004.go b/drivers/spi/mcp3004.go new file mode 100644 index 00000000..9c53215b --- /dev/null +++ b/drivers/spi/mcp3004.go @@ -0,0 +1,74 @@ +package spi + +import ( + "strconv" + + "gobot.io/x/gobot" +) + +// MCP3004Driver is a driver for the MCP3008 A/D converter. +type MCP3004Driver struct { + name string + connector Connector + connection Connection +} + +// NewMCP3004Driver creates a new Gobot Driver for MCP3004Driver A/D converter +// +// Params: +// a *Adaptor - the Adaptor to use with this Driver +// +func NewMCP3004Driver(a Connector) *MCP3004Driver { + d := &MCP3004Driver{ + name: gobot.DefaultName("MCP3008"), + connector: a, + } + return d +} + +// Name returns the name of the device. +func (d *MCP3004Driver) Name() string { return d.name } + +// SetName sets the name of the device. +func (d *MCP3004Driver) SetName(n string) { d.name = n } + +// Connection returns the Connection of the device. +func (d *MCP3004Driver) Connection() gobot.Connection { return d.connection.(gobot.Connection) } + +// Start initializes the driver. +func (d *MCP3004Driver) Start() (err error) { + bus := d.connector.GetSpiDefaultBus() + mode := d.connector.GetSpiDefaultMode() + maxSpeed := d.connector.GetSpiDefaultMaxSpeed() + d.connection, err = d.connector.GetSpiConnection(bus, mode, maxSpeed) + if err != nil { + return err + } + return nil +} + +// Halt stops the driver. +func (d *MCP3004Driver) Halt() (err error) { + d.connection.Close() + return +} + +// Read reads the current analog data for the desired channel. +func (d *MCP3004Driver) Read(channel int) (int, error) { + tx := make([]byte, 3) + tx[0] = 0x01 + tx[1] = 0x80 + (byte(channel) << 4) + tx[2] = 0x00 + + d.connection.Tx(tx, nil) + + return 0, nil +} + +// AnalogRead returns value from analog reading of specified pin +func (d *MCP3004Driver) AnalogRead(pin string) (value int, err error) { + channel, _ := strconv.Atoi(pin) + value, err = d.Read(channel) + + return +} diff --git a/drivers/spi/mcp3004_test.go b/drivers/spi/mcp3004_test.go new file mode 100644 index 00000000..8f542c4f --- /dev/null +++ b/drivers/spi/mcp3004_test.go @@ -0,0 +1,35 @@ +package spi + +import ( + "testing" + + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/aio" + "gobot.io/x/gobot/gobottest" +) + +var _ gobot.Driver = (*MCP3004Driver)(nil) + +// must implement the AnalogReader interface +var _ aio.AnalogReader = (*MCP3004Driver)(nil) + +func initTestMCP3004Driver() *MCP3004Driver { + d := NewMCP3004Driver(&TestConnector{}) + return d +} + +func TestMCP3004DriverStart(t *testing.T) { + d := initTestMCP3004Driver() + gobottest.Assert(t, d.Start(), nil) +} + +func TestMCP3004DriverHalt(t *testing.T) { + d := initTestMCP3004Driver() + d.Start() + gobottest.Assert(t, d.Halt(), nil) +} + +func TestMCP3004DriverRead(t *testing.T) { + d := initTestMCP3004Driver() + d.Start() +}