new API for shifter driver.

this doesn't break existing code, but it might no longer work as expected
This commit is contained in:
Daniel Esteban
2020-03-01 12:06:16 +01:00
committed by Ron Evans
parent c7cbd7c6cd
commit 583e80026a
2 changed files with 35 additions and 24 deletions
+21 -16
View File
@@ -7,42 +7,47 @@ import (
"tinygo.org/x/drivers/shifter" "tinygo.org/x/drivers/shifter"
) )
const (
BUTTON_LEFT = iota
BUTTON_UP
BUTTON_DOWN
BUTTON_RIGHT
BUTTON_SELECT
BUTTON_START
BUTTON_A
BUTTON_B
)
func main() { func main() {
buttons := shifter.New(shifter.EIGHT_BITS, machine.BUTTON_LATCH, machine.BUTTON_CLK, machine.BUTTON_OUT) buttons := shifter.New(shifter.EIGHT_BITS, machine.BUTTON_LATCH, machine.BUTTON_CLK, machine.BUTTON_OUT)
buttons.Configure() buttons.Configure()
for { for {
// Slower // Update the pins state, to later be returned by .Get()
for i := 0; i < 8; i++ { buttons.Read8Input()
if buttons.Pins[i].Get() {
println("Button", i, "pressed")
}
}
// Faster if buttons.Pins[BUTTON_LEFT].Get() {
pressed, _ := buttons.Read8Input()
if pressed&machine.BUTTON_LEFT_MASK > 0 {
println("Button LEFT pressed") println("Button LEFT pressed")
} }
if pressed&machine.BUTTON_UP_MASK > 0 { if buttons.Pins[BUTTON_UP].Get() {
println("Button UP pressed") println("Button UP pressed")
} }
if pressed&machine.BUTTON_DOWN_MASK > 0 { if buttons.Pins[BUTTON_DOWN].Get() {
println("Button DOWN pressed") println("Button DOWN pressed")
} }
if pressed&machine.BUTTON_RIGHT_MASK > 0 { if buttons.Pins[BUTTON_RIGHT].Get() {
println("Button RIGHT pressed") println("Button RIGHT pressed")
} }
if pressed&machine.BUTTON_SELECT_MASK > 0 { if buttons.Pins[BUTTON_SELECT].Get() {
println("Button SELECT pressed") println("Button SELECT pressed")
} }
if pressed&machine.BUTTON_START_MASK > 0 { if buttons.Pins[BUTTON_START].Get() {
println("Button START pressed") println("Button START pressed")
} }
if pressed&machine.BUTTON_A_MASK > 0 { if buttons.Pins[BUTTON_A].Get() {
println("Button A pressed") println("Button A pressed")
} }
if pressed&machine.BUTTON_B_MASK > 0 { if buttons.Pins[BUTTON_B].Get() {
println("Button B pressed") println("Button B pressed")
} }
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
+14 -8
View File
@@ -25,8 +25,9 @@ type Device struct {
// ShiftPin is the implementation of the ShiftPin interface. // ShiftPin is the implementation of the ShiftPin interface.
type ShiftPin struct { type ShiftPin struct {
pin machine.Pin pin machine.Pin
d *Device d *Device
pressed bool
} }
// New returns a new thermistor driver given an ADC pin. // New returns a new thermistor driver given an ADC pin.
@@ -55,7 +56,7 @@ func (d *Device) GetShiftPin(input int) ShiftPin {
return ShiftPin{pin: machine.Pin(input), d: d} return ShiftPin{pin: machine.Pin(input), d: d}
} }
// Read8Input reads the 8 inputs and return an uint8 // Read8Input updates the internal pins' states and returns it as an uint8.
func (d *Device) Read8Input() (uint8, error) { func (d *Device) Read8Input() (uint8, error) {
if d.bits != EIGHT_BITS { if d.bits != EIGHT_BITS {
return 0, errors.New("wrong amount of registers") return 0, errors.New("wrong amount of registers")
@@ -63,7 +64,7 @@ func (d *Device) Read8Input() (uint8, error) {
return uint8(d.readInput(EIGHT_BITS)), nil return uint8(d.readInput(EIGHT_BITS)), nil
} }
// Read16Input reads the 16 inputs and return an uint16 // Read16Input updates the internal pins' states and returns it as an uint16.
func (d *Device) Read16Input() (uint16, error) { func (d *Device) Read16Input() (uint16, error) {
if d.bits != SIXTEEN_BITS { if d.bits != SIXTEEN_BITS {
return 0, errors.New("wrong amount of registers") return 0, errors.New("wrong amount of registers")
@@ -71,7 +72,7 @@ func (d *Device) Read16Input() (uint16, error) {
return uint16(d.readInput(SIXTEEN_BITS)), nil return uint16(d.readInput(SIXTEEN_BITS)), nil
} }
// Read32Input reads the 32 inputs and return an uint32 // Read32Input updates the internal pins' states and returns it as an uint32.
func (d *Device) Read32Input() (uint32, error) { func (d *Device) Read32Input() (uint32, error) {
if d.bits != THIRTYTWO_BITS { if d.bits != THIRTYTWO_BITS {
return 0, errors.New("wrong amount of registers") return 0, errors.New("wrong amount of registers")
@@ -79,16 +80,18 @@ func (d *Device) Read32Input() (uint32, error) {
return d.readInput(THIRTYTWO_BITS), nil return d.readInput(THIRTYTWO_BITS), nil
} }
// Get the current reading for a specific ShiftPin. // Get the pin's state for a specific ShiftPin.
// Read{8|16|32}Input should be called before to update the state. Read{8|16|32}Input updates
// all the pins, no need to call it for each pin individually.
func (p ShiftPin) Get() bool { func (p ShiftPin) Get() bool {
return (p.d.readInput(p.d.bits) & (1 << int(p.pin))) > 0 return p.pressed
} }
// Configure here just for interface compatibility. // Configure here just for interface compatibility.
func (p ShiftPin) Configure() { func (p ShiftPin) Configure() {
} }
// readInput reads howMany bits from the shift register // readInput reads howMany bits from the shift register and updates the internal pins' states.
func (d *Device) readInput(howMany NumberBit) uint32 { func (d *Device) readInput(howMany NumberBit) uint32 {
d.latch.High() d.latch.High()
var data uint32 var data uint32
@@ -96,6 +99,9 @@ func (d *Device) readInput(howMany NumberBit) uint32 {
d.clk.Low() d.clk.Low()
if d.out.Get() { if d.out.Get() {
data |= 1 << i data |= 1 << i
d.Pins[i].pressed = true
} else {
d.Pins[i].pressed = false
} }
d.clk.High() d.clk.High()
} }