APA102: Allow to specify SPI Mode

pull/16/merge^2
Alex Güthner 5 years ago
parent 440ba6e652
commit 70f3a511cc

@ -92,8 +92,12 @@ type Opts struct {
// As per APA102-C spec, the chip's max refresh rate is 400hz. // As per APA102-C spec, the chip's max refresh rate is 400hz.
// https://en.wikipedia.org/wiki/Flicker_fusion_threshold is a recommended // https://en.wikipedia.org/wiki/Flicker_fusion_threshold is a recommended
// reading. // reading.
func New(p spi.Port, o *Opts) (*Dev, error) { //
c, err := p.Connect(20*physic.MegaHertz, spi.Mode3, 8) // Most devices can use spi.Mode3, but the raspberry pi 3 secondary SPI
// for example does not support this Mode. You may need to use spi.Mode0
// in this and similar cases.
func New(p spi.Port, o *Opts, spiMode spi.Mode) (*Dev, error) {
c, err := p.Connect(20*physic.MegaHertz, spiMode, 8)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -333,7 +333,7 @@ func TestDevEmpty(t *testing.T) {
buf := bytes.Buffer{} buf := bytes.Buffer{}
o := DefaultOpts o := DefaultOpts
o.NumPixels = 0 o.NumPixels = 0
d, _ := New(spitest.NewRecordRaw(&buf), &o) d, _ := New(spitest.NewRecordRaw(&buf), &o, spi.Mode3)
if n, err := d.Write([]byte{}); n != 0 || err != nil { if n, err := d.Write([]byte{}); n != 0 || err != nil {
t.Fatalf("%d %v", n, err) t.Fatalf("%d %v", n, err)
} }
@ -346,7 +346,7 @@ func TestDevEmpty(t *testing.T) {
} }
func TestConnectFail(t *testing.T) { func TestConnectFail(t *testing.T) {
if d, err := New(&configFail{}, &DefaultOpts); d != nil || err == nil { if d, err := New(&configFail{}, &DefaultOpts, spi.Mode3); d != nil || err == nil {
t.Fatal("Connect() call have failed") t.Fatal("Connect() call have failed")
} }
} }
@ -355,7 +355,7 @@ func TestDevLen(t *testing.T) {
buf := bytes.Buffer{} buf := bytes.Buffer{}
o := DefaultOpts o := DefaultOpts
o.NumPixels = 1 o.NumPixels = 1
d, _ := New(spitest.NewRecordRaw(&buf), &o) d, _ := New(spitest.NewRecordRaw(&buf), &o, spi.Mode3)
if n, err := d.Write([]byte{0}); n != 0 || err == nil { if n, err := d.Write([]byte{0}); n != 0 || err == nil {
t.Fatalf("%d %v", n, err) t.Fatalf("%d %v", n, err)
} }
@ -555,7 +555,7 @@ func TestWrites(t *testing.T) {
for _, tt := range writeTests { for _, tt := range writeTests {
buf := bytes.Buffer{} buf := bytes.Buffer{}
tt.opts.NumPixels = len(tt.pixels) / 3 tt.opts.NumPixels = len(tt.pixels) / 3
d, _ := New(spitest.NewRecordRaw(&buf), &tt.opts) d, _ := New(spitest.NewRecordRaw(&buf), &tt.opts, spi.Mode3)
n, err := d.Write(tt.pixels) n, err := d.Write(tt.pixels)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@ -580,7 +580,7 @@ func TestDevLong(t *testing.T) {
colors := make([]color.NRGBA, 256) colors := make([]color.NRGBA, 256)
o := DefaultOpts o := DefaultOpts
o.NumPixels = len(colors) o.NumPixels = len(colors)
d, _ := New(spitest.NewRecordRaw(&buf), &o) d, _ := New(spitest.NewRecordRaw(&buf), &o, spi.Mode3)
if n, err := d.Write(ToRGB(colors)); n != len(colors)*3 || err != nil { if n, err := d.Write(ToRGB(colors)); n != len(colors)*3 || err != nil {
t.Fatalf("%d %v", n, err) t.Fatalf("%d %v", n, err)
} }
@ -601,7 +601,7 @@ func TestDevWrite_Long(t *testing.T) {
buf := bytes.Buffer{} buf := bytes.Buffer{}
o := DefaultOpts o := DefaultOpts
o.NumPixels = 1 o.NumPixels = 1
d, _ := New(spitest.NewRecordRaw(&buf), &o) d, _ := New(spitest.NewRecordRaw(&buf), &o, spi.Mode3)
if n, err := d.Write([]byte{0, 0, 0, 1, 1, 1}); n != 0 || err == nil { if n, err := d.Write([]byte{0, 0, 0, 1, 1, 1}); n != 0 || err == nil {
t.Fatal(n, err) t.Fatal(n, err)
} }
@ -769,7 +769,7 @@ var drawTests = []struct {
func TestDraws(t *testing.T) { func TestDraws(t *testing.T) {
for _, tt := range drawTests { for _, tt := range drawTests {
buf := bytes.Buffer{} buf := bytes.Buffer{}
d, _ := New(spitest.NewRecordRaw(&buf), &tt.opts) d, _ := New(spitest.NewRecordRaw(&buf), &tt.opts, spi.Mode3)
if err := d.Draw(d.Bounds(), tt.img, image.Point{}); err != nil { if err := d.Draw(d.Bounds(), tt.img, image.Point{}); err != nil {
t.Fatalf("%s: %v", tt.name, err) t.Fatalf("%s: %v", tt.name, err)
} }
@ -874,7 +874,7 @@ var offsetDrawTests = []struct {
func TestOffsetDraws(t *testing.T) { func TestOffsetDraws(t *testing.T) {
for _, tt := range offsetDrawTests { for _, tt := range offsetDrawTests {
buf := bytes.Buffer{} buf := bytes.Buffer{}
d, _ := New(spitest.NewRecordRaw(&buf), &tt.opts) d, _ := New(spitest.NewRecordRaw(&buf), &tt.opts, spi.Mode3)
if err := d.Draw(tt.offset, tt.img, tt.point); err != nil { if err := d.Draw(tt.offset, tt.img, tt.point); err != nil {
t.Fatalf("%s: %v", tt.name, err) t.Fatalf("%s: %v", tt.name, err)
} }
@ -895,7 +895,7 @@ func TestHalt(t *testing.T) {
o := DefaultOpts o := DefaultOpts
o.NumPixels = 4 o.NumPixels = 4
o.Temperature = 5000 o.Temperature = 5000
d, _ := New(&s, &o) d, _ := New(&s, &o, spi.Mode3)
if err := d.Halt(); err != nil { if err := d.Halt(); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -925,7 +925,7 @@ func benchmarkWrite(b *testing.B, o Opts, length int, f genColor) {
} }
o.NumPixels = length o.NumPixels = length
b.ReportAllocs() b.ReportAllocs()
d, _ := New(spitest.NewRecordRaw(ioutil.Discard), &o) d, _ := New(spitest.NewRecordRaw(ioutil.Discard), &o, spi.Mode3)
_, _ = d.Write(pixels[:]) _, _ = d.Write(pixels[:])
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
@ -983,7 +983,7 @@ func BenchmarkWriteColorfulVariation(b *testing.B) {
o.NumPixels = len(pixels) / 3 o.NumPixels = len(pixels) / 3
o.Intensity = 250 o.Intensity = 250
o.Temperature = 5000 o.Temperature = 5000
d, _ := New(spitest.NewRecordRaw(ioutil.Discard), &o) d, _ := New(spitest.NewRecordRaw(ioutil.Discard), &o, spi.Mode3)
_, _ = d.Write(pixels[:]) _, _ = d.Write(pixels[:])
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
@ -1003,7 +1003,7 @@ func benchmarkDraw(b *testing.B, o Opts, img draw.Image, f genColor) {
} }
o.NumPixels = img.Bounds().Max.X o.NumPixels = img.Bounds().Max.X
b.ReportAllocs() b.ReportAllocs()
d, _ := New(spitest.NewRecordRaw(ioutil.Discard), &o) d, _ := New(spitest.NewRecordRaw(ioutil.Discard), &o, spi.Mode3)
r := d.Bounds() r := d.Bounds()
p := image.Point{} p := image.Point{}
if err := d.Draw(r, img, p); err != nil { if err := d.Draw(r, img, p); err != nil {
@ -1062,7 +1062,7 @@ func BenchmarkDrawSlowpath(b *testing.B) {
o := DefaultOpts o := DefaultOpts
o.NumPixels = img.Bounds().Max.X o.NumPixels = img.Bounds().Max.X
b.ReportAllocs() b.ReportAllocs()
d, _ := New(spitest.NewRecordRaw(ioutil.Discard), &o) d, _ := New(spitest.NewRecordRaw(ioutil.Discard), &o, spi.Mode3)
r := d.Bounds() r := d.Bounds()
p := image.Point{} p := image.Point{}
if err := d.Draw(r, img, p); err != nil { if err := d.Draw(r, img, p); err != nil {
@ -1078,7 +1078,7 @@ func BenchmarkDrawSlowpath(b *testing.B) {
func BenchmarkHalt(b *testing.B) { func BenchmarkHalt(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
d, _ := New(spitest.NewRecordRaw(ioutil.Discard), &DefaultOpts) d, _ := New(spitest.NewRecordRaw(ioutil.Discard), &DefaultOpts, spi.Mode3)
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
if err := d.Halt(); err != nil { if err := d.Halt(); err != nil {

@ -9,6 +9,7 @@ import (
"image/color" "image/color"
"log" "log"
"periph.io/x/conn/v3/spi"
"periph.io/x/conn/v3/spi/spireg" "periph.io/x/conn/v3/spi/spireg"
"periph.io/x/devices/v3/apa102" "periph.io/x/devices/v3/apa102"
"periph.io/x/host/v3" "periph.io/x/host/v3"
@ -33,7 +34,7 @@ func Example() {
o.NumPixels = 300 o.NumPixels = 300
o.Intensity = 127 o.Intensity = 127
o.Temperature = 3500 o.Temperature = 3500
dev, err := apa102.New(p, &o) dev, err := apa102.New(p, &o, spi.Mode0)
if err != nil { if err != nil {
log.Fatalf("failed to open: %v", err) log.Fatalf("failed to open: %v", err)
} }
@ -61,7 +62,7 @@ func ExampleToRGB() {
o := apa102.PassThruOpts o := apa102.PassThruOpts
o.NumPixels = 2 o.NumPixels = 2
dev, err := apa102.New(p, &o) dev, err := apa102.New(p, &o, spi.Mode3)
if err != nil { if err != nil {
log.Fatalf("failed to open: %v", err) log.Fatalf("failed to open: %v", err)
} }

@ -7,6 +7,7 @@ package rainbowhat
import ( import (
"periph.io/x/conn/v3/gpio" "periph.io/x/conn/v3/gpio"
"periph.io/x/conn/v3/i2c/i2creg" "periph.io/x/conn/v3/i2c/i2creg"
"periph.io/x/conn/v3/spi"
"periph.io/x/conn/v3/spi/spireg" "periph.io/x/conn/v3/spi/spireg"
"periph.io/x/devices/v3/apa102" "periph.io/x/devices/v3/apa102"
"periph.io/x/devices/v3/bmxx80" "periph.io/x/devices/v3/bmxx80"
@ -53,7 +54,7 @@ func NewRainbowHat(ao *apa102.Opts) (*Dev, error) {
opts := *ao opts := *ao
opts.NumPixels = 7 opts.NumPixels = 7
ledstrip, err := apa102.New(spiPort, &opts) ledstrip, err := apa102.New(spiPort, &opts, spi.Mode3)
if err != nil { if err != nil {
return nil, err return nil, err
} }

Loading…
Cancel
Save