update BRC pulse handling

This commit is contained in:
legop3
2025-11-11 19:48:50 -05:00
parent c89e9cdfd3
commit 3bc2921f25
10 changed files with 49 additions and 41 deletions
+24 -36
View File
@@ -2,36 +2,42 @@ package roverd
import (
"context"
"fmt"
"log"
"os"
"path/filepath"
"strconv"
"time"
gpiocdev "github.com/warthog618/go-gpiocdev"
)
type BRCPulser struct {
cfg BRCConfig
logger *log.Logger
line *gpiocdev.Line
}
func NewBRCPulser(cfg BRCConfig, logger *log.Logger) (*BRCPulser, error) {
if err := exportGPIO(cfg.GPIOPin); err != nil {
return nil, err
chip := cfg.GPIOChip
if chip == "" {
chip = "gpiochip0"
}
if err := writeGPIO(cfg.GPIOPin, "direction", []byte("out\n")); err != nil {
return nil, err
}
if err := writeGPIO(cfg.GPIOPin, "value", []byte("1\n")); err != nil {
line, err := gpiocdev.RequestLine(
chip,
cfg.GPIOPin,
gpiocdev.AsOutput(1),
gpiocdev.WithConsumer("roverd-brc"),
)
if err != nil {
return nil, err
}
return &BRCPulser{cfg: cfg, logger: logger}, nil
return &BRCPulser{cfg: cfg, logger: logger, line: line}, nil
}
func (b *BRCPulser) Close() {
_ = writeGPIO(b.cfg.GPIOPin, "value", []byte("1\n"))
_ = unexportGPIO(b.cfg.GPIOPin)
if b.line != nil {
_ = b.line.SetValue(1)
b.line.Close()
}
}
func (b *BRCPulser) Start(ctx context.Context) {
@@ -51,33 +57,15 @@ func (b *BRCPulser) Start(ctx context.Context) {
}
func (b *BRCPulser) pulseOnce() {
if err := writeGPIO(b.cfg.GPIOPin, "value", []byte("0\n")); err != nil {
if b.line == nil {
return
}
if err := b.line.SetValue(0); err != nil {
b.logger.Printf("brc pulse low: %v", err)
return
}
time.Sleep(b.cfg.PulseWidth.Duration)
if err := writeGPIO(b.cfg.GPIOPin, "value", []byte("1\n")); err != nil {
if err := b.line.SetValue(1); err != nil {
b.logger.Printf("brc pulse high: %v", err)
}
}
func exportGPIO(pin int) error {
err := os.WriteFile("/sys/class/gpio/export", []byte(strconv.Itoa(pin)), 0o644)
if err != nil && !os.IsExist(err) {
return err
}
return nil
}
func unexportGPIO(pin int) error {
err := os.WriteFile("/sys/class/gpio/unexport", []byte(strconv.Itoa(pin)), 0o644)
if err != nil && !os.IsNotExist(err) {
return err
}
return nil
}
func writeGPIO(pin int, field string, data []byte) error {
path := filepath.Join("/sys/class/gpio", fmt.Sprintf("gpio%d", pin), field)
return os.WriteFile(path, data, 0o644)
}