From ef87ad7879cfc9f13cced39926b2fda78aad280d Mon Sep 17 00:00:00 2001 From: Karan Misra Date: Thu, 27 Feb 2014 05:59:38 +0530 Subject: [PATCH] make the process of registered available hosts less clunky --- describe.go | 31 ------------------------------- hal.go | 5 +++-- host/bbb/descriptor.go | 22 ++++++++++------------ host/descriptor.go | 31 +++++++++++++++++++++++++++++++ detect.go => host/detect.go | 18 +++++++++--------- host/rpi/descriptor.go | 21 +++++++++------------ samples/gpiodetect.go | 7 ++++--- 7 files changed, 66 insertions(+), 69 deletions(-) delete mode 100644 describe.go create mode 100644 host/descriptor.go rename detect.go => host/detect.go (88%) diff --git a/describe.go b/describe.go deleted file mode 100644 index 34c13d5..0000000 --- a/describe.go +++ /dev/null @@ -1,31 +0,0 @@ -package embd - -import ( - "errors" - - "github.com/kidoman/embd/gpio" - "github.com/kidoman/embd/host/bbb" - "github.com/kidoman/embd/host/rpi" - "github.com/kidoman/embd/i2c" -) - -type descriptor interface { - GPIO() gpio.GPIO - I2C() i2c.I2C -} - -func describeHost() (descriptor, error) { - host, rev, err := DetectHost() - if err != nil { - return nil, err - } - - switch host { - case HostRPi: - return rpi.Descriptor(rev), nil - case HostBBB: - return bbb.Descriptor(rev), nil - default: - return nil, errors.New("host: invalid host") - } -} diff --git a/hal.go b/hal.go index 7979531..b9c9704 100644 --- a/hal.go +++ b/hal.go @@ -2,6 +2,7 @@ package embd import ( "github.com/kidoman/embd/gpio" + "github.com/kidoman/embd/host" "github.com/kidoman/embd/i2c" ) @@ -16,7 +17,7 @@ const ( ) func NewGPIO() (gpio.GPIO, error) { - desc, err := describeHost() + desc, err := host.Describe() if err != nil { return nil, err } @@ -25,7 +26,7 @@ func NewGPIO() (gpio.GPIO, error) { } func NewI2C() (i2c.I2C, error) { - desc, err := describeHost() + desc, err := host.Describe() if err != nil { return nil, err } diff --git a/host/bbb/descriptor.go b/host/bbb/descriptor.go index ee36972..c3dae38 100644 --- a/host/bbb/descriptor.go +++ b/host/bbb/descriptor.go @@ -4,20 +4,18 @@ import ( lgpio "github.com/kidoman/embd/driver/linux/gpio" li2c "github.com/kidoman/embd/driver/linux/i2c" "github.com/kidoman/embd/gpio" - "github.com/kidoman/embd/i2c" + "github.com/kidoman/embd/host" ) -type descriptor struct { +func init() { + host.Describers[host.BBB] = describer } -func (d *descriptor) GPIO() gpio.GPIO { - return lgpio.New(pins) -} - -func (d *descriptor) I2C() i2c.I2C { - return li2c.New() -} - -func Descriptor(rev int) *descriptor { - return &descriptor{} +func describer(rev int) *host.Descriptor { + return &host.Descriptor{ + GPIO: func() gpio.GPIO { + return lgpio.New(pins) + }, + I2C: li2c.New, + } } diff --git a/host/descriptor.go b/host/descriptor.go new file mode 100644 index 0000000..6057cf6 --- /dev/null +++ b/host/descriptor.go @@ -0,0 +1,31 @@ +package host + +import ( + "errors" + + "github.com/kidoman/embd/gpio" + "github.com/kidoman/embd/i2c" +) + +type Descriptor struct { + GPIO func() gpio.GPIO + I2C func() i2c.I2C +} + +type Describer func(rev int) *Descriptor + +var Describers = map[Host]Describer{} + +func Describe() (*Descriptor, error) { + host, rev, err := Detect() + if err != nil { + return nil, err + } + + describer, ok := Describers[host] + if !ok { + return nil, errors.New("host: invalid host") + } + + return describer(rev), nil +} diff --git a/detect.go b/host/detect.go similarity index 88% rename from detect.go rename to host/detect.go index fdd9362..5dd88a7 100644 --- a/detect.go +++ b/host/detect.go @@ -1,4 +1,4 @@ -package embd +package host import ( "fmt" @@ -10,11 +10,11 @@ import ( type Host int const ( - HostNull Host = iota - HostRPi - HostBBB - HostCubieTruck - HostGalileo + Null Host = iota + RPi + BBB + CubieTruck + Galileo ) func execOutput(name string, arg ...string) (output string, err error) { @@ -51,7 +51,7 @@ func kernelVersion() (major, minor, patch int, err error) { return } -func DetectHost() (host Host, rev int, err error) { +func Detect() (host Host, rev int, err error) { major, minor, patch, err := kernelVersion() if err != nil { return @@ -69,9 +69,9 @@ func DetectHost() (host Host, rev int, err error) { switch node { case "raspberrypi": - host = HostRPi + host = RPi case "beaglebone": - host = HostBBB + host = BBB default: err = fmt.Errorf("embd: your host %q is not supported at this moment. please request support at https://github.com/kidoman/embd/issues", node) } diff --git a/host/rpi/descriptor.go b/host/rpi/descriptor.go index 9b9113b..7e412f1 100644 --- a/host/rpi/descriptor.go +++ b/host/rpi/descriptor.go @@ -7,23 +7,20 @@ import ( "github.com/kidoman/embd/i2c" ) -type descriptor struct { - rev int +func init() { + host.Describers[host.RPi] = describer } -func (d *descriptor) GPIO() gpio.GPIO { +func describer(rev int) *host.Descriptor { var pins = rev1Pins if d.rev > 1 { pins = rev2Pins } - return lgpio.New(pins) -} - -func (d *descriptor) I2C() i2c.I2C { - return li2c.New() -} - -func Descriptor(rev int) *descriptor { - return &descriptor{rev} + return &host.Descriptor{ + GPIO: func() gpio.GPIO { + return lgpio.New(pins) + }, + I2C: li2c.New, + } } diff --git a/samples/gpiodetect.go b/samples/gpiodetect.go index 17f3252..cbd0e81 100644 --- a/samples/gpiodetect.go +++ b/samples/gpiodetect.go @@ -4,10 +4,11 @@ import ( "time" "github.com/kidoman/embd" + "github.com/kidoman/embd/host" ) func main() { - h, _, err := embd.DetectHost() + h, _, err := host.Detect() if err != nil { return } @@ -15,9 +16,9 @@ func main() { var pinNo interface{} switch h { - case embd.HostBBB: + case host.BBB: pinNo = "P9_31" - case embd.HostRPi: + case host.RPi: pinNo = 10 default: panic("host not supported (yet :P)")