diff --git a/hal/driver.go b/hal/driver.go index d5ebfa0..6c5c86a 100644 --- a/hal/driver.go +++ b/hal/driver.go @@ -2,6 +2,7 @@ package hal import ( "fmt" + "sort" "github.com/reef-pi/hal" "github.com/reef-pi/rpi/pwm" @@ -45,3 +46,37 @@ func (d *driver) Pins(cap hal.Capability) ([]hal.Pin, error) { return nil, fmt.Errorf("Unsupported capability:%s", cap.String()) } } + +func (r *driver) DigitalInputPins() []hal.DigitalInputPin { + var pins []hal.DigitalInputPin + for _, pin := range r.pins { + pins = append(pins, pin) + } + sort.Slice(pins, func(i, j int) bool { return pins[i].Name() < pins[j].Name() }) + return pins +} + +func (r *driver) DigitalInputPin(p int) (hal.DigitalInputPin, error) { + pin, ok := r.pins[p] + if !ok { + return nil, fmt.Errorf("pin %d unknown", p) + } + return pin, nil +} + +func (r *driver) DigitalOutputPins() []hal.DigitalOutputPin { + var pins []hal.DigitalOutputPin + for _, pin := range r.pins { + pins = append(pins, pin) + } + sort.Slice(pins, func(i, j int) bool { return pins[i].Name() < pins[j].Name() }) + return pins +} + +func (r *driver) DigitalOutputPin(p int) (hal.DigitalOutputPin, error) { + pin, ok := r.pins[p] + if !ok { + return nil, fmt.Errorf("pin %d unknown", p) + } + return pin, nil +} diff --git a/hal/factory.go b/hal/factory.go index 9423d86..2dc60f9 100644 --- a/hal/factory.go +++ b/hal/factory.go @@ -90,7 +90,7 @@ func (f *rpiFactory) Metadata() hal.Metadata { return f.meta } -func (f *rpiFactory) NewDriver(parameters map[string]interface{}, hardwareResources interface{}) (hal.Driver, error) { +func (f *rpiFactory) NewDriver(parameters map[string]interface{}, _ interface{}) (hal.Driver, error) { if valid, failures := f.ValidateParameters(parameters); !valid { return nil, errors.New(hal.ToErrorString(failures)) } diff --git a/hal/gpio.go b/hal/gpio.go deleted file mode 100644 index 82e9a34..0000000 --- a/hal/gpio.go +++ /dev/null @@ -1,116 +0,0 @@ -package hal - -import ( - "fmt" - "sort" - - "github.com/reef-pi/hal" -) - -var ( - validGPIOPins = map[int]bool{ - 2: true, - 3: true, - 4: true, - 5: true, - 6: true, - 7: true, - 8: true, - 9: true, - 10: true, - 11: true, - 12: true, - 13: true, - 14: true, - 15: true, - 16: true, - 17: true, - 18: true, - 19: true, - 20: true, - 21: true, - 22: true, - 23: true, - 24: true, - 25: true, - 26: true, - 27: true, - } -) - -type pin struct { - number int - name string - lastState bool - - digitalPin DigitalPin -} - -func (p *pin) Name() string { - return p.name -} -func (p *pin) Number() int { - return p.number -} - -func (p *pin) Close() error { - return p.digitalPin.Close() -} - -func (p *pin) Read() (bool, error) { - if err := p.digitalPin.SetDirection(false); err != nil { - return false, fmt.Errorf("can't read input from pin %d: %v", p.number, err) - } - v, err := p.digitalPin.Read() - return v == 1, err -} - -func (p *pin) Write(state bool) error { - if err := p.digitalPin.SetDirection(true); err != nil { - return fmt.Errorf("can't set output on pin %d: %v", p.number, err) - } - value := 0 - if state { - value = 1 - } - p.lastState = state - return p.digitalPin.Write(value) -} - -func (p *pin) LastState() bool { - return p.lastState -} - -func (r *driver) DigitalInputPins() []hal.DigitalInputPin { - var pins []hal.DigitalInputPin - for _, pin := range r.pins { - pins = append(pins, pin) - } - sort.Slice(pins, func(i, j int) bool { return pins[i].Name() < pins[j].Name() }) - return pins -} - -func (r *driver) DigitalInputPin(p int) (hal.DigitalInputPin, error) { - pin, ok := r.pins[p] - if !ok { - return nil, fmt.Errorf("pin %d unknown", p) - } - return pin, nil -} - -func (r *driver) DigitalOutputPins() []hal.DigitalOutputPin { - var pins []hal.DigitalOutputPin - for _, pin := range r.pins { - pins = append(pins, pin) - } - sort.Slice(pins, func(i, j int) bool { return pins[i].Name() < pins[j].Name() }) - return pins -} - -func (r *driver) DigitalOutputPin(p int) (hal.DigitalOutputPin, error) { - pin, ok := r.pins[p] - if !ok { - return nil, fmt.Errorf("pin %d unknown", p) - } - return pin, nil -} diff --git a/hal/pin.go b/hal/pin.go new file mode 100644 index 0000000..bbe1166 --- /dev/null +++ b/hal/pin.go @@ -0,0 +1,46 @@ +package hal + +import "fmt" + +type pin struct { + number int + name string + lastState bool + + digitalPin DigitalPin +} + +func (p *pin) Name() string { + return p.name +} +func (p *pin) Number() int { + return p.number +} + +func (p *pin) Close() error { + return p.digitalPin.Close() +} + +func (p *pin) Read() (bool, error) { + if err := p.digitalPin.SetDirection(false); err != nil { + return false, fmt.Errorf("can't read input from pin %d: %v", p.number, err) + } + v, err := p.digitalPin.Read() + return v == 1, err +} + +func (p *pin) Write(state bool) error { + if err := p.digitalPin.SetDirection(true); err != nil { + return fmt.Errorf("can't set output on pin %d: %v", p.number, err) + } + value := 0 + if state { + value = 1 + } + p.lastState = state + return p.digitalPin.Write(value) +} + +func (p *pin) LastState() bool { + return p.lastState +} diff --git a/hal/valid_gpio_pins.go b/hal/valid_gpio_pins.go new file mode 100644 index 0000000..aed7e60 --- /dev/null +++ b/hal/valid_gpio_pins.go @@ -0,0 +1,32 @@ +package hal + +var ( + validGPIOPins = map[int]bool{ + 2: true, + 3: true, + 4: true, + 5: true, + 6: true, + 7: true, + 8: true, + 9: true, + 10: true, + 11: true, + 12: true, + 13: true, + 14: true, + 15: true, + 16: true, + 17: true, + 18: true, + 19: true, + 20: true, + 21: true, + 22: true, + 23: true, + 24: true, + 25: true, + 26: true, + 27: true, + } +)