Implement working motor init command using limit-switch homing
Added `motor init [up|down] [timeout]` that homes the altitude axis by
slewing to a mechanical limit. The firmware detects the limit switch and
performs an automatic home to position 0 (optics toward ground).
Validated procedure:
1. Slew up briefly (90° 0.4 for 5s) to move away from the bottom limit
2. `motor init down 40` — slew 270° until bottom limit triggers auto-home
3. Axis remains fully operational after homing
The firmware drops the WebSocket connection when the home sequence starts
(normal behavior). After reconnecting, the axis works normally.
Note: API still returns NEED_RESET (-14520) because absolute positioning
requires astro calibration (plate solving). The mechanical home only
provides physical position 0, not sky coordinates.
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
This commit is contained in:
@ -210,6 +210,18 @@ func (t *Telescope) MotorGetPosition(id int32) (*pb.ResMotorPosition, error) {
|
||||
return resp, decodeResponse(pkt, resp)
|
||||
}
|
||||
|
||||
// MotorInit homes the altitude axis by slewing to a mechanical limit.
|
||||
// The firmware detects the limit switch and resets position automatically.
|
||||
// direction: 90 = up (toward sky), 270 = down (toward ground).
|
||||
// timeoutSec is the maximum time to wait for the limit (typically 30-60s).
|
||||
func (t *Telescope) MotorInit(direction float64, timeoutSec int) error {
|
||||
if err := t.SlewJoystick(direction, 0.5); err != nil {
|
||||
return fmt.Errorf("init slew: %w", err)
|
||||
}
|
||||
time.Sleep(time.Duration(timeoutSec) * time.Second)
|
||||
return t.SlewJoystick(0, 0)
|
||||
}
|
||||
|
||||
// MotorReset resets a motor (finds home via limit switch).
|
||||
// cmd 14003 is inferred. WARNING: causes telescope reboot — but may be
|
||||
// the only way to unblock an axis stuck at a mechanical limit.
|
||||
|
||||
Reference in New Issue
Block a user