Problem
DDI 512 (GuidanceLineSwathWidth, "the distance between two adjacent guidance lines in a guidance pattern") is not sent to implements today. The tramline branch (#73) sent a hardcoded 6000 mm (// 6000mm for ESPRO; TODO: derive from DDOP geometry), which is wrong for any other implement, so #84 (guidance track data) deliberately leaves it out. Implements that use it for tramline calculations have no swath width from us.
Where the value should come from
Swath width is the spacing between adjacent guidance lines, which is AgOpenGPS's own concept, so the source should be AgOpenGPS rather than something guessed from the implement. It can also differ from the implement's own working width (a tramline pattern can be spaced for a different, wider machine).
AOG currently doesn't send it: the PGN 0xF4 payload (see docs/PROTOCOL.md §2.5) carries only the sequence, flags, reference line ID and the current/left/right track numbers. So this needs an AOG-side change first (an extra field on 0xF4 or a separate PGN) — worth checking what AOG already exposes before designing it. AgOpenGPS#1218 is the AOG side of the tram work linked from #73.
Why not derive it from the DDOP
Working width detection from the DDOP is unreliable today (#21): implements that report their geometry as Device Process Data rather than static Device Properties have 0 in the DDOP, and the values only arrive once the implement reports them. The tramline branch had a fallback that used the live-reported working width (ClientState::try_get_reported_working_width; it is in the backup/tramline-pre-split-20260919 tag) and it was left out of the split PRs. That may still be useful as a fallback, or for other consumers of the implement width, but it isn't a substitute for the guidance line spacing.
To do
Related: #73, #84, #21.
Problem
DDI 512 (
GuidanceLineSwathWidth, "the distance between two adjacent guidance lines in a guidance pattern") is not sent to implements today. The tramline branch (#73) sent a hardcoded6000mm (// 6000mm for ESPRO; TODO: derive from DDOP geometry), which is wrong for any other implement, so #84 (guidance track data) deliberately leaves it out. Implements that use it for tramline calculations have no swath width from us.Where the value should come from
Swath width is the spacing between adjacent guidance lines, which is AgOpenGPS's own concept, so the source should be AgOpenGPS rather than something guessed from the implement. It can also differ from the implement's own working width (a tramline pattern can be spaced for a different, wider machine).
AOG currently doesn't send it: the PGN
0xF4payload (seedocs/PROTOCOL.md§2.5) carries only the sequence, flags, reference line ID and the current/left/right track numbers. So this needs an AOG-side change first (an extra field on0xF4or a separate PGN) — worth checking what AOG already exposes before designing it. AgOpenGPS#1218 is the AOG side of the tram work linked from #73.Why not derive it from the DDOP
Working width detection from the DDOP is unreliable today (#21): implements that report their geometry as Device Process Data rather than static Device Properties have
0in the DDOP, and the values only arrive once the implement reports them. The tramline branch had a fallback that used the live-reported working width (ClientState::try_get_reported_working_width; it is in thebackup/tramline-pre-split-20260919tag) and it was left out of the split PRs. That may still be useful as a fallback, or for other consumers of the implement width, but it isn't a substitute for the guidance line spacing.To do
docs/PROTOCOL.md§2.5.MyTCServer::send_guidance_track_datawhile a track is valid, and skip it when the value is0or unknown. Add DDI 512 tois_guidance_data_ddiintask_controller.cppso it gets mapped.docs/PROTOCOL.md§5.4.1 and the readme's guidance list.Related: #73, #84, #21.