fix(pkg/rgbled): use action maps to turn on/off led colors

This commit is contained in:
2019-06-24 22:57:29 +02:00
parent 02fa0cc931
commit c8a1dd2935
9 changed files with 284 additions and 157 deletions

View File

@ -1,12 +1,25 @@
package rgbled
type RGBLED interface {
Blue(on bool) error
Green(on bool) error
type LED interface {
On() error
Off() error
}
type RGBLED interface {
Blue() error
Green() error
Purple() error
Red() error
Turquoise() error
White() error
Yellow() error
Error() error
Logfile() error
Run() error
Sync() error
Warn() error
On() error
Off() error
Purple(on bool) error
Red(on bool) error
Turquoise(on bool) error
White(on bool) error
Yellow(on bool) error
}

View File

@ -7,37 +7,37 @@ import (
"github.com/stianeikeland/go-rpio"
)
type LED struct {
type DefaultRGBLED struct {
*types.RGBLED
}
func (l *LED) Blue(on bool) error {
func (rgbled *DefaultRGBLED) Blue() error {
gpios := []*types.GPIO{
l.BaseColorsToGPIO[types.BaseColorBlue],
rgbled.BaseColorsToGPIO[types.BaseColorBlue],
}
if err := l.Off(); err != nil {
if err := rgbled.Off(); err != nil {
return err
}
if err := l.operate(gpios, on); err != nil {
if err := rgbled.switchColors(gpios, true); err != nil {
return fmt.Errorf("Can not operate with GPIOs: %v", err)
}
return nil
}
func (l *LED) Green(on bool) error {
func (rgbled *DefaultRGBLED) Green() error {
gpios := []*types.GPIO{
l.BaseColorsToGPIO[types.BaseColorGreen],
rgbled.BaseColorsToGPIO[types.BaseColorGreen],
}
if err := l.Off(); err != nil {
if err := rgbled.Off(); err != nil {
return err
}
if err := l.operate(gpios, on); err != nil {
if err := rgbled.switchColors(gpios, true); err != nil {
return fmt.Errorf("Can not operate with GPIOs: %v", err)
}
@ -45,107 +45,131 @@ func (l *LED) Green(on bool) error {
}
func (l *LED) Off() error {
func (rgbled *DefaultRGBLED) Off() error {
gpios := []*types.GPIO{
l.BaseColorsToGPIO[types.BaseColorBlue],
l.BaseColorsToGPIO[types.BaseColorGreen],
l.BaseColorsToGPIO[types.BaseColorRed],
rgbled.BaseColorsToGPIO[types.BaseColorBlue],
rgbled.BaseColorsToGPIO[types.BaseColorGreen],
rgbled.BaseColorsToGPIO[types.BaseColorRed],
}
if err := l.operate(gpios, false); err != nil {
if err := rgbled.switchColors(gpios, false); err != nil {
return fmt.Errorf("Can not turn GPIOs off: %v", err)
}
return nil
}
func (l *LED) Purple(on bool) error {
func (rgbled *DefaultRGBLED) On() error {
return rgbled.White()
}
func (rgbled *DefaultRGBLED) Purple() error {
gpios := []*types.GPIO{
l.BaseColorsToGPIO[types.BaseColorBlue],
l.BaseColorsToGPIO[types.BaseColorRed],
rgbled.BaseColorsToGPIO[types.BaseColorBlue],
rgbled.BaseColorsToGPIO[types.BaseColorRed],
}
if err := l.Off(); err != nil {
if err := rgbled.Off(); err != nil {
return err
}
if err := l.operate(gpios, on); err != nil {
if err := rgbled.switchColors(gpios, true); err != nil {
return fmt.Errorf("Can not operate with GPIOs: %v", err)
}
return nil
}
func (l *LED) Red(on bool) error {
func (rgbled *DefaultRGBLED) Red() error {
gpios := []*types.GPIO{
l.BaseColorsToGPIO[types.BaseColorRed],
rgbled.BaseColorsToGPIO[types.BaseColorRed],
}
if err := l.Off(); err != nil {
if err := rgbled.Off(); err != nil {
return err
}
if err := l.operate(gpios, on); err != nil {
if err := rgbled.switchColors(gpios, true); err != nil {
return fmt.Errorf("Can not operate with GPIOs: %v", err)
}
return nil
}
func (l *LED) Turquoise(on bool) error {
func (rgbled *DefaultRGBLED) Turquoise() error {
gpios := []*types.GPIO{
l.BaseColorsToGPIO[types.BaseColorBlue],
l.BaseColorsToGPIO[types.BaseColorGreen],
rgbled.BaseColorsToGPIO[types.BaseColorBlue],
rgbled.BaseColorsToGPIO[types.BaseColorGreen],
}
if err := l.Off(); err != nil {
if err := rgbled.Off(); err != nil {
return err
}
if err := l.operate(gpios, on); err != nil {
if err := rgbled.switchColors(gpios, true); err != nil {
return fmt.Errorf("Can not operate with GPIOs: %v", err)
}
return nil
}
func (l *LED) White(on bool) error {
func (rgbled *DefaultRGBLED) White() error {
gpios := []*types.GPIO{
l.BaseColorsToGPIO[types.BaseColorBlue],
l.BaseColorsToGPIO[types.BaseColorGreen],
l.BaseColorsToGPIO[types.BaseColorRed],
rgbled.BaseColorsToGPIO[types.BaseColorBlue],
rgbled.BaseColorsToGPIO[types.BaseColorGreen],
rgbled.BaseColorsToGPIO[types.BaseColorRed],
}
if err := l.Off(); err != nil {
if err := rgbled.Off(); err != nil {
return err
}
if err := l.operate(gpios, on); err != nil {
if err := rgbled.switchColors(gpios, true); err != nil {
return fmt.Errorf("Can not operate with GPIOs: %v", err)
}
return nil
}
func (l *LED) Yellow(on bool) error {
func (rgbled *DefaultRGBLED) Yellow() error {
gpios := []*types.GPIO{
l.BaseColorsToGPIO[types.BaseColorGreen],
l.BaseColorsToGPIO[types.BaseColorRed],
rgbled.BaseColorsToGPIO[types.BaseColorGreen],
rgbled.BaseColorsToGPIO[types.BaseColorRed],
}
if err := l.Off(); err != nil {
if err := rgbled.Off(); err != nil {
return err
}
if err := l.operate(gpios, on); err != nil {
if err := rgbled.switchColors(gpios, true); err != nil {
return fmt.Errorf("Can not operate with GPIOs: %v", err)
}
return nil
}
func (l *LED) operate(gpios []*types.GPIO, on bool) error {
func (rgbled *DefaultRGBLED) Error() error {
return rgbled.switchColorBasedOnAction(rgbled.ActionMapping[types.LEDActionError])
}
func (rgbled *DefaultRGBLED) Logfile() error {
return rgbled.switchColorBasedOnAction(rgbled.ActionMapping[types.LEDActionLogfile])
}
func (rgbled *DefaultRGBLED) Sync() error {
return rgbled.switchColorBasedOnAction(rgbled.ActionMapping[types.LEDActionSync])
}
func (rgbled *DefaultRGBLED) Warn() error {
return rgbled.switchColorBasedOnAction(rgbled.ActionMapping[types.LEDActionWarn])
}
func (rgbled *DefaultRGBLED) Run() error {
return rgbled.switchColorBasedOnAction(rgbled.ActionMapping[types.LEDActionRun])
}
func (rgbled *DefaultRGBLED) switchColors(gpios []*types.GPIO, on bool) error {
if err := rpio.Open(); err != nil {
return fmt.Errorf("Cam not open rpio connection: %v", err)
}
@ -167,3 +191,26 @@ func (l *LED) operate(gpios []*types.GPIO, on bool) error {
}
return nil
}
func (rgbled *DefaultRGBLED) switchColorBasedOnAction(action types.LEDColor) error {
switch action {
case types.LEDColorBlue:
return rgbled.Blue()
case types.LEDColorGreen:
return rgbled.Green()
case types.LEDColorNone:
return rgbled.Off()
case types.LEDColorPurple:
return rgbled.Purple()
case types.LEDColorRed:
return rgbled.Red()
case types.LEDColorTurquoise:
return rgbled.Turquoise()
case types.LEDColorWhite:
return rgbled.White()
case types.LEDColorYellow:
return rgbled.Yellow()
default:
return rgbled.Off()
}
}

View File

@ -11,7 +11,7 @@ import (
// Blue makes all RGB-LEDs which are passed as parameters light up blue.
func Blue(rgbLEDs []RGBLED) error {
color := types.LEDColorBlue
if err := operate(rgbLEDs, true, color); err != nil {
if err := operate(rgbLEDs, color); err != nil {
return err
}
return nil
@ -20,7 +20,7 @@ func Blue(rgbLEDs []RGBLED) error {
// CustomColor makes all RGB-LEDs which are passed as parameters light up in
// custom color.
func CustomColor(rgbLEDs []RGBLED, color types.LEDColor) error {
if err := operate(rgbLEDs, true, color); err != nil {
if err := operate(rgbLEDs, color); err != nil {
return err
}
return nil
@ -29,7 +29,7 @@ func CustomColor(rgbLEDs []RGBLED, color types.LEDColor) error {
// Green makes all RGB-LEDs which are passed as parameters light up in green.
func Green(rgbLEDs []RGBLED) error {
color := types.LEDColorGreen
if err := operate(rgbLEDs, true, color); err != nil {
if err := operate(rgbLEDs, color); err != nil {
return err
}
return nil
@ -38,7 +38,7 @@ func Green(rgbLEDs []RGBLED) error {
// Off turns all RGB-LEDs which are passes as parameters off.
func Off(rgbLEDs []RGBLED) error {
color := types.LEDColorNone
if err := operate(rgbLEDs, false, color); err != nil {
if err := operate(rgbLEDs, color); err != nil {
return err
}
return nil
@ -47,7 +47,7 @@ func Off(rgbLEDs []RGBLED) error {
// Purple makes all RGB-LEDs which are passed as parameters light up in purple.
func Purple(rgbLEDs []RGBLED) error {
color := types.LEDColorPurple
if err := operate(rgbLEDs, true, color); err != nil {
if err := operate(rgbLEDs, color); err != nil {
return err
}
return nil
@ -56,7 +56,7 @@ func Purple(rgbLEDs []RGBLED) error {
// Red makes all RGB-LEDs which are passed as parameters light up in red.
func Red(rgbLEDs []RGBLED) error {
color := types.LEDColorRed
if err := operate(rgbLEDs, true, color); err != nil {
if err := operate(rgbLEDs, color); err != nil {
return err
}
return nil
@ -66,7 +66,7 @@ func Red(rgbLEDs []RGBLED) error {
// turquoise.
func Turquoise(rgbLEDs []RGBLED) error {
color := types.LEDColorTurquoise
if err := operate(rgbLEDs, true, color); err != nil {
if err := operate(rgbLEDs, color); err != nil {
return err
}
return nil
@ -75,7 +75,7 @@ func Turquoise(rgbLEDs []RGBLED) error {
// White makes all RGB-LEDs which are passed as parameters light up in white.
func White(rgbLEDs []RGBLED) error {
color := types.LEDColorWhite
if err := operate(rgbLEDs, true, color); err != nil {
if err := operate(rgbLEDs, color); err != nil {
return err
}
return nil
@ -84,13 +84,13 @@ func White(rgbLEDs []RGBLED) error {
// Yellow makes all RGB-LEDs which are passed as parameters light up in yellow.
func Yellow(rgbLEDs []RGBLED) error {
color := types.LEDColorYellow
if err := operate(rgbLEDs, true, color); err != nil {
if err := operate(rgbLEDs, color); err != nil {
return err
}
return nil
}
func operate(rgbLEDs []RGBLED, on bool, color types.LEDColor) error {
func operate(rgbLEDs []RGBLED, color types.LEDColor) error {
errorChannel := make(chan error, len(rgbLEDs))
@ -98,28 +98,28 @@ func operate(rgbLEDs []RGBLED, on bool, color types.LEDColor) error {
wg.Add(len(rgbLEDs))
for _, rgbLED := range rgbLEDs {
go func(rgbLED RGBLED, color types.LEDColor, on bool, errorChannel chan<- error, wg *sync.WaitGroup) {
go func(rgbLED RGBLED, color types.LEDColor, errorChannel chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
var err error
switch color {
case types.LEDColorBlue:
err = rgbLED.Blue(on)
err = rgbLED.Blue()
case types.LEDColorGreen:
err = rgbLED.Green(on)
err = rgbLED.Green()
case types.LEDColorPurple:
err = rgbLED.Purple(on)
err = rgbLED.Purple()
case types.LEDColorNone:
err = rgbLED.Off()
case types.LEDColorRed:
err = rgbLED.Red(on)
err = rgbLED.Red()
case types.LEDColorTurquoise:
err = rgbLED.Turquoise(on)
err = rgbLED.Turquoise()
case types.LEDColorWhite:
err = rgbLED.White(on)
err = rgbLED.White()
case types.LEDColorYellow:
err = rgbLED.Yellow(on)
err = rgbLED.Yellow()
default:
err = rgbLED.Off()
}
@ -127,7 +127,132 @@ func operate(rgbLEDs []RGBLED, on bool, color types.LEDColor) error {
if err != nil {
errorChannel <- err
}
}(rgbLED, color, on, errorChannel, wg)
}(rgbLED, color, errorChannel, wg)
}
wg.Wait()
errors := collect.Errors(errorChannel)
if len(errors) > 0 {
return prittyprint.FormatErrors(errors)
}
return nil
}
func Error(rgbLEDs []RGBLED) error {
errorChannel := make(chan error, len(rgbLEDs))
wg := new(sync.WaitGroup)
wg.Add(len(rgbLEDs))
for _, rgbLED := range rgbLEDs {
go func(rgbLED RGBLED, errorChannel chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
err := rgbLED.Error()
if err != nil {
errorChannel <- err
}
}(rgbLED, errorChannel, wg)
}
wg.Wait()
errors := collect.Errors(errorChannel)
if len(errors) > 0 {
return prittyprint.FormatErrors(errors)
}
return nil
}
func Logfile(rgbLEDs []RGBLED) error {
errorChannel := make(chan error, len(rgbLEDs))
wg := new(sync.WaitGroup)
wg.Add(len(rgbLEDs))
for _, rgbLED := range rgbLEDs {
go func(rgbLED RGBLED, errorChannel chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
err := rgbLED.Logfile()
if err != nil {
errorChannel <- err
}
}(rgbLED, errorChannel, wg)
}
wg.Wait()
errors := collect.Errors(errorChannel)
if len(errors) > 0 {
return prittyprint.FormatErrors(errors)
}
return nil
}
func Run(rgbLEDs []RGBLED) error {
errorChannel := make(chan error, len(rgbLEDs))
wg := new(sync.WaitGroup)
wg.Add(len(rgbLEDs))
for _, rgbLED := range rgbLEDs {
go func(rgbLED RGBLED, errorChannel chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
err := rgbLED.Run()
if err != nil {
errorChannel <- err
}
}(rgbLED, errorChannel, wg)
}
wg.Wait()
errors := collect.Errors(errorChannel)
if len(errors) > 0 {
return prittyprint.FormatErrors(errors)
}
return nil
}
func Sync(rgbLEDs []RGBLED) error {
errorChannel := make(chan error, len(rgbLEDs))
wg := new(sync.WaitGroup)
wg.Add(len(rgbLEDs))
for _, rgbLED := range rgbLEDs {
go func(rgbLED RGBLED, errorChannel chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
err := rgbLED.Sync()
if err != nil {
errorChannel <- err
}
}(rgbLED, errorChannel, wg)
}
wg.Wait()
errors := collect.Errors(errorChannel)
if len(errors) > 0 {
return prittyprint.FormatErrors(errors)
}
return nil
}
func Warn(rgbLEDs []RGBLED) error {
errorChannel := make(chan error, len(rgbLEDs))
wg := new(sync.WaitGroup)
wg.Add(len(rgbLEDs))
for _, rgbLED := range rgbLEDs {
go func(rgbLED RGBLED, errorChannel chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
err := rgbLED.Warn()
if err != nil {
errorChannel <- err
}
}(rgbLED, errorChannel, wg)
}
wg.Wait()