Skip to content

added support for SK6812 to WS2812 device #610

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Dec 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/ws2812/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ func main() {

neo.Configure(machine.PinConfig{Mode: machine.PinOutput})

ws := ws2812.New(neo)
ws := ws2812.NewWS2812(neo)
rg := false

for {
Expand Down
55 changes: 45 additions & 10 deletions ws2812/ws2812.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,34 @@ var errUnknownClockSpeed = errors.New("ws2812: unknown CPU clock speed")

// Device wraps a pin object for an easy driver interface.
type Device struct {
Pin machine.Pin
Pin machine.Pin
writeColorFunc func(Device, []color.RGBA) error
}

// New returns a new WS2812 driver. It does not touch the pin object: you have
// to configure it as an output pin before calling New.
// deprecated, use NewWS2812 or NewSK6812 depending on which device you want.
// calls NewWS2812() to avoid breaking everyone's existing code.
func New(pin machine.Pin) Device {
return Device{pin}
return NewWS2812(pin)
}

// New returns a new WS2812(RGB) driver.
// It does not touch the pin object: you have
// to configure it as an output pin before calling New.
func NewWS2812(pin machine.Pin) Device {
return Device{
Pin: pin,
writeColorFunc: writeColorsRGB,
}
}

// New returns a new SK6812(RGBA) driver.
// It does not touch the pin object: you have
// to configure it as an output pin before calling New.
func NewSK6812(pin machine.Pin) Device {
return Device{
Pin: pin,
writeColorFunc: writeColorsRGBA,
}
}

// Write the raw bitstring out using the WS2812 protocol.
Expand All @@ -32,12 +53,26 @@ func (d Device) Write(buf []byte) (n int, err error) {
}

// Write the given color slice out using the WS2812 protocol.
// Colors are sent out in the usual GRB format.
func (d Device) WriteColors(buf []color.RGBA) error {
// Colors are sent out in the usual GRB(A) format.
func (d Device) WriteColors(buf []color.RGBA) (err error) {
return d.writeColorFunc(d, buf)
}

func writeColorsRGB(d Device, buf []color.RGBA) (err error) {
for _, color := range buf {
d.WriteByte(color.G) // green
d.WriteByte(color.R) // red
err = d.WriteByte(color.B) // blue
}
return
}

func writeColorsRGBA(d Device, buf []color.RGBA) (err error) {
for _, color := range buf {
d.WriteByte(color.G) // green
d.WriteByte(color.R) // red
d.WriteByte(color.B) // blue
d.WriteByte(color.G) // green
d.WriteByte(color.R) // red
d.WriteByte(color.B) // blue
err = d.WriteByte(color.A) // alpha
}
return nil
return
}