mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-15 17:12:59 -04:00
ugh
This commit is contained in:
+44
-10
@@ -15,6 +15,8 @@ type CameraServo struct {
|
||||
cfg CameraServoConfig
|
||||
logger *log.Logger
|
||||
pin rpio.Pin
|
||||
pigpio *pigpioClient
|
||||
usePigpio bool
|
||||
mu sync.Mutex
|
||||
currentAngle float64
|
||||
closed bool
|
||||
@@ -24,6 +26,30 @@ func NewCameraServo(cfg CameraServoConfig, logger *log.Logger) (*CameraServo, er
|
||||
if !cfg.Enabled {
|
||||
return nil, fmt.Errorf("camera servo disabled")
|
||||
}
|
||||
|
||||
servo := &CameraServo{
|
||||
cfg: cfg,
|
||||
logger: logger,
|
||||
}
|
||||
|
||||
if client, err := newPigpioClient(defaultPigpioAddr); err == nil {
|
||||
if err := setPigpioMode(client, cfg.Pin, piOutput); err == nil {
|
||||
servo.pigpio = client
|
||||
servo.usePigpio = true
|
||||
} else {
|
||||
_ = client.Close()
|
||||
}
|
||||
}
|
||||
|
||||
if servo.usePigpio {
|
||||
if err := servo.setAngleLocked(cfg.HomeAngle); err != nil {
|
||||
_ = servo.pigpio.Close()
|
||||
return nil, err
|
||||
}
|
||||
logger.Printf("camera servo initialized on GPIO %d (pigpio, %.1f..%.1f deg, %d..%d us, invert=%v)", cfg.Pin, cfg.MinAngle, cfg.MaxAngle, cfg.MinPulseUs, cfg.MaxPulseUs, cfg.Invert)
|
||||
return servo, nil
|
||||
}
|
||||
|
||||
if err := rpio.Open(); err != nil {
|
||||
return nil, fmt.Errorf("open gpio: %w", err)
|
||||
}
|
||||
@@ -32,12 +58,8 @@ func NewCameraServo(cfg CameraServoConfig, logger *log.Logger) (*CameraServo, er
|
||||
pin.Mode(rpio.Pwm)
|
||||
targetClock := cfg.FreqHz * cfg.CycleLen
|
||||
pin.Freq(targetClock)
|
||||
servo.pin = pin
|
||||
|
||||
servo := &CameraServo{
|
||||
cfg: cfg,
|
||||
logger: logger,
|
||||
pin: pin,
|
||||
}
|
||||
if err := servo.setAngleLocked(cfg.HomeAngle); err != nil {
|
||||
rpio.Close()
|
||||
return nil, err
|
||||
@@ -52,8 +74,12 @@ func (s *CameraServo) Close() {
|
||||
if s.closed {
|
||||
return
|
||||
}
|
||||
s.applyPulseLocked(s.angleToPulse(s.cfg.HomeAngle))
|
||||
rpio.Close()
|
||||
_ = s.applyPulseLocked(s.angleToPulse(s.cfg.HomeAngle))
|
||||
if s.usePigpio {
|
||||
_ = s.pigpio.Close()
|
||||
} else {
|
||||
rpio.Close()
|
||||
}
|
||||
s.closed = true
|
||||
}
|
||||
|
||||
@@ -68,7 +94,9 @@ func (s *CameraServo) setAngleLocked(angle float64) error {
|
||||
return fmt.Errorf("servo closed")
|
||||
}
|
||||
clamped := clampFloat(angle, s.cfg.MinAngle, s.cfg.MaxAngle)
|
||||
s.applyPulseLocked(s.angleToPulse(clamped))
|
||||
if err := s.applyPulseLocked(s.angleToPulse(clamped)); err != nil {
|
||||
return err
|
||||
}
|
||||
s.currentAngle = clamped
|
||||
return nil
|
||||
}
|
||||
@@ -95,7 +123,9 @@ func (s *CameraServo) SetPulseWidth(micros int) error {
|
||||
if micros <= 0 {
|
||||
return fmt.Errorf("pulse width must be > 0")
|
||||
}
|
||||
s.applyPulseLocked(micros)
|
||||
if err := s.applyPulseLocked(micros); err != nil {
|
||||
return err
|
||||
}
|
||||
s.currentAngle = s.pulseToAngle(micros)
|
||||
return nil
|
||||
}
|
||||
@@ -106,9 +136,13 @@ func (s *CameraServo) CurrentAngle() float64 {
|
||||
return s.currentAngle
|
||||
}
|
||||
|
||||
func (s *CameraServo) applyPulseLocked(micros int) {
|
||||
func (s *CameraServo) applyPulseLocked(micros int) error {
|
||||
micros = clampInt(micros, s.cfg.MinPulseUs, s.cfg.MaxPulseUs)
|
||||
if s.usePigpio {
|
||||
return setPigpioServo(s.pigpio, s.cfg.Pin, micros)
|
||||
}
|
||||
s.pin.DutyCycle(uint32(micros), uint32(s.cfg.CycleLen))
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *CameraServo) angleToPulse(angle float64) int {
|
||||
|
||||
Reference in New Issue
Block a user