mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-02 22:17:49 +00:00
Compare commits
4 Commits
dev
...
pin-hal-adapt
| Author | SHA1 | Date | |
|---|---|---|---|
| 0eabf16c36 | |||
| f9db7a6d0f | |||
| d6a420bb08 | |||
| c7229ddba6 |
+7
-3
@@ -5,9 +5,10 @@ package apa102 // import "tinygo.org/x/drivers/apa102"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -37,8 +38,11 @@ func New(b drivers.SPI) *Device {
|
|||||||
|
|
||||||
// NewSoftwareSPI returns a new APA102 driver that will use a software based
|
// NewSoftwareSPI returns a new APA102 driver that will use a software based
|
||||||
// implementation of the SPI protocol.
|
// implementation of the SPI protocol.
|
||||||
func NewSoftwareSPI(sckPin, sdoPin machine.Pin, delay uint32) *Device {
|
func NewSoftwareSPI(sckPin, sdoPin pin.Output, delay uint32) *Device {
|
||||||
return New(&bbSPI{SCK: sckPin, SDO: sdoPin, Delay: delay})
|
return New(&bbSPI{SCK: sckPin.Set, SDO: sdoPin.Set, Delay: delay, configurePins: func() {
|
||||||
|
legacy.ConfigurePinOut(sckPin)
|
||||||
|
legacy.ConfigurePinOut(sdoPin)
|
||||||
|
}})
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteColors writes the given RGBA color slice out using the APA102 protocol.
|
// WriteColors writes the given RGBA color slice out using the APA102 protocol.
|
||||||
|
|||||||
+12
-6
@@ -1,6 +1,9 @@
|
|||||||
package apa102
|
package apa102
|
||||||
|
|
||||||
import "machine"
|
import (
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
|
)
|
||||||
|
|
||||||
// bbSPI is a dumb bit-bang implementation of SPI protocol that is hardcoded
|
// bbSPI is a dumb bit-bang implementation of SPI protocol that is hardcoded
|
||||||
// to mode 0 and ignores trying to receive data. Just enough for the APA102.
|
// to mode 0 and ignores trying to receive data. Just enough for the APA102.
|
||||||
@@ -8,15 +11,18 @@ import "machine"
|
|||||||
// most purposes other than the APA102 package. It might be desirable to make
|
// most purposes other than the APA102 package. It might be desirable to make
|
||||||
// this more generic and include it in the TinyGo "machine" package instead.
|
// this more generic and include it in the TinyGo "machine" package instead.
|
||||||
type bbSPI struct {
|
type bbSPI struct {
|
||||||
SCK machine.Pin
|
SCK pin.OutputFunc
|
||||||
SDO machine.Pin
|
SDO pin.OutputFunc
|
||||||
Delay uint32
|
Delay uint32
|
||||||
|
configurePins func()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure sets up the SCK and SDO pins as outputs and sets them low
|
// Configure sets up the SCK and SDO pins as outputs and sets them low
|
||||||
func (s *bbSPI) Configure() {
|
func (s *bbSPI) Configure() {
|
||||||
s.SCK.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
if s.configurePins == nil {
|
||||||
s.SDO.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
panic(legacy.ErrConfigBeforeInstantiated)
|
||||||
|
}
|
||||||
|
s.configurePins()
|
||||||
s.SCK.Low()
|
s.SCK.Low()
|
||||||
s.SDO.Low()
|
s.SDO.Low()
|
||||||
if s.Delay == 0 {
|
if s.Delay == 0 {
|
||||||
|
|||||||
+31
-24
@@ -1,31 +1,36 @@
|
|||||||
package bmi160
|
package bmi160
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DeviceSPI is the SPI interface to a BMI160 accelerometer/gyroscope. There is
|
// DeviceSPI is the SPI interface to a BMI160 accelerometer/gyroscope. There is
|
||||||
// also an I2C interface, but it is not yet supported.
|
// also an I2C interface, but it is not yet supported.
|
||||||
type DeviceSPI struct {
|
type DeviceSPI struct {
|
||||||
// Chip select pin
|
// Chip select pin
|
||||||
CSB machine.Pin
|
csb pin.OutputFunc
|
||||||
|
|
||||||
buf [7]byte
|
buf [7]byte
|
||||||
|
|
||||||
// SPI bus (requires chip select to be usable).
|
// SPI bus (requires chip select to be usable).
|
||||||
Bus drivers.SPI
|
bus drivers.SPI
|
||||||
|
configurePins func()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSPI returns a new device driver. The pin and SPI interface are not
|
// NewSPI returns a new device driver. The pin and SPI interface are not
|
||||||
// touched, provide a fully configured SPI object and call Configure to start
|
// touched, provide a fully configured SPI object and call Configure to start
|
||||||
// using this device.
|
// using this device.
|
||||||
func NewSPI(csb machine.Pin, spi drivers.SPI) *DeviceSPI {
|
func NewSPI(csb pin.Output, spi drivers.SPI) *DeviceSPI {
|
||||||
return &DeviceSPI{
|
return &DeviceSPI{
|
||||||
CSB: csb, // chip select
|
csb: csb.Set, // chip select
|
||||||
Bus: spi,
|
bus: spi,
|
||||||
|
configurePins: func() {
|
||||||
|
legacy.ConfigurePinOut(csb)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,9 +38,11 @@ func NewSPI(csb machine.Pin, spi drivers.SPI) *DeviceSPI {
|
|||||||
// configures the BMI160, but it does not configure the SPI interface (it is
|
// configures the BMI160, but it does not configure the SPI interface (it is
|
||||||
// assumed to be up and running).
|
// assumed to be up and running).
|
||||||
func (d *DeviceSPI) Configure() error {
|
func (d *DeviceSPI) Configure() error {
|
||||||
d.CSB.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
if d.configurePins == nil {
|
||||||
d.CSB.High()
|
return legacy.ErrConfigBeforeInstantiated
|
||||||
|
}
|
||||||
|
d.configurePins()
|
||||||
|
d.csb.High()
|
||||||
// The datasheet recommends doing a register read from address 0x7F to get
|
// The datasheet recommends doing a register read from address 0x7F to get
|
||||||
// SPI communication going:
|
// SPI communication going:
|
||||||
// > If CSB sees a rising edge after power-up, the BMI160 interface switches
|
// > If CSB sees a rising edge after power-up, the BMI160 interface switches
|
||||||
@@ -86,9 +93,9 @@ func (d *DeviceSPI) ReadTemperature() (temperature int32, err error) {
|
|||||||
data[0] = 0x80 | reg_TEMPERATURE_0
|
data[0] = 0x80 | reg_TEMPERATURE_0
|
||||||
data[1] = 0
|
data[1] = 0
|
||||||
data[2] = 0
|
data[2] = 0
|
||||||
d.CSB.Low()
|
d.csb.Low()
|
||||||
err = d.Bus.Tx(data, data)
|
err = d.bus.Tx(data, data)
|
||||||
d.CSB.High()
|
d.csb.High()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -123,9 +130,9 @@ func (d *DeviceSPI) ReadAcceleration() (x int32, y int32, z int32, err error) {
|
|||||||
for i := 1; i < len(data); i++ {
|
for i := 1; i < len(data); i++ {
|
||||||
data[i] = 0
|
data[i] = 0
|
||||||
}
|
}
|
||||||
d.CSB.Low()
|
d.csb.Low()
|
||||||
err = d.Bus.Tx(data, data)
|
err = d.bus.Tx(data, data)
|
||||||
d.CSB.High()
|
d.csb.High()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -153,9 +160,9 @@ func (d *DeviceSPI) ReadRotation() (x int32, y int32, z int32, err error) {
|
|||||||
for i := 1; i < len(data); i++ {
|
for i := 1; i < len(data); i++ {
|
||||||
data[i] = 0
|
data[i] = 0
|
||||||
}
|
}
|
||||||
d.CSB.Low()
|
d.csb.Low()
|
||||||
err = d.Bus.Tx(data, data)
|
err = d.bus.Tx(data, data)
|
||||||
d.CSB.High()
|
d.csb.High()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -201,9 +208,9 @@ func (d *DeviceSPI) readRegister(address uint8) uint8 {
|
|||||||
data := d.buf[:2]
|
data := d.buf[:2]
|
||||||
data[0] = 0x80 | address
|
data[0] = 0x80 | address
|
||||||
data[1] = 0
|
data[1] = 0
|
||||||
d.CSB.Low()
|
d.csb.Low()
|
||||||
d.Bus.Tx(data, data)
|
d.bus.Tx(data, data)
|
||||||
d.CSB.High()
|
d.csb.High()
|
||||||
return data[1]
|
return data[1]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,7 +224,7 @@ func (d *DeviceSPI) writeRegister(address, data uint8) {
|
|||||||
buf[0] = address
|
buf[0] = address
|
||||||
buf[1] = data
|
buf[1] = data
|
||||||
|
|
||||||
d.CSB.Low()
|
d.csb.Low()
|
||||||
d.Bus.Tx(buf, buf)
|
d.bus.Tx(buf, buf)
|
||||||
d.CSB.High()
|
d.csb.High()
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-7
@@ -2,22 +2,22 @@
|
|||||||
package buzzer // import "tinygo.org/x/drivers/buzzer"
|
package buzzer // import "tinygo.org/x/drivers/buzzer"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"machine"
|
|
||||||
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Device wraps a GPIO connection to a buzzer.
|
// Device wraps a GPIO connection to a buzzer.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
pin machine.Pin
|
pin pin.OutputFunc
|
||||||
High bool
|
High bool
|
||||||
BPM float64
|
BPM float64
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new buzzer driver given which pin to use
|
// New returns a new buzzer driver given which pin to use
|
||||||
func New(pin machine.Pin) Device {
|
func New(pin pin.Output) Device {
|
||||||
return Device{
|
return Device{
|
||||||
pin: pin,
|
pin: pin.Set,
|
||||||
High: false,
|
High: false,
|
||||||
BPM: 96.0,
|
BPM: 96.0,
|
||||||
}
|
}
|
||||||
@@ -25,14 +25,14 @@ func New(pin machine.Pin) Device {
|
|||||||
|
|
||||||
// On sets the buzzer to a high state.
|
// On sets the buzzer to a high state.
|
||||||
func (l *Device) On() (err error) {
|
func (l *Device) On() (err error) {
|
||||||
l.pin.Set(true)
|
l.pin.High()
|
||||||
l.High = true
|
l.High = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Off sets the buzzer to a low state.
|
// Off sets the buzzer to a low state.
|
||||||
func (l *Device) Off() (err error) {
|
func (l *Device) Off() (err error) {
|
||||||
l.pin.Set(false)
|
l.pin.Low()
|
||||||
l.High = false
|
l.High = false
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
package easystepper // import "tinygo.org/x/drivers/easystepper"
|
package easystepper // import "tinygo.org/x/drivers/easystepper"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
// StepMode determines the coil sequence used to perform a single step
|
// StepMode determines the coil sequence used to perform a single step
|
||||||
@@ -30,28 +30,10 @@ func (sm StepMode) stepCount() uint {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeviceConfig contains the configuration data for a single easystepper driver
|
|
||||||
type DeviceConfig struct {
|
|
||||||
// Pin1 ... Pin4 determines the pins to configure and use for the device
|
|
||||||
Pin1, Pin2, Pin3, Pin4 machine.Pin
|
|
||||||
// StepCount is the number of steps required to perform a full revolution of the stepper motor
|
|
||||||
StepCount uint
|
|
||||||
// RPM determines the speed of the stepper motor in 'Revolutions per Minute'
|
|
||||||
RPM uint
|
|
||||||
// Mode determines the coil sequence used to perform a single step
|
|
||||||
Mode StepMode
|
|
||||||
}
|
|
||||||
|
|
||||||
// DualDeviceConfig contains the configuration data for a dual easystepper driver
|
|
||||||
type DualDeviceConfig struct {
|
|
||||||
DeviceConfig
|
|
||||||
// Pin5 ... Pin8 determines the pins to configure and use for the second device
|
|
||||||
Pin5, Pin6, Pin7, Pin8 machine.Pin
|
|
||||||
}
|
|
||||||
|
|
||||||
// Device holds the pins and the delay between steps
|
// Device holds the pins and the delay between steps
|
||||||
type Device struct {
|
type Device struct {
|
||||||
pins [4]machine.Pin
|
pins [4]pin.OutputFunc
|
||||||
|
config func()
|
||||||
stepDelay time.Duration
|
stepDelay time.Duration
|
||||||
stepNumber uint8
|
stepNumber uint8
|
||||||
stepMode StepMode
|
stepMode StepMode
|
||||||
@@ -62,51 +44,6 @@ type DualDevice struct {
|
|||||||
devices [2]*Device
|
devices [2]*Device
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new single easystepper driver given a DeviceConfig
|
|
||||||
func New(config DeviceConfig) (*Device, error) {
|
|
||||||
if config.StepCount == 0 || config.RPM == 0 {
|
|
||||||
return nil, errors.New("config.StepCount and config.RPM must be > 0")
|
|
||||||
}
|
|
||||||
return &Device{
|
|
||||||
pins: [4]machine.Pin{config.Pin1, config.Pin2, config.Pin3, config.Pin4},
|
|
||||||
stepDelay: time.Second * 60 / time.Duration((config.StepCount * config.RPM)),
|
|
||||||
stepMode: config.Mode,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure configures the pins of the Device
|
|
||||||
func (d *Device) Configure() {
|
|
||||||
for _, pin := range d.pins {
|
|
||||||
pin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDual returns a new dual easystepper driver given 8 pins, number of steps and rpm
|
|
||||||
func NewDual(config DualDeviceConfig) (*DualDevice, error) {
|
|
||||||
// Create the first device
|
|
||||||
dev1, err := New(config.DeviceConfig)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// Create the second device
|
|
||||||
config.DeviceConfig.Pin1 = config.Pin5
|
|
||||||
config.DeviceConfig.Pin2 = config.Pin6
|
|
||||||
config.DeviceConfig.Pin3 = config.Pin7
|
|
||||||
config.DeviceConfig.Pin4 = config.Pin8
|
|
||||||
dev2, err := New(config.DeviceConfig)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// Return composite dual device
|
|
||||||
return &DualDevice{devices: [2]*Device{dev1, dev2}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure configures the pins of the DualDevice
|
|
||||||
func (d *DualDevice) Configure() {
|
|
||||||
d.devices[0].Configure()
|
|
||||||
d.devices[1].Configure()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move rotates the motor the number of given steps
|
// Move rotates the motor the number of given steps
|
||||||
// (negative steps will rotate it the opposite direction)
|
// (negative steps will rotate it the opposite direction)
|
||||||
func (d *Device) Move(steps int32) {
|
func (d *Device) Move(steps int32) {
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package easystepper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewCrossPlatform(stepcount, rpm uint, mode StepMode, pins [4]pin.OutputFunc) (*Device, error) {
|
||||||
|
if stepcount == 0 || rpm == 0 {
|
||||||
|
return nil, errors.New("zero rpm and/or stepcount")
|
||||||
|
}
|
||||||
|
for i := range pins {
|
||||||
|
if pins[i] == nil {
|
||||||
|
return nil, errors.New("nil pin")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
d := &Device{
|
||||||
|
pins: pins,
|
||||||
|
stepDelay: time.Second * 60 / time.Duration((stepcount * rpm)),
|
||||||
|
stepMode: mode,
|
||||||
|
config: func() {},
|
||||||
|
}
|
||||||
|
return d, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
//go:build baremetal
|
||||||
|
|
||||||
|
package easystepper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"machine"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// New returns a new single easystepper driver given a DeviceConfig
|
||||||
|
func New(config DeviceConfig) (*Device, error) {
|
||||||
|
if config.StepCount == 0 || config.RPM == 0 {
|
||||||
|
return nil, errors.New("config.StepCount and config.RPM must be > 0")
|
||||||
|
}
|
||||||
|
return &Device{
|
||||||
|
pins: [4]pin.OutputFunc{config.Pin1.Set, config.Pin2.Set, config.Pin3.Set, config.Pin4.Set},
|
||||||
|
stepDelay: time.Second * 60 / time.Duration((config.StepCount * config.RPM)),
|
||||||
|
stepMode: config.Mode,
|
||||||
|
config: func() {
|
||||||
|
legacy.ConfigurePinOut(config.Pin1)
|
||||||
|
legacy.ConfigurePinOut(config.Pin2)
|
||||||
|
legacy.ConfigurePinOut(config.Pin3)
|
||||||
|
legacy.ConfigurePinOut(config.Pin4)
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure configures the pins of the Device
|
||||||
|
func (d *Device) Configure() {
|
||||||
|
if d.config == nil {
|
||||||
|
panic(legacy.ErrConfigBeforeInstantiated)
|
||||||
|
}
|
||||||
|
d.config()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure configures the pins of the DualDevice
|
||||||
|
func (d *DualDevice) Configure() {
|
||||||
|
d.devices[0].Configure()
|
||||||
|
d.devices[1].Configure()
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDual returns a new dual easystepper driver given 8 pins, number of steps and rpm
|
||||||
|
func NewDual(config DualDeviceConfig) (*DualDevice, error) {
|
||||||
|
// Create the first device
|
||||||
|
dev1, err := New(config.DeviceConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// Create the second device
|
||||||
|
config.DeviceConfig.Pin1 = config.Pin5
|
||||||
|
config.DeviceConfig.Pin2 = config.Pin6
|
||||||
|
config.DeviceConfig.Pin3 = config.Pin7
|
||||||
|
config.DeviceConfig.Pin4 = config.Pin8
|
||||||
|
dev2, err := New(config.DeviceConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// Return composite dual device
|
||||||
|
return &DualDevice{devices: [2]*Device{dev1, dev2}}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeviceConfig contains the configuration data for a single easystepper driver
|
||||||
|
type DeviceConfig struct {
|
||||||
|
// Pin1 ... Pin4 determines the pins to configure and use for the device
|
||||||
|
Pin1, Pin2, Pin3, Pin4 machine.Pin
|
||||||
|
// StepCount is the number of steps required to perform a full revolution of the stepper motor
|
||||||
|
StepCount uint
|
||||||
|
// RPM determines the speed of the stepper motor in 'Revolutions per Minute'
|
||||||
|
RPM uint
|
||||||
|
// Mode determines the coil sequence used to perform a single step
|
||||||
|
Mode StepMode
|
||||||
|
}
|
||||||
|
|
||||||
|
// DualDeviceConfig contains the configuration data for a dual easystepper driver
|
||||||
|
type DualDeviceConfig struct {
|
||||||
|
DeviceConfig
|
||||||
|
// Pin5 ... Pin8 determines the pins to configure and use for the second device
|
||||||
|
Pin5, Pin6, Pin7, Pin8 machine.Pin
|
||||||
|
}
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Guarded because still unsure of how to deal with interrupt drivers.
|
||||||
|
//go:build tinygo
|
||||||
|
|
||||||
// Package ft6336 provides a driver for the FT6336 I2C Self-Capacitive touch
|
// Package ft6336 provides a driver for the FT6336 I2C Self-Capacitive touch
|
||||||
// panel controller.
|
// panel controller.
|
||||||
//
|
//
|
||||||
|
|||||||
+16
-15
@@ -5,12 +5,13 @@ package gc9a01 // import "tinygo.org/x/drivers/gc9a01"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Rotation controls the rotation used by the display.
|
// Rotation controls the rotation used by the display.
|
||||||
@@ -22,10 +23,10 @@ type FrameRate uint8
|
|||||||
// Device wraps an SPI connection.
|
// Device wraps an SPI connection.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
dcPin machine.Pin
|
dcPin pin.OutputFunc
|
||||||
resetPin machine.Pin
|
resetPin pin.OutputFunc
|
||||||
csPin machine.Pin
|
csPin pin.OutputFunc
|
||||||
blPin machine.Pin
|
blPin pin.OutputFunc
|
||||||
width int16
|
width int16
|
||||||
height int16
|
height int16
|
||||||
columnOffsetCfg int16
|
columnOffsetCfg int16
|
||||||
@@ -52,17 +53,17 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new ST7789 connection. The SPI wire must already be configured.
|
// New creates a new ST7789 connection. The SPI wire must already be configured.
|
||||||
func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin machine.Pin) Device {
|
func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin pin.Output) Device {
|
||||||
resetPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(resetPin)
|
||||||
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(dcPin)
|
||||||
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(csPin)
|
||||||
blPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(blPin)
|
||||||
return Device{
|
return Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
resetPin: resetPin,
|
resetPin: resetPin.Set,
|
||||||
dcPin: dcPin,
|
dcPin: dcPin.Set,
|
||||||
csPin: csPin,
|
csPin: csPin.Set,
|
||||||
blPin: blPin,
|
blPin: blPin.Set,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,7 +227,7 @@ func (d *Device) Data(data uint8) {
|
|||||||
|
|
||||||
// Tx sends data to the display
|
// Tx sends data to the display
|
||||||
func (d *Device) Tx(data []byte, isCommand bool) {
|
func (d *Device) Tx(data []byte, isCommand bool) {
|
||||||
d.dcPin.Set(!isCommand)
|
d.dcPin(!isCommand)
|
||||||
d.bus.Tx(data, nil)
|
d.bus.Tx(data, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+19
-10
@@ -5,30 +5,39 @@
|
|||||||
package hcsr04
|
package hcsr04
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
const TIMEOUT = 23324 // max sensing distance (4m)
|
const TIMEOUT = 23324 // max sensing distance (4m)
|
||||||
|
|
||||||
// Device holds the pins
|
// Device holds the pins
|
||||||
type Device struct {
|
type Device struct {
|
||||||
trigger machine.Pin
|
trigger pin.OutputFunc
|
||||||
echo machine.Pin
|
echo pin.InputFunc
|
||||||
|
configurePins func()
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new ultrasonic driver given 2 pins
|
// New returns a new ultrasonic driver given 2 pins
|
||||||
func New(trigger, echo machine.Pin) Device {
|
func New(trigger pin.Output, echo pin.Input) Device {
|
||||||
return Device{
|
return Device{
|
||||||
trigger: trigger,
|
trigger: trigger.Set,
|
||||||
echo: echo,
|
echo: echo.Get,
|
||||||
|
configurePins: func() {
|
||||||
|
legacy.ConfigurePinOut(trigger)
|
||||||
|
legacy.ConfigurePinInput(echo)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure configures the pins of the Device
|
// Configure configures the pins of the Device
|
||||||
func (d *Device) Configure() {
|
func (d *Device) Configure() {
|
||||||
d.trigger.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
if d.configurePins == nil {
|
||||||
d.echo.Configure(machine.PinConfig{Mode: machine.PinInput})
|
panic(legacy.ErrConfigBeforeInstantiated)
|
||||||
|
}
|
||||||
|
d.configurePins()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadDistance returns the distance of the object in mm
|
// ReadDistance returns the distance of the object in mm
|
||||||
@@ -52,7 +61,7 @@ func (d *Device) ReadPulse() int32 {
|
|||||||
d.trigger.Low()
|
d.trigger.Low()
|
||||||
i := uint8(0)
|
i := uint8(0)
|
||||||
for {
|
for {
|
||||||
if d.echo.Get() {
|
if d.echo() {
|
||||||
t = time.Now()
|
t = time.Now()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -66,7 +75,7 @@ func (d *Device) ReadPulse() int32 {
|
|||||||
}
|
}
|
||||||
i = 0
|
i = 0
|
||||||
for {
|
for {
|
||||||
if !d.echo.Get() {
|
if !d.echo() {
|
||||||
return int32(time.Since(t).Microseconds())
|
return int32(time.Since(t).Microseconds())
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
|
|||||||
+5
-5
@@ -210,7 +210,7 @@ func (d *Device) SendCommand(command byte) {
|
|||||||
d.bus.SetCommandMode(true)
|
d.bus.SetCommandMode(true)
|
||||||
d.bus.Write([]byte{command})
|
d.bus.Write([]byte{command})
|
||||||
|
|
||||||
for d.busy(command == DISPLAY_CLEAR || command == CURSOR_HOME) {
|
for d.isBusy(command == DISPLAY_CLEAR || command == CURSOR_HOME) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,7 +219,7 @@ func (d *Device) sendData(data byte) {
|
|||||||
d.bus.SetCommandMode(false)
|
d.bus.SetCommandMode(false)
|
||||||
d.bus.Write([]byte{data})
|
d.bus.Write([]byte{data})
|
||||||
|
|
||||||
for d.busy(false) {
|
for d.isBusy(false) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,9 +231,9 @@ func (d *Device) CreateCharacter(cgramAddr uint8, data []byte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// busy returns true when hd447890 is busy
|
// isBusy returns true when hd447890 is isBusy
|
||||||
// or after the timeout specified
|
// or after the timeout specified
|
||||||
func (d *Device) busy(longDelay bool) bool {
|
func (d *Device) isBusy(longDelay bool) bool {
|
||||||
if d.bus.WriteOnly() {
|
if d.bus.WriteOnly() {
|
||||||
// Can't read busy flag if write only, so sleep a bit then return
|
// Can't read busy flag if write only, so sleep a bit then return
|
||||||
if longDelay {
|
if longDelay {
|
||||||
@@ -261,7 +261,7 @@ func (d *Device) busy(longDelay bool) bool {
|
|||||||
|
|
||||||
// Busy returns true when hd447890 is busy
|
// Busy returns true when hd447890 is busy
|
||||||
func (d *Device) Busy() bool {
|
func (d *Device) Busy() bool {
|
||||||
return d.busy(false)
|
return d.isBusy(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Size returns the current size of the display.
|
// Size returns the current size of the display.
|
||||||
|
|||||||
+4
-4
@@ -3,9 +3,9 @@ package max6675
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"machine"
|
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrThermocoupleOpen is returned when the thermocouple input is open.
|
// ErrThermocoupleOpen is returned when the thermocouple input is open.
|
||||||
@@ -14,16 +14,16 @@ var ErrThermocoupleOpen = errors.New("thermocouple input open")
|
|||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
cs machine.Pin
|
cs pin.OutputFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new Device to read from a MAX6675 thermocouple.
|
// Create a new Device to read from a MAX6675 thermocouple.
|
||||||
// Pins must be configured before use. Frequency for SPI
|
// Pins must be configured before use. Frequency for SPI
|
||||||
// should be 4.3MHz maximum.
|
// should be 4.3MHz maximum.
|
||||||
func NewDevice(bus drivers.SPI, cs machine.Pin) *Device {
|
func NewDevice(bus drivers.SPI, cs pin.Output) *Device {
|
||||||
return &Device{
|
return &Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
cs: cs,
|
cs: cs.Set,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-9
@@ -3,31 +3,36 @@
|
|||||||
package max72xx
|
package max72xx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"machine"
|
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
cs machine.Pin
|
cs pin.OutputFunc
|
||||||
|
configurePins func()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDriver creates a new max7219 connection. The SPI wire must already be configured
|
// NewDriver creates a new max7219 connection. The SPI wire must already be configured
|
||||||
// The SPI frequency must not be higher than 10MHz.
|
// The SPI frequency must not be higher than 10MHz.
|
||||||
// parameter cs: the datasheet also refers to this pin as "load" pin.
|
// parameter cs: the datasheet also refers to this pin as "load" pin.
|
||||||
func NewDevice(bus drivers.SPI, cs machine.Pin) *Device {
|
func NewDevice(bus drivers.SPI, cs pin.Output) *Device {
|
||||||
return &Device{
|
return &Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
cs: cs,
|
cs: cs.Set,
|
||||||
|
configurePins: func() {
|
||||||
|
legacy.ConfigurePinOut(cs)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure setups the pins.
|
// Configure setups the pins.
|
||||||
func (driver *Device) Configure() {
|
func (driver *Device) Configure() {
|
||||||
outPutConfig := machine.PinConfig{Mode: machine.PinOutput}
|
if driver.configurePins == nil {
|
||||||
|
panic(legacy.ErrConfigBeforeInstantiated)
|
||||||
driver.cs.Configure(outPutConfig)
|
}
|
||||||
|
driver.configurePins()
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetScanLimit sets the scan limit. Maximum is 8.
|
// SetScanLimit sets the scan limit. Maximum is 8.
|
||||||
|
|||||||
+16
-8
@@ -8,18 +8,20 @@ package mcp2515 // import "tinygo.org/x/drivers/mcp2515"
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Device wraps MCP2515 SPI CAN Module.
|
// Device wraps MCP2515 SPI CAN Module.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
spi SPI
|
spi SPI
|
||||||
cs machine.Pin
|
cs pin.OutputFunc
|
||||||
msg *CANMsg
|
msg *CANMsg
|
||||||
mcpMode byte
|
mcpMode byte
|
||||||
|
configurePins func()
|
||||||
}
|
}
|
||||||
|
|
||||||
// CANMsg stores CAN message fields.
|
// CANMsg stores CAN message fields.
|
||||||
@@ -36,15 +38,18 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// New returns a new MCP2515 driver. Pass in a fully configured SPI bus.
|
// New returns a new MCP2515 driver. Pass in a fully configured SPI bus.
|
||||||
func New(b drivers.SPI, csPin machine.Pin) *Device {
|
func New(b drivers.SPI, csPin pin.Output) *Device {
|
||||||
d := &Device{
|
d := &Device{
|
||||||
spi: SPI{
|
spi: SPI{
|
||||||
bus: b,
|
bus: b,
|
||||||
tx: make([]byte, 0, bufferSize),
|
tx: make([]byte, 0, bufferSize),
|
||||||
rx: make([]byte, 0, bufferSize),
|
rx: make([]byte, 0, bufferSize),
|
||||||
},
|
},
|
||||||
cs: csPin,
|
cs: csPin.Set,
|
||||||
msg: &CANMsg{},
|
msg: &CANMsg{},
|
||||||
|
configurePins: func() {
|
||||||
|
legacy.ConfigurePinOut(csPin)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return d
|
return d
|
||||||
@@ -52,7 +57,10 @@ func New(b drivers.SPI, csPin machine.Pin) *Device {
|
|||||||
|
|
||||||
// Configure sets up the device for communication.
|
// Configure sets up the device for communication.
|
||||||
func (d *Device) Configure() {
|
func (d *Device) Configure() {
|
||||||
d.cs.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
if d.configurePins == nil {
|
||||||
|
panic(legacy.ErrConfigBeforeInstantiated)
|
||||||
|
}
|
||||||
|
d.configurePins()
|
||||||
}
|
}
|
||||||
|
|
||||||
const beginTimeoutValue int = 10
|
const beginTimeoutValue int = 10
|
||||||
|
|||||||
+24
-16
@@ -5,8 +5,9 @@ package onewire // import "tinygo.org/x/drivers/onewire"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
// OneWire ROM commands
|
// OneWire ROM commands
|
||||||
@@ -19,7 +20,8 @@ const (
|
|||||||
|
|
||||||
// Device wraps a connection to an 1-Wire devices.
|
// Device wraps a connection to an 1-Wire devices.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
p machine.Pin
|
set pin.OutputFunc
|
||||||
|
get pin.InputFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config wraps a configuration to an 1-Wire devices.
|
// Config wraps a configuration to an 1-Wire devices.
|
||||||
@@ -32,24 +34,30 @@ var (
|
|||||||
errReadAddress = errors.New("Error: OneWire. Read address error: CRC mismatch.")
|
errReadAddress = errors.New("Error: OneWire. Read address error: CRC mismatch.")
|
||||||
)
|
)
|
||||||
|
|
||||||
// New creates a new GPIO 1-Wire connection.
|
// NewFromFuncs expects pin setter and getter for DQ line. Ideally this driver should receive
|
||||||
// The pin must be pulled up to the VCC via a resistor greater than 500 ohms (default 4.7k).
|
// a one-wire bus HAL abstraction, but I was asked to show how this could be done using pin HAL so here goes.
|
||||||
func New(p machine.Pin) Device {
|
func NewFromFuncs(getPinLevel pin.InputFunc, setPinLevel pin.OutputFunc) *Device {
|
||||||
return Device{
|
return &Device{
|
||||||
p: p,
|
set: setPinLevel,
|
||||||
|
get: getPinLevel,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure initializes the protocol.
|
// Configure initializes the protocol.
|
||||||
func (d *Device) Configure(config Config) {}
|
func (d *Device) Configure(config Config) {}
|
||||||
|
|
||||||
|
// By setting the pin value one should configure as output and also expect a more
|
||||||
|
// consistent behaviour across all tinygo hosts by pulling DQ line low consistently. Win-win.
|
||||||
|
func (d *Device) cfgOut() { d.set.Low() }
|
||||||
|
func (d *Device) cfgIn() { d.get() }
|
||||||
|
|
||||||
// Reset pull DQ line low, then up.
|
// Reset pull DQ line low, then up.
|
||||||
func (d Device) Reset() error {
|
func (d Device) Reset() error {
|
||||||
d.p.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
d.cfgOut()
|
||||||
time.Sleep(480 * time.Microsecond)
|
time.Sleep(480 * time.Microsecond)
|
||||||
d.p.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
|
d.cfgIn()
|
||||||
time.Sleep(70 * time.Microsecond)
|
time.Sleep(70 * time.Microsecond)
|
||||||
precence := d.p.Get()
|
precence := d.get()
|
||||||
time.Sleep(410 * time.Microsecond)
|
time.Sleep(410 * time.Microsecond)
|
||||||
if precence {
|
if precence {
|
||||||
return errNoPresence
|
return errNoPresence
|
||||||
@@ -59,14 +67,14 @@ func (d Device) Reset() error {
|
|||||||
|
|
||||||
// WriteBit transmits a bit to 1-Wire bus.
|
// WriteBit transmits a bit to 1-Wire bus.
|
||||||
func (d Device) WriteBit(data uint8) {
|
func (d Device) WriteBit(data uint8) {
|
||||||
d.p.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
d.cfgOut()
|
||||||
if data&1 == 1 { // Send '1'
|
if data&1 == 1 { // Send '1'
|
||||||
time.Sleep(5 * time.Microsecond)
|
time.Sleep(5 * time.Microsecond)
|
||||||
d.p.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
|
d.cfgIn()
|
||||||
time.Sleep(60 * time.Microsecond)
|
time.Sleep(60 * time.Microsecond)
|
||||||
} else { // Send '0'
|
} else { // Send '0'
|
||||||
time.Sleep(60 * time.Microsecond)
|
time.Sleep(60 * time.Microsecond)
|
||||||
d.p.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
|
d.cfgIn()
|
||||||
time.Sleep(5 * time.Microsecond)
|
time.Sleep(5 * time.Microsecond)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,11 +89,11 @@ func (d Device) Write(data uint8) {
|
|||||||
|
|
||||||
// ReadBit receives a bit from 1-Wire bus.
|
// ReadBit receives a bit from 1-Wire bus.
|
||||||
func (d Device) ReadBit() (data uint8) {
|
func (d Device) ReadBit() (data uint8) {
|
||||||
d.p.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
d.cfgOut()
|
||||||
time.Sleep(3 * time.Microsecond)
|
time.Sleep(3 * time.Microsecond)
|
||||||
d.p.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
|
d.cfgIn()
|
||||||
time.Sleep(8 * time.Microsecond)
|
time.Sleep(8 * time.Microsecond)
|
||||||
if d.p.Get() {
|
if d.get() {
|
||||||
data = 1
|
data = 1
|
||||||
}
|
}
|
||||||
time.Sleep(60 * time.Microsecond)
|
time.Sleep(60 * time.Microsecond)
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
//go:build tinygo
|
||||||
|
|
||||||
|
package onewire
|
||||||
|
|
||||||
|
import (
|
||||||
|
"machine"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
)
|
||||||
|
|
||||||
|
// New creates a new GPIO 1-Wire connection.
|
||||||
|
// The pin must be pulled up to the VCC via a resistor greater than 500 ohms (default 4.7k).
|
||||||
|
func New(p machine.Pin) Device {
|
||||||
|
isOut := false
|
||||||
|
return Device{
|
||||||
|
set: func(level bool) {
|
||||||
|
if !isOut {
|
||||||
|
legacy.ConfigurePinOut(p)
|
||||||
|
isOut = true
|
||||||
|
}
|
||||||
|
p.Set(level)
|
||||||
|
},
|
||||||
|
get: func() (level bool) {
|
||||||
|
if isOut {
|
||||||
|
legacy.ConfigurePinInputPullup(p)
|
||||||
|
isOut = false
|
||||||
|
}
|
||||||
|
return p.Get()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
-8
@@ -6,18 +6,18 @@ package pcd8544 // import "tinygo.org/x/drivers/pcd8544"
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Device wraps an SPI connection.
|
// Device wraps an SPI connection.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
dcPin machine.Pin
|
dcPin pin.OutputFunc
|
||||||
rstPin machine.Pin
|
rstPin pin.OutputFunc
|
||||||
scePin machine.Pin
|
scePin pin.OutputFunc
|
||||||
buffer []byte
|
buffer []byte
|
||||||
width int16
|
width int16
|
||||||
height int16
|
height int16
|
||||||
@@ -30,12 +30,12 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new PCD8544 connection. The SPI bus must already be configured.
|
// New creates a new PCD8544 connection. The SPI bus must already be configured.
|
||||||
func New(bus drivers.SPI, dcPin, rstPin, scePin machine.Pin) *Device {
|
func New(bus drivers.SPI, dcPin, rstPin, scePin pin.Output) *Device {
|
||||||
return &Device{
|
return &Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
dcPin: dcPin,
|
dcPin: dcPin.Set,
|
||||||
rstPin: rstPin,
|
rstPin: rstPin.Set,
|
||||||
scePin: scePin,
|
scePin: scePin.Set,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
package shiftregister
|
package shiftregister
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"machine"
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
type NumberBit int8
|
type NumberBit int8
|
||||||
@@ -16,9 +17,10 @@ const (
|
|||||||
|
|
||||||
// Device holds pin number
|
// Device holds pin number
|
||||||
type Device struct {
|
type Device struct {
|
||||||
latch, clock, out machine.Pin // IC wiring
|
latch, clock, out pin.OutputFunc // IC wiring
|
||||||
bits NumberBit // Pin number
|
config func()
|
||||||
mask uint32 // keep all pins state
|
bits NumberBit // Pin number
|
||||||
|
mask uint32 // keep all pins state
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShiftPin is the implementation of the ShiftPin interface.
|
// ShiftPin is the implementation of the ShiftPin interface.
|
||||||
@@ -29,20 +31,25 @@ type ShiftPin struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new shift output register device
|
// New returns a new shift output register device
|
||||||
func New(Bits NumberBit, Latch, Clock, Out machine.Pin) *Device {
|
func New(Bits NumberBit, Latch, Clock, Out pin.Output) *Device {
|
||||||
return &Device{
|
return &Device{
|
||||||
latch: Latch,
|
latch: Latch.Set,
|
||||||
clock: Clock,
|
clock: Clock.Set,
|
||||||
out: Out,
|
out: Out.Set,
|
||||||
bits: Bits,
|
bits: Bits,
|
||||||
|
config: func() {
|
||||||
|
legacy.ConfigurePinOut(Latch)
|
||||||
|
legacy.ConfigurePinOut(Clock)
|
||||||
|
legacy.ConfigurePinOut(Out)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure set hardware configuration
|
// Configure set hardware configuration
|
||||||
func (d *Device) Configure() {
|
func (d *Device) Configure() {
|
||||||
d.latch.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
if d.config == nil {
|
||||||
d.clock.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
panic(legacy.ErrConfigBeforeInstantiated)
|
||||||
d.out.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
}
|
||||||
d.latch.High()
|
d.latch.High()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +60,7 @@ func (d *Device) WriteMask(mask uint32) {
|
|||||||
d.latch.Low()
|
d.latch.Low()
|
||||||
for i := 0; i < int(d.bits); i++ {
|
for i := 0; i < int(d.bits); i++ {
|
||||||
d.clock.Low()
|
d.clock.Low()
|
||||||
d.out.Set(mask&1 != 0)
|
d.out(mask&1 != 0)
|
||||||
mask = mask >> 1
|
mask = mask >> 1
|
||||||
d.clock.High()
|
d.clock.High()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build tinygo
|
||||||
|
|
||||||
package ssd1289
|
package ssd1289
|
||||||
|
|
||||||
import "machine"
|
import "machine"
|
||||||
|
|||||||
+18
-16
@@ -7,6 +7,9 @@ import (
|
|||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
"machine"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Bus interface {
|
type Bus interface {
|
||||||
@@ -14,10 +17,10 @@ type Bus interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
rs machine.Pin
|
rs pin.OutputFunc
|
||||||
wr machine.Pin
|
wr pin.OutputFunc
|
||||||
cs machine.Pin
|
cs pin.OutputFunc
|
||||||
rst machine.Pin
|
rst pin.OutputFunc
|
||||||
bus Bus
|
bus Bus
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,21 +29,20 @@ const height = int16(320)
|
|||||||
|
|
||||||
func New(rs machine.Pin, wr machine.Pin, cs machine.Pin, rst machine.Pin, bus Bus) Device {
|
func New(rs machine.Pin, wr machine.Pin, cs machine.Pin, rst machine.Pin, bus Bus) Device {
|
||||||
d := Device{
|
d := Device{
|
||||||
rs: rs,
|
rs: rs.Set,
|
||||||
wr: wr,
|
wr: wr.Set,
|
||||||
cs: cs,
|
cs: cs.Set,
|
||||||
rst: rst,
|
rst: rst.Set,
|
||||||
bus: bus,
|
bus: bus,
|
||||||
}
|
}
|
||||||
|
legacy.ConfigurePinOut(rs)
|
||||||
|
legacy.ConfigurePinOut(wr)
|
||||||
|
legacy.ConfigurePinOut(cs)
|
||||||
|
legacy.ConfigurePinOut(rst)
|
||||||
|
|
||||||
rs.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
cs.Set(true)
|
||||||
wr.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
rst.Set(true)
|
||||||
cs.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
wr.Set(true)
|
||||||
rst.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
|
||||||
|
|
||||||
cs.High()
|
|
||||||
rst.High()
|
|
||||||
wr.High()
|
|
||||||
|
|
||||||
return d
|
return d
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-12
@@ -5,12 +5,13 @@ package ssd1331 // import "tinygo.org/x/drivers/ssd1331"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
|
|
||||||
"errors"
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Model uint8
|
type Model uint8
|
||||||
@@ -19,9 +20,9 @@ type Rotation uint8
|
|||||||
// Device wraps an SPI connection.
|
// Device wraps an SPI connection.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
dcPin machine.Pin
|
dcPin pin.OutputFunc
|
||||||
resetPin machine.Pin
|
resetPin pin.OutputFunc
|
||||||
csPin machine.Pin
|
csPin pin.OutputFunc
|
||||||
width int16
|
width int16
|
||||||
height int16
|
height int16
|
||||||
batchLength int16
|
batchLength int16
|
||||||
@@ -36,15 +37,15 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new SSD1331 connection. The SPI wire must already be configured.
|
// New creates a new SSD1331 connection. The SPI wire must already be configured.
|
||||||
func New(bus drivers.SPI, resetPin, dcPin, csPin machine.Pin) Device {
|
func New(bus drivers.SPI, resetPin, dcPin, csPin pin.Output) Device {
|
||||||
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(dcPin)
|
||||||
resetPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(resetPin)
|
||||||
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(csPin)
|
||||||
return Device{
|
return Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
dcPin: dcPin,
|
dcPin: dcPin.Set,
|
||||||
resetPin: resetPin,
|
resetPin: resetPin.Set,
|
||||||
csPin: csPin,
|
csPin: csPin.Set,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,7 +252,7 @@ func (d *Device) Data(data uint8) {
|
|||||||
|
|
||||||
// Tx sends data to the display
|
// Tx sends data to the display
|
||||||
func (d *Device) Tx(data []byte, isCommand bool) {
|
func (d *Device) Tx(data []byte, isCommand bool) {
|
||||||
d.dcPin.Set(!isCommand)
|
d.dcPin(!isCommand)
|
||||||
d.bus.Tx(data, nil)
|
d.bus.Tx(data, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+32
-24
@@ -6,10 +6,11 @@ package ssd1351 // import "tinygo.org/x/drivers/ssd1351"
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -19,17 +20,18 @@ var (
|
|||||||
|
|
||||||
// Device wraps an SPI connection.
|
// Device wraps an SPI connection.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
dcPin machine.Pin
|
dcPin pin.OutputFunc
|
||||||
resetPin machine.Pin
|
resetPin pin.OutputFunc
|
||||||
csPin machine.Pin
|
csPin pin.OutputFunc
|
||||||
enPin machine.Pin
|
enPin pin.OutputFunc
|
||||||
rwPin machine.Pin
|
rwPin pin.OutputFunc
|
||||||
width int16
|
configurePins func()
|
||||||
height int16
|
width int16
|
||||||
rowOffset int16
|
height int16
|
||||||
columnOffset int16
|
rowOffset int16
|
||||||
bufferLength int16
|
columnOffset int16
|
||||||
|
bufferLength int16
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config is the configuration for the display
|
// Config is the configuration for the display
|
||||||
@@ -41,19 +43,29 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new SSD1351 connection. The SPI wire must already be configured.
|
// New creates a new SSD1351 connection. The SPI wire must already be configured.
|
||||||
func New(bus drivers.SPI, resetPin, dcPin, csPin, enPin, rwPin machine.Pin) Device {
|
func New(bus drivers.SPI, resetPin, dcPin, csPin, enPin, rwPin pin.Output) Device {
|
||||||
return Device{
|
return Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
dcPin: dcPin,
|
dcPin: dcPin.Set,
|
||||||
resetPin: resetPin,
|
resetPin: resetPin.Set,
|
||||||
csPin: csPin,
|
csPin: csPin.Set,
|
||||||
enPin: enPin,
|
enPin: enPin.Set,
|
||||||
rwPin: rwPin,
|
rwPin: rwPin.Set,
|
||||||
|
configurePins: func() {
|
||||||
|
legacy.ConfigurePinOut(dcPin)
|
||||||
|
legacy.ConfigurePinOut(resetPin)
|
||||||
|
legacy.ConfigurePinOut(csPin)
|
||||||
|
legacy.ConfigurePinOut(enPin)
|
||||||
|
legacy.ConfigurePinOut(rwPin)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure initializes the display with default configuration
|
// Configure initializes the display with default configuration
|
||||||
func (d *Device) Configure(cfg Config) {
|
func (d *Device) Configure(cfg Config) {
|
||||||
|
if d.configurePins == nil {
|
||||||
|
panic(legacy.ErrConfigBeforeInstantiated)
|
||||||
|
}
|
||||||
if cfg.Width == 0 {
|
if cfg.Width == 0 {
|
||||||
cfg.Width = 128
|
cfg.Width = 128
|
||||||
}
|
}
|
||||||
@@ -73,11 +85,7 @@ func (d *Device) Configure(cfg Config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// configure GPIO pins
|
// configure GPIO pins
|
||||||
d.dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
d.configurePins()
|
||||||
d.resetPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
|
||||||
d.csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
|
||||||
d.enPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
|
||||||
d.rwPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
|
||||||
|
|
||||||
// reset the device
|
// reset the device
|
||||||
d.resetPin.High()
|
d.resetPin.High()
|
||||||
@@ -278,7 +286,7 @@ func (d *Device) Data(data uint8) {
|
|||||||
|
|
||||||
// Tx sends data to the display
|
// Tx sends data to the display
|
||||||
func (d *Device) Tx(data []byte, isCommand bool) {
|
func (d *Device) Tx(data []byte, isCommand bool) {
|
||||||
d.dcPin.Set(!isCommand)
|
d.dcPin(!isCommand)
|
||||||
d.csPin.Low()
|
d.csPin.Low()
|
||||||
d.bus.Tx(data, nil)
|
d.bus.Tx(data, nil)
|
||||||
d.csPin.High()
|
d.csPin.High()
|
||||||
|
|||||||
+17
-16
@@ -5,12 +5,13 @@ package st7735 // import "tinygo.org/x/drivers/st7735"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
"tinygo.org/x/drivers/pixel"
|
"tinygo.org/x/drivers/pixel"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -39,10 +40,10 @@ type Device = DeviceOf[pixel.RGB565BE]
|
|||||||
// formats.
|
// formats.
|
||||||
type DeviceOf[T Color] struct {
|
type DeviceOf[T Color] struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
dcPin machine.Pin
|
dcPin pin.OutputFunc
|
||||||
resetPin machine.Pin
|
resetPin pin.OutputFunc
|
||||||
csPin machine.Pin
|
csPin pin.OutputFunc
|
||||||
blPin machine.Pin
|
blPin pin.OutputFunc
|
||||||
width int16
|
width int16
|
||||||
height int16
|
height int16
|
||||||
columnOffset int16
|
columnOffset int16
|
||||||
@@ -65,23 +66,23 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new ST7735 connection. The SPI wire must already be configured.
|
// New creates a new ST7735 connection. The SPI wire must already be configured.
|
||||||
func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin machine.Pin) Device {
|
func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin pin.Output) Device {
|
||||||
return NewOf[pixel.RGB565BE](bus, resetPin, dcPin, csPin, blPin)
|
return NewOf[pixel.RGB565BE](bus, resetPin, dcPin, csPin, blPin)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewOf creates a new ST7735 connection with a particular pixel format. The SPI
|
// NewOf creates a new ST7735 connection with a particular pixel format. The SPI
|
||||||
// wire must already be configured.
|
// wire must already be configured.
|
||||||
func NewOf[T Color](bus drivers.SPI, resetPin, dcPin, csPin, blPin machine.Pin) DeviceOf[T] {
|
func NewOf[T Color](bus drivers.SPI, resetPin, dcPin, csPin, blPin pin.Output) DeviceOf[T] {
|
||||||
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(dcPin)
|
||||||
resetPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(resetPin)
|
||||||
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(csPin)
|
||||||
blPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(blPin)
|
||||||
return DeviceOf[T]{
|
return DeviceOf[T]{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
dcPin: dcPin,
|
dcPin: dcPin.Set,
|
||||||
resetPin: resetPin,
|
resetPin: resetPin.Set,
|
||||||
csPin: csPin,
|
csPin: csPin.Set,
|
||||||
blPin: blPin,
|
blPin: blPin.Set,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -423,7 +424,7 @@ func (d *DeviceOf[T]) Data(data uint8) {
|
|||||||
|
|
||||||
// Tx sends data to the display
|
// Tx sends data to the display
|
||||||
func (d *DeviceOf[T]) Tx(data []byte, isCommand bool) {
|
func (d *DeviceOf[T]) Tx(data []byte, isCommand bool) {
|
||||||
d.dcPin.Set(!isCommand)
|
d.dcPin(!isCommand)
|
||||||
d.bus.Tx(data, nil)
|
d.bus.Tx(data, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+22
-17
@@ -7,13 +7,14 @@ package st7789 // import "tinygo.org/x/drivers/st7789"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
"math"
|
"math"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
"tinygo.org/x/drivers/pixel"
|
"tinygo.org/x/drivers/pixel"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -46,10 +47,10 @@ type Device = DeviceOf[pixel.RGB565BE]
|
|||||||
// formats.
|
// formats.
|
||||||
type DeviceOf[T Color] struct {
|
type DeviceOf[T Color] struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
dcPin machine.Pin
|
dcPin pin.OutputFunc
|
||||||
resetPin machine.Pin
|
resetPin pin.OutputFunc
|
||||||
csPin machine.Pin
|
csPin pin.OutputFunc
|
||||||
blPin machine.Pin
|
blPin pin.OutputFunc
|
||||||
width int16
|
width int16
|
||||||
height int16
|
height int16
|
||||||
columnOffsetCfg int16
|
columnOffsetCfg int16
|
||||||
@@ -83,23 +84,27 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new ST7789 connection. The SPI wire must already be configured.
|
// New creates a new ST7789 connection. The SPI wire must already be configured.
|
||||||
func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin machine.Pin) Device {
|
func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin pin.Output) Device {
|
||||||
return NewOf[pixel.RGB565BE](bus, resetPin, dcPin, csPin, blPin)
|
return NewOf[pixel.RGB565BE](bus, resetPin, dcPin, csPin, blPin)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewOf creates a new ST7789 connection with a particular pixel format. The SPI
|
// NewOf creates a new ST7789 connection with a particular pixel format. The SPI
|
||||||
// wire must already be configured.
|
// wire must already be configured.
|
||||||
func NewOf[T Color](bus drivers.SPI, resetPin, dcPin, csPin, blPin machine.Pin) DeviceOf[T] {
|
func NewOf[T Color](bus drivers.SPI, resetPin, dcPin, csPin, blPin pin.Output) DeviceOf[T] {
|
||||||
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(dcPin)
|
||||||
resetPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(resetPin)
|
||||||
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(csPin)
|
||||||
blPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(blPin)
|
||||||
|
var cs pin.OutputFunc
|
||||||
|
if !legacy.PinIsNoPin(csPin) {
|
||||||
|
cs = csPin.Set
|
||||||
|
}
|
||||||
return DeviceOf[T]{
|
return DeviceOf[T]{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
dcPin: dcPin,
|
dcPin: dcPin.Set,
|
||||||
resetPin: resetPin,
|
resetPin: resetPin.Set,
|
||||||
csPin: csPin,
|
csPin: cs,
|
||||||
blPin: blPin,
|
blPin: blPin.Set,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,7 +234,7 @@ func (d *DeviceOf[T]) sendCommand(command uint8, data []byte) error {
|
|||||||
// startWrite must be called at the beginning of all exported methods to set the
|
// startWrite must be called at the beginning of all exported methods to set the
|
||||||
// chip select pin low.
|
// chip select pin low.
|
||||||
func (d *DeviceOf[T]) startWrite() {
|
func (d *DeviceOf[T]) startWrite() {
|
||||||
if d.csPin != machine.NoPin {
|
if d.csPin != nil {
|
||||||
d.csPin.Low()
|
d.csPin.Low()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -237,7 +242,7 @@ func (d *DeviceOf[T]) startWrite() {
|
|||||||
// endWrite must be called at the end of all exported methods to set the chip
|
// endWrite must be called at the end of all exported methods to set the chip
|
||||||
// select pin high.
|
// select pin high.
|
||||||
func (d *DeviceOf[T]) endWrite() {
|
func (d *DeviceOf[T]) endWrite() {
|
||||||
if d.csPin != machine.NoPin {
|
if d.csPin != nil {
|
||||||
d.csPin.High()
|
d.csPin.High()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build tinygo
|
||||||
|
|
||||||
package sx127x
|
package sx127x
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
+4
-4
@@ -6,10 +6,10 @@ package sx127x
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
"tinygo.org/x/drivers/lora"
|
"tinygo.org/x/drivers/lora"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ const (
|
|||||||
// Device wraps an SPI connection to a SX127x device.
|
// Device wraps an SPI connection to a SX127x device.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
spi drivers.SPI // SPI bus for module communication
|
spi drivers.SPI // SPI bus for module communication
|
||||||
rstPin machine.Pin // GPIO for reset
|
rstPin pin.OutputFunc // GPIO for reset
|
||||||
radioEventChan chan lora.RadioEvent // Channel for Receiving events
|
radioEventChan chan lora.RadioEvent // Channel for Receiving events
|
||||||
loraConf lora.Config // Current Lora configuration
|
loraConf lora.Config // Current Lora configuration
|
||||||
controller RadioController // to manage interactions with the radio
|
controller RadioController // to manage interactions with the radio
|
||||||
@@ -43,10 +43,10 @@ func (d *Device) GetRadioEventChan() chan lora.RadioEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new SX127x connection. The SPI bus must already be configured.
|
// New creates a new SX127x connection. The SPI bus must already be configured.
|
||||||
func New(spi drivers.SPI, rstPin machine.Pin) *Device {
|
func New(spi drivers.SPI, rstPin pin.Output) *Device {
|
||||||
k := Device{
|
k := Device{
|
||||||
spi: spi,
|
spi: spi,
|
||||||
rstPin: rstPin,
|
rstPin: rstPin.Set,
|
||||||
radioEventChan: make(chan lora.RadioEvent, RADIOEVENTCHAN_SIZE),
|
radioEventChan: make(chan lora.RadioEvent, RADIOEVENTCHAN_SIZE),
|
||||||
spiTxBuf: make([]byte, SPI_BUFFER_SIZE),
|
spiTxBuf: make([]byte, SPI_BUFFER_SIZE),
|
||||||
spiRxBuf: make([]byte, SPI_BUFFER_SIZE),
|
spiRxBuf: make([]byte, SPI_BUFFER_SIZE),
|
||||||
|
|||||||
@@ -50,12 +50,7 @@ type Device struct {
|
|||||||
type Speed uint8
|
type Speed uint8
|
||||||
|
|
||||||
// New returns a new uc8151 driver. Pass in a fully configured SPI bus.
|
// New returns a new uc8151 driver. Pass in a fully configured SPI bus.
|
||||||
// Pins passed in must be configured beforehand.
|
|
||||||
func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
|
func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
|
||||||
// For backwards compatibility.
|
|
||||||
// This driver used to configure pins,
|
|
||||||
// so leave in to not break users.
|
|
||||||
// May be removed in future so try not to depend on it!
|
|
||||||
legacy.ConfigurePinOut(csPin)
|
legacy.ConfigurePinOut(csPin)
|
||||||
legacy.ConfigurePinOut(dcPin)
|
legacy.ConfigurePinOut(dcPin)
|
||||||
legacy.ConfigurePinOut(rstPin)
|
legacy.ConfigurePinOut(rstPin)
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ import (
|
|||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
"machine"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
@@ -22,14 +25,14 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus *machine.SPI
|
bus *machine.SPI
|
||||||
cs machine.Pin
|
cs pin.OutputFunc
|
||||||
dc machine.Pin
|
dc pin.OutputFunc
|
||||||
rst machine.Pin
|
rst pin.OutputFunc
|
||||||
busy machine.Pin
|
isBusy pin.InputFunc
|
||||||
|
configurePins func()
|
||||||
buffer []uint8
|
buffer []uint8
|
||||||
rotation Rotation
|
rotation Rotation
|
||||||
}
|
}
|
||||||
|
|
||||||
type Rotation uint8
|
type Rotation uint8
|
||||||
@@ -79,22 +82,28 @@ var partialRefresh = [159]uint8{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new epd1in54 driver. Pass in a fully configured SPI bus.
|
// New returns a new epd1in54 driver. Pass in a fully configured SPI bus.
|
||||||
func New(bus *machine.SPI, csPin, dcPin, rstPin, busyPin machine.Pin) Device {
|
func New(bus *machine.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
|
||||||
return Device{
|
return Device{
|
||||||
buffer: make([]uint8, (uint32(Width)*uint32(Height))/8),
|
buffer: make([]uint8, (uint32(Width)*uint32(Height))/8),
|
||||||
bus: bus,
|
bus: bus,
|
||||||
cs: csPin,
|
cs: csPin.Set,
|
||||||
dc: dcPin,
|
dc: dcPin.Set,
|
||||||
rst: rstPin,
|
rst: rstPin.Set,
|
||||||
busy: busyPin,
|
isBusy: busyPin.Get,
|
||||||
|
configurePins: func() {
|
||||||
|
legacy.ConfigurePinOut(csPin)
|
||||||
|
legacy.ConfigurePinOut(dcPin)
|
||||||
|
legacy.ConfigurePinOut(rstPin)
|
||||||
|
legacy.ConfigurePinInput(busyPin)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Device) LDirInit(cfg Config) {
|
func (d *Device) LDirInit(cfg Config) {
|
||||||
d.cs.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
if d.configurePins == nil {
|
||||||
d.rst.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
panic(legacy.ErrConfigBeforeInstantiated)
|
||||||
d.dc.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
}
|
||||||
d.busy.Configure(machine.PinConfig{Mode: machine.PinInput})
|
d.configurePins()
|
||||||
|
|
||||||
d.bus.Configure(machine.SPIConfig{
|
d.bus.Configure(machine.SPIConfig{
|
||||||
Frequency: 2000000,
|
Frequency: 2000000,
|
||||||
@@ -150,10 +159,10 @@ func (d *Device) LDirInit(cfg Config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *Device) HDirInit(cfg Config) {
|
func (d *Device) HDirInit(cfg Config) {
|
||||||
d.cs.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
if d.configurePins == nil {
|
||||||
d.rst.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
panic(legacy.ErrConfigBeforeInstantiated)
|
||||||
d.dc.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
}
|
||||||
d.busy.Configure(machine.PinConfig{Mode: machine.PinInput})
|
d.configurePins()
|
||||||
|
|
||||||
d.bus.Configure(machine.SPIConfig{
|
d.bus.Configure(machine.SPIConfig{
|
||||||
Frequency: 2000000,
|
Frequency: 2000000,
|
||||||
@@ -369,7 +378,7 @@ func (d *Device) Clear() {
|
|||||||
|
|
||||||
// WaitUntilIdle waits until the display is ready
|
// WaitUntilIdle waits until the display is ready
|
||||||
func (d *Device) WaitUntilIdle() {
|
func (d *Device) WaitUntilIdle() {
|
||||||
for d.busy.Get() {
|
for d.isBusy() {
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
}
|
}
|
||||||
time.Sleep(200 * time.Millisecond)
|
time.Sleep(200 * time.Millisecond)
|
||||||
@@ -377,7 +386,7 @@ func (d *Device) WaitUntilIdle() {
|
|||||||
|
|
||||||
// IsBusy returns the busy status of the display
|
// IsBusy returns the busy status of the display
|
||||||
func (d *Device) IsBusy() bool {
|
func (d *Device) IsBusy() bool {
|
||||||
return d.busy.Get()
|
return d.isBusy()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearBuffer sets the buffer to 0xFF (white)
|
// ClearBuffer sets the buffer to 0xFF (white)
|
||||||
|
|||||||
@@ -6,10 +6,11 @@ package epd2in13 // import "tinygo.org/x/drivers/waveshare-epd/epd2in13"
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
@@ -21,10 +22,10 @@ type Config struct {
|
|||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
cs machine.Pin
|
cs pin.OutputFunc
|
||||||
dc machine.Pin
|
dc pin.OutputFunc
|
||||||
rst machine.Pin
|
rst pin.OutputFunc
|
||||||
busy machine.Pin
|
isBusy pin.InputFunc
|
||||||
logicalWidth int16
|
logicalWidth int16
|
||||||
width int16
|
width int16
|
||||||
height int16
|
height int16
|
||||||
@@ -53,17 +54,17 @@ var lutPartialUpdate = [30]uint8{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new epd2in13x driver. Pass in a fully configured SPI bus.
|
// New returns a new epd2in13x driver. Pass in a fully configured SPI bus.
|
||||||
func New(bus drivers.SPI, csPin, dcPin, rstPin, busyPin machine.Pin) Device {
|
func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
|
||||||
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(csPin)
|
||||||
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(dcPin)
|
||||||
rstPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(rstPin)
|
||||||
busyPin.Configure(machine.PinConfig{Mode: machine.PinInput})
|
legacy.ConfigurePinInput(busyPin)
|
||||||
return Device{
|
return Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
cs: csPin,
|
cs: csPin.Set,
|
||||||
dc: dcPin,
|
dc: dcPin.Set,
|
||||||
rst: rstPin,
|
rst: rstPin.Set,
|
||||||
busy: busyPin,
|
isBusy: busyPin.Get,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,14 +299,14 @@ func (d *Device) setMemoryPointer(x int16, y int16) {
|
|||||||
|
|
||||||
// WaitUntilIdle waits until the display is ready
|
// WaitUntilIdle waits until the display is ready
|
||||||
func (d *Device) WaitUntilIdle() {
|
func (d *Device) WaitUntilIdle() {
|
||||||
for d.busy.Get() {
|
for d.isBusy() {
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsBusy returns the busy status of the display
|
// IsBusy returns the busy status of the display
|
||||||
func (d *Device) IsBusy() bool {
|
func (d *Device) IsBusy() bool {
|
||||||
return d.busy.Get()
|
return d.isBusy()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearBuffer sets the buffer to 0xFF (white)
|
// ClearBuffer sets the buffer to 0xFF (white)
|
||||||
|
|||||||
@@ -6,10 +6,11 @@ package epd2in13x // import "tinygo.org/x/drivers/waveshare-epd/epd2in13x"
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
@@ -20,10 +21,10 @@ type Config struct {
|
|||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
cs machine.Pin
|
cs pin.OutputFunc
|
||||||
dc machine.Pin
|
dc pin.OutputFunc
|
||||||
rst machine.Pin
|
rst pin.OutputFunc
|
||||||
busy machine.Pin
|
isBusy pin.InputFunc
|
||||||
width int16
|
width int16
|
||||||
height int16
|
height int16
|
||||||
buffer [][]uint8
|
buffer [][]uint8
|
||||||
@@ -33,17 +34,17 @@ type Device struct {
|
|||||||
type Color uint8
|
type Color uint8
|
||||||
|
|
||||||
// New returns a new epd2in13x driver. Pass in a fully configured SPI bus.
|
// New returns a new epd2in13x driver. Pass in a fully configured SPI bus.
|
||||||
func New(bus drivers.SPI, csPin, dcPin, rstPin, busyPin machine.Pin) Device {
|
func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
|
||||||
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(csPin)
|
||||||
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(dcPin)
|
||||||
rstPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(rstPin)
|
||||||
busyPin.Configure(machine.PinConfig{Mode: machine.PinInput})
|
legacy.ConfigurePinInput(busyPin)
|
||||||
return Device{
|
return Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
cs: csPin,
|
cs: csPin.Set,
|
||||||
dc: dcPin,
|
dc: dcPin.Set,
|
||||||
rst: rstPin,
|
rst: rstPin.Set,
|
||||||
busy: busyPin,
|
isBusy: busyPin.Get,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,14 +278,14 @@ func (d *Device) ClearDisplay() {
|
|||||||
|
|
||||||
// WaitUntilIdle waits until the display is ready
|
// WaitUntilIdle waits until the display is ready
|
||||||
func (d *Device) WaitUntilIdle() {
|
func (d *Device) WaitUntilIdle() {
|
||||||
for !d.busy.Get() {
|
for !d.isBusy() {
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsBusy returns the busy status of the display
|
// IsBusy returns the busy status of the display
|
||||||
func (d *Device) IsBusy() bool {
|
func (d *Device) IsBusy() bool {
|
||||||
return d.busy.Get()
|
return d.isBusy()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearBuffer sets the buffer to 0xFF (white)
|
// ClearBuffer sets the buffer to 0xFF (white)
|
||||||
|
|||||||
@@ -5,10 +5,11 @@ package epd2in66b
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -18,20 +19,12 @@ const (
|
|||||||
|
|
||||||
const Baudrate = 4_000_000 // 4 MHz
|
const Baudrate = 4_000_000 // 4 MHz
|
||||||
|
|
||||||
type Config struct {
|
|
||||||
ResetPin machine.Pin
|
|
||||||
DataPin machine.Pin
|
|
||||||
ChipSelectPin machine.Pin
|
|
||||||
BusyPin machine.Pin
|
|
||||||
}
|
|
||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
cs machine.Pin
|
cs pin.OutputFunc
|
||||||
dc machine.Pin
|
dc pin.OutputFunc
|
||||||
rst machine.Pin
|
rst pin.OutputFunc
|
||||||
busy machine.Pin
|
isBusy pin.InputFunc
|
||||||
|
|
||||||
blackBuffer []byte
|
blackBuffer []byte
|
||||||
redBuffer []byte
|
redBuffer []byte
|
||||||
}
|
}
|
||||||
@@ -50,18 +43,23 @@ func New(bus drivers.SPI) Device {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
ResetPin pin.Output
|
||||||
|
DataPin pin.Output
|
||||||
|
ChipSelectPin pin.Output
|
||||||
|
BusyPin pin.Input
|
||||||
|
}
|
||||||
|
|
||||||
// Configure configures the device and its pins.
|
// Configure configures the device and its pins.
|
||||||
func (d *Device) Configure(c Config) error {
|
func (d *Device) Configure(c Config) error {
|
||||||
d.cs = c.ChipSelectPin
|
d.cs = c.ChipSelectPin.Set
|
||||||
d.dc = c.DataPin
|
d.dc = c.DataPin.Set
|
||||||
d.rst = c.ResetPin
|
d.rst = c.ResetPin.Set
|
||||||
d.busy = c.BusyPin
|
d.isBusy = c.BusyPin.Get
|
||||||
|
legacy.ConfigurePinOut(c.ChipSelectPin)
|
||||||
d.cs.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(c.DataPin)
|
||||||
d.dc.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(c.ResetPin)
|
||||||
d.rst.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinInput(c.BusyPin)
|
||||||
d.busy.Configure(machine.PinConfig{Mode: machine.PinInput})
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,7 +227,7 @@ func (d *Device) WaitUntilIdle() {
|
|||||||
// give it some time to get busy
|
// give it some time to get busy
|
||||||
time.Sleep(50 * time.Millisecond)
|
time.Sleep(50 * time.Millisecond)
|
||||||
|
|
||||||
for d.busy.Get() { // high = busy
|
for d.isBusy() { // high = busy
|
||||||
time.Sleep(10 * time.Millisecond)
|
time.Sleep(10 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,10 +13,11 @@ package epd2in9 // import "tinygo.org/x/drivers/waveshare-epd/epd2in9"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
@@ -28,10 +29,10 @@ type Config struct {
|
|||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
cs machine.Pin
|
cs pin.OutputFunc
|
||||||
dc machine.Pin
|
dc pin.OutputFunc
|
||||||
rst machine.Pin
|
rst pin.OutputFunc
|
||||||
busy machine.Pin
|
isBusy pin.InputFunc
|
||||||
logicalWidth int16
|
logicalWidth int16
|
||||||
width int16
|
width int16
|
||||||
height int16
|
height int16
|
||||||
@@ -61,17 +62,17 @@ var lutPartialUpdate = [30]uint8{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new epd2in9 driver. Pass in a fully configured SPI bus.
|
// New returns a new epd2in9 driver. Pass in a fully configured SPI bus.
|
||||||
func New(bus drivers.SPI, csPin, dcPin, rstPin, busyPin machine.Pin) Device {
|
func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
|
||||||
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(csPin)
|
||||||
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(dcPin)
|
||||||
rstPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(rstPin)
|
||||||
busyPin.Configure(machine.PinConfig{Mode: machine.PinInput})
|
legacy.ConfigurePinInput(busyPin)
|
||||||
return Device{
|
return Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
cs: csPin,
|
cs: csPin.Set,
|
||||||
dc: dcPin,
|
dc: dcPin.Set,
|
||||||
rst: rstPin,
|
rst: rstPin.Set,
|
||||||
busy: busyPin,
|
isBusy: busyPin.Get,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,14 +246,14 @@ func (d *Device) setMemoryPointer(x int16, y int16) {
|
|||||||
|
|
||||||
// WaitUntilIdle waits until the display is ready
|
// WaitUntilIdle waits until the display is ready
|
||||||
func (d *Device) WaitUntilIdle() {
|
func (d *Device) WaitUntilIdle() {
|
||||||
for d.busy.Get() {
|
for d.isBusy() {
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsBusy returns the busy status of the display
|
// IsBusy returns the busy status of the display
|
||||||
func (d *Device) IsBusy() bool {
|
func (d *Device) IsBusy() bool {
|
||||||
return d.busy.Get()
|
return d.isBusy()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearBuffer sets the buffer to 0xFF (white)
|
// ClearBuffer sets the buffer to 0xFF (white)
|
||||||
|
|||||||
@@ -10,10 +10,11 @@ package epd4in2
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"machine"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers"
|
"tinygo.org/x/drivers"
|
||||||
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
|
"tinygo.org/x/drivers/internal/pin"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
@@ -25,10 +26,10 @@ type Config struct {
|
|||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus drivers.SPI
|
bus drivers.SPI
|
||||||
cs machine.Pin
|
cs pin.OutputFunc
|
||||||
dc machine.Pin
|
dc pin.OutputFunc
|
||||||
rst machine.Pin
|
rst pin.OutputFunc
|
||||||
busy machine.Pin
|
isBusy pin.InputFunc
|
||||||
logicalWidth int16
|
logicalWidth int16
|
||||||
width int16
|
width int16
|
||||||
height int16
|
height int16
|
||||||
@@ -40,17 +41,17 @@ type Device struct {
|
|||||||
type Rotation uint8
|
type Rotation uint8
|
||||||
|
|
||||||
// New returns a new epd4in2 driver. Pass in a fully configured SPI bus.
|
// New returns a new epd4in2 driver. Pass in a fully configured SPI bus.
|
||||||
func New(bus drivers.SPI, csPin, dcPin, rstPin, busyPin machine.Pin) Device {
|
func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
|
||||||
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(csPin)
|
||||||
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(dcPin)
|
||||||
rstPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
legacy.ConfigurePinOut(rstPin)
|
||||||
busyPin.Configure(machine.PinConfig{Mode: machine.PinInput})
|
legacy.ConfigurePinInput(busyPin)
|
||||||
return Device{
|
return Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
cs: csPin,
|
cs: csPin.Set,
|
||||||
dc: dcPin,
|
dc: dcPin.Set,
|
||||||
rst: rstPin,
|
rst: rstPin.Set,
|
||||||
busy: busyPin,
|
isBusy: busyPin.Get,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,14 +312,14 @@ func (d *Device) ClearDisplay() {
|
|||||||
|
|
||||||
// WaitUntilIdle waits until the display is ready
|
// WaitUntilIdle waits until the display is ready
|
||||||
func (d *Device) WaitUntilIdle() {
|
func (d *Device) WaitUntilIdle() {
|
||||||
for d.busy.Get() {
|
for d.isBusy() {
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsBusy returns the busy status of the display
|
// IsBusy returns the busy status of the display
|
||||||
func (d *Device) IsBusy() bool {
|
func (d *Device) IsBusy() bool {
|
||||||
return d.busy.Get()
|
return d.isBusy()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearBuffer sets the buffer to 0xFF (white)
|
// ClearBuffer sets the buffer to 0xFF (white)
|
||||||
|
|||||||
Reference in New Issue
Block a user