This commit is contained in:
2022-12-30 18:42:48 +01:00
parent 5b25457224
commit 005b167f5e
6 changed files with 155 additions and 42 deletions

View File

@@ -3,32 +3,25 @@ package PinControlService
import (
"errors"
log "github.com/sirupsen/logrus"
"github.com/stianeikeland/go-rpio"
"time"
)
type PinControlService struct {
Pins map[string]Pin
timer* time.Ticker
exit chan bool
Pins map[string]Pin
timer *time.Ticker
exit chan bool
OnChangeCallback PinCallback
OnCycleCallback PinCallback
OnCycleCallback PinCallback
}
func (p*PinControlService) AddPin(
func (p *PinControlService) AddPin(
config PinConfig) {
pin := NewPin(config)
p.Pins[pin.Name] = pin
}
func (p*PinControlService) Command(pinName string, command PinCommand) error {
func (p *PinControlService) Command(pinName string, command PinCommand) error {
if pin, found := p.Pins[pinName]; found == false {
return errors.New("pin not configured")
} else {
@@ -36,25 +29,25 @@ func (p*PinControlService) Command(pinName string, command PinCommand) error {
}
}
func (p*PinControlService) Start() {
if err := rpio.Open(); err != nil {
func (p *PinControlService) Start() {
if err := HardwarePinOpen(); err != nil {
log.Fatal(err)
panic(err)
}
for _,v := range p.Pins {
for _, v := range p.Pins {
v.Configure()
}
go p._task()
}
func (p*PinControlService) Stop() {
func (p *PinControlService) Stop() {
p.exit <- true
}
func (p*PinControlService) _task() {
func (p *PinControlService) _task() {
for {
select {
case <- p.timer.C:
case <-p.timer.C:
for pinName, pin := range p.Pins {
log.Debug("timer event")
if pin.Changed() {
@@ -69,7 +62,7 @@ func (p*PinControlService) _task() {
p.OnCycleCallback(pinName, pin.State())
}
}
case <- p.exit:
case <-p.exit:
log.Debug("stop timer")
p.timer.Stop()
return
@@ -79,11 +72,10 @@ func (p*PinControlService) _task() {
}
func NewPinControl(config *PinControlConfig) (*PinControlService, error) {
p := PinControlService{
Pins: make(map[string]Pin),
exit: make(chan bool,1),
Pins: make(map[string]Pin),
exit: make(chan bool, 1),
timer: time.NewTicker(time.Duration(config.PollingTimeMs) * time.Millisecond)}
for _, pinConfig := range config.GpioPins {
@@ -91,4 +83,4 @@ func NewPinControl(config *PinControlConfig) (*PinControlService, error) {
}
return &p, nil
}
}