fix(pkg/rgb-led): complete rgb-led pkg
This commit is contained in:
12
pkg/rgbled/interfaces.go
Normal file
12
pkg/rgbled/interfaces.go
Normal file
@ -0,0 +1,12 @@
|
||||
package rgbled
|
||||
|
||||
type RGBLED interface {
|
||||
Blue(on bool) error
|
||||
Green(on bool) error
|
||||
Off() error
|
||||
Purple(on bool) error
|
||||
Red(on bool) error
|
||||
Turquoise(on bool) error
|
||||
White(on bool) error
|
||||
Yellow(on bool) error
|
||||
}
|
169
pkg/rgbled/led.go
Normal file
169
pkg/rgbled/led.go
Normal file
@ -0,0 +1,169 @@
|
||||
package rgbled
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
"github.com/stianeikeland/go-rpio"
|
||||
)
|
||||
|
||||
type LED struct {
|
||||
*types.RGBLED
|
||||
}
|
||||
|
||||
func (l *LED) Blue(on bool) error {
|
||||
gpios := []*types.GPIO{
|
||||
l.BaseColorsToGPIO[types.BaseColorBlue],
|
||||
}
|
||||
|
||||
if err := l.Off(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := l.operate(gpios, on); err != nil {
|
||||
return fmt.Errorf("Can not operate with GPIOs: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *LED) Green(on bool) error {
|
||||
|
||||
gpios := []*types.GPIO{
|
||||
l.BaseColorsToGPIO[types.BaseColorGreen],
|
||||
}
|
||||
|
||||
if err := l.Off(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := l.operate(gpios, on); err != nil {
|
||||
return fmt.Errorf("Can not operate with GPIOs: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (l *LED) Off() error {
|
||||
|
||||
gpios := []*types.GPIO{
|
||||
l.BaseColorsToGPIO[types.BaseColorBlue],
|
||||
l.BaseColorsToGPIO[types.BaseColorGreen],
|
||||
l.BaseColorsToGPIO[types.BaseColorRed],
|
||||
}
|
||||
|
||||
if err := l.operate(gpios, false); err != nil {
|
||||
return fmt.Errorf("Can not turn GPIOs off: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *LED) Purple(on bool) error {
|
||||
gpios := []*types.GPIO{
|
||||
l.BaseColorsToGPIO[types.BaseColorBlue],
|
||||
l.BaseColorsToGPIO[types.BaseColorRed],
|
||||
}
|
||||
|
||||
if err := l.Off(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := l.operate(gpios, on); err != nil {
|
||||
return fmt.Errorf("Can not operate with GPIOs: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *LED) Red(on bool) error {
|
||||
gpios := []*types.GPIO{
|
||||
l.BaseColorsToGPIO[types.BaseColorRed],
|
||||
}
|
||||
|
||||
if err := l.Off(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := l.operate(gpios, on); err != nil {
|
||||
return fmt.Errorf("Can not operate with GPIOs: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *LED) Turquoise(on bool) error {
|
||||
gpios := []*types.GPIO{
|
||||
l.BaseColorsToGPIO[types.BaseColorBlue],
|
||||
l.BaseColorsToGPIO[types.BaseColorGreen],
|
||||
}
|
||||
|
||||
if err := l.Off(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := l.operate(gpios, on); err != nil {
|
||||
return fmt.Errorf("Can not operate with GPIOs: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *LED) White(on bool) error {
|
||||
gpios := []*types.GPIO{
|
||||
l.BaseColorsToGPIO[types.BaseColorBlue],
|
||||
l.BaseColorsToGPIO[types.BaseColorGreen],
|
||||
l.BaseColorsToGPIO[types.BaseColorRed],
|
||||
}
|
||||
|
||||
if err := l.Off(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := l.operate(gpios, on); err != nil {
|
||||
return fmt.Errorf("Can not operate with GPIOs: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *LED) Yellow(on bool) error {
|
||||
gpios := []*types.GPIO{
|
||||
l.BaseColorsToGPIO[types.BaseColorGreen],
|
||||
l.BaseColorsToGPIO[types.BaseColorRed],
|
||||
}
|
||||
|
||||
if err := l.Off(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := l.operate(gpios, on); err != nil {
|
||||
return fmt.Errorf("Can not operate with GPIOs: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *LED) operate(gpios []*types.GPIO, on bool) error {
|
||||
if err := rpio.Open(); err != nil {
|
||||
return fmt.Errorf("Cam not open rpio connection: %v", err)
|
||||
}
|
||||
defer rpio.Close()
|
||||
|
||||
for _, gpio := range gpios {
|
||||
gpioInt, err := types.GPIOToInt(*gpio)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Can not determine %v into integer: %v", gpio, err)
|
||||
}
|
||||
|
||||
pin := rpio.Pin(gpioInt)
|
||||
|
||||
if on {
|
||||
pin.High()
|
||||
} else {
|
||||
pin.Low()
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
129
pkg/rgbled/rgbled.go
Normal file
129
pkg/rgbled/rgbled.go
Normal file
@ -0,0 +1,129 @@
|
||||
package rgbled
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/go-flucky/flucky/pkg/internal/collect"
|
||||
"github.com/go-flucky/flucky/pkg/internal/prittyprint"
|
||||
"github.com/go-flucky/flucky/pkg/types"
|
||||
)
|
||||
|
||||
func Blue(rgbLEDs []RGBLED) error {
|
||||
color := types.LEDColorBlue
|
||||
if err := operate(rgbLEDs, true, color); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func CustomColor(rgbLEDs []RGBLED, color types.LEDColor) error {
|
||||
if err := operate(rgbLEDs, true, color); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Green(rgbLEDs []RGBLED) error {
|
||||
color := types.LEDColorGreen
|
||||
if err := operate(rgbLEDs, true, color); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Off(rgbLEDs []RGBLED) error {
|
||||
color := types.LEDColorNone
|
||||
if err := operate(rgbLEDs, false, color); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Purple(rgbLEDs []RGBLED) error {
|
||||
color := types.LEDColorPurple
|
||||
if err := operate(rgbLEDs, true, color); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Red(rgbLEDs []RGBLED) error {
|
||||
color := types.LEDColorRed
|
||||
if err := operate(rgbLEDs, true, color); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Turquoise(rgbLEDs []RGBLED) error {
|
||||
color := types.LEDColorTurquoise
|
||||
if err := operate(rgbLEDs, true, color); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func White(rgbLEDs []RGBLED) error {
|
||||
color := types.LEDColorWhite
|
||||
if err := operate(rgbLEDs, true, color); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Yellow(rgbLEDs []RGBLED) error {
|
||||
color := types.LEDColorYellow
|
||||
if err := operate(rgbLEDs, true, color); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func operate(rgbLEDs []RGBLED, on bool, color types.LEDColor) error {
|
||||
|
||||
errorChannel := make(chan error, len(rgbLEDs))
|
||||
|
||||
wg := new(sync.WaitGroup)
|
||||
wg.Add(len(rgbLEDs))
|
||||
|
||||
for _, rgbLED := range rgbLEDs {
|
||||
go func(rgbLED RGBLED, color types.LEDColor, on bool, errorChannel chan<- error, wg *sync.WaitGroup) {
|
||||
defer wg.Done()
|
||||
|
||||
var err error
|
||||
|
||||
switch color {
|
||||
case types.LEDColorBlue:
|
||||
err = rgbLED.Blue(on)
|
||||
case types.LEDColorGreen:
|
||||
err = rgbLED.Green(on)
|
||||
case types.LEDColorPurple:
|
||||
err = rgbLED.Purple(on)
|
||||
case types.LEDColorNone:
|
||||
err = rgbLED.Off()
|
||||
case types.LEDColorRed:
|
||||
err = rgbLED.Red(on)
|
||||
case types.LEDColorTurquoise:
|
||||
err = rgbLED.Turquoise(on)
|
||||
case types.LEDColorWhite:
|
||||
err = rgbLED.White(on)
|
||||
case types.LEDColorYellow:
|
||||
err = rgbLED.Yellow(on)
|
||||
default:
|
||||
err = rgbLED.Off()
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
errorChannel <- err
|
||||
}
|
||||
}(rgbLED, color, on, errorChannel, wg)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
|
||||
errors := collect.Errors(errorChannel)
|
||||
if len(errors) > 0 {
|
||||
return prittyprint.FormatErrors(errors)
|
||||
}
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user