Trying to simplify things, I'd removed some parking code which also handled the :GU return in one case (not n or N). The own goto should be updated with that (and unrelated PEC, since the command (:QZ#) used no longer works on newer versions, but that should be good now.)
So:
General cases:
!n !N = SLEWING (tracking, goto) < Case I neglected, since it seems like you wouldn't be tracking while on a goto
n !N = SLEWING (not tracking, goto)
(If also I (Parking n progress) = PARKING)
!n N = TRACKING (tracking, no goto)
n N = IDLE (not tracking, no goto)
Overriden by
P (Parked, also set parked true) PARKED
Related which only give Messages/not change trackstate:
p (sets parked false) (unparked)
F (sets parked false) (parking failed)
I (sets parked false, case handled above) (parking in progress)
H (messages only, combined with p/P)
Someone want to check my logic to make sure I didn't miss anything?