diff --git a/dist/roverd b/dist/roverd index 20d6d7cb..3defb316 100755 Binary files a/dist/roverd and b/dist/roverd differ diff --git a/dist/servoverifier b/dist/servoverifier index c73e2442..8ca89fb6 100755 Binary files a/dist/servoverifier and b/dist/servoverifier differ diff --git a/pi/roverd/ir_tx.go b/pi/roverd/ir_tx.go index 5e5f157a..19f5c37d 100644 --- a/pi/roverd/ir_tx.go +++ b/pi/roverd/ir_tx.go @@ -24,6 +24,8 @@ const ( piCmdWaveDelete = 50 piCmdWaveTxSend = 51 piOutput = 1 + pigpioConnectRetries = 20 + pigpioConnectDelay = 250 * time.Millisecond ) type pigpioCmd struct { @@ -102,7 +104,7 @@ func NewIRTransmitter(cfg IRConfig, logger *log.Logger) (*IRTransmitter, error) return nil, fmt.Errorf("ir disabled") } - client, err := newPigpioClient(pigpioAddr) + client, err := connectPigpioWithRetry(pigpioAddr, logger) if err != nil { return nil, fmt.Errorf("connect pigpio: %w", err) } @@ -124,6 +126,22 @@ func NewIRTransmitter(cfg IRConfig, logger *log.Logger) (*IRTransmitter, error) return tx, nil } +func connectPigpioWithRetry(addr string, logger *log.Logger) (*pigpioClient, error) { + var lastErr error + for attempt := 1; attempt <= pigpioConnectRetries; attempt++ { + client, err := newPigpioClient(addr) + if err == nil { + return client, nil + } + lastErr = err + if attempt == 1 || attempt%4 == 0 { + logger.Printf("pigpio connect attempt %d/%d failed: %v", attempt, pigpioConnectRetries, err) + } + time.Sleep(pigpioConnectDelay) + } + return nil, lastErr +} + func (t *IRTransmitter) Close() { t.mu.Lock() defer t.mu.Unlock() diff --git a/pi/systemd/roverd.service b/pi/systemd/roverd.service index 41250ba2..da3f01fa 100644 --- a/pi/systemd/roverd.service +++ b/pi/systemd/roverd.service @@ -1,7 +1,7 @@ [Unit] Description=Multi-Roomba rover control agent -After=network-online.target mediamtx.service -Wants=network-online.target +After=network-online.target mediamtx.service pigpiod.service +Wants=network-online.target pigpiod.service [Service] Type=simple