# TRANSLAND (SATLOC) BINARY AIR LOG FILE FORMATS **Version:** 3.76 • **Document title in PDF:** *AIRSTAR DATABASE DESIGN* **Author:** Gary J. Bivin **Pages:** 29 **Date:** March 15, 2023 > **Proprietary Notice** — The original PDF marks the content as *Company Proprietary* and not to be shared outside Transland without permission. This Markdown is a faithful conversion meant for internal/reference use. **Company Address:** 1206 Hatton Rd Suite A, Wichita Falls, TX. 76302 --- ## Revision History | Version | Date | Comments | | --- | --- | --- | | 3.34 | 4 Apr 2001 | Added Packet Type 2 (Position Compressed) – OUTBACK applications | | 3.35 | 4 May 2001 | Added Marker Type table, new type for RETURN mark. | | 3.40 | 1 Apr 2004 | Added Total Boundary Area record. | | 3.41 | 17 May 2004 | Added Flow Rates record (#32). | | 3.42 | 7 June 2004 | Added Prescription Map Name record (#141). | | 3.43 | 24 Aug 2004 | Expansion of time stamp format (extended year field); Changes to System Calibration record (#102). | | 3.44 | 21 Jan 2005 | Added Spray Edges record (#35). | | 3.45 | 18 Mar 2005 | Added Job Info record (#151); Changes to System Calibration record (#102). | | 3.46 | 19 Nov 2007 | Pivot structure 80, marker fixed at 17 bytes for Field Notes applications. | | 3.47 | 11 Dec 2007 | Editable mark, packet 60, marker 31. | | 3.48 | 5 Mar 2008 | 131, 132 mark type in record 60; Start/End Mark; Change of RHS to Outback; Change of SATLOC to Hemisphere GPS. | | 3.49 | 14 Sept 2008 | Added Job Notes Extended; Added Record 61: Marker Unicode Extension; Added Records 206–207: Job Info Unicode Extensions. | | 3.50 | 29 Aug 2010 | Merge Air + Ground AG forks; update revision number; rearranged record definitions; add GPS Status (extended); clarify Timestamp and Spray Edges. | | 3.51 | 28 Sept 2010 | Add Job Spatial Extent record (#208). | | 3.52 | 6 Oct 2010 | Rename Spatial Extent → Job Filter (#208). | | 3.53 | 19 Oct 2010 | Define Section Geometry record (#36); define Target & Actual Application rates (#34, #38). | | 3.54 | 27 Jan 2011 | Fix GPS Status Extended (#11). | | 3.55 | 18 Mar 2011 | Add Section Bitmask record. | | 3.56 | 18 May 2011 | Revise Section Geometry (#38). | | 3.57 | 22 Aug 2011 | Added Record #43: (Air) AgDisp drift modeling status. | | 3.58 | 28 Jan 2013 | Added Record #45: (Air) TACH data. | | 3.60 | 11 June 2013 | New simplified document for Air; Added Long 01 Record. | | 3.61 | 01 Aug 2014 | Reduced doc referring to Record #43. | | 3.62 | 25 Nov 2015 | New simplified document; Added: IF2 DRY Recorded #38; SBC CPU Temp #56. | | 3.64 | 21 Jun 2017 | Updated “Swathing Setup“ record #120 (Pattern index). | | 3.65 | 05 Nov 2018 | Added IF2 Liquid BOOM Pressures Pri/Dual (#47). | | 3.66 | 07 Mar 2019 | Added Micronair RPM project (#52 Micro‑RPM). | | 3.67 | 26 Jul 2019 | Added 1‑byte bit fields at end Enhanced 01 POS record (pump, polygon, constant/VR, auto boom). | | 3.68 | 21 Feb 2020; mod 19 Jun 2020 | New LOG Record 57 Meterate; later changed Tach RPM per E‑Speed to uint16_t. | | 3.69 | 03 May 2020 | New LOG Record 142 BOOM sections selected in meters; MAN/AUTO, 1–5 sections. | | 3.70 | 21 May 2020 | Added 3 BYTES to end of record 10 (GPS Status) for AIMMS IMU data. | | 3.71 | 20 Oct 2020 | Added 2 bytes to end of Enhanced 01 POS for turbine STDev (Primary/Dual). | | 3.72 | 05 Mar 2021 | Added 3 floats (fVNorth, fVEast, fVUp) to Enhanced 01 POS. | | 3.73 | 26 Apr 2022 | Modified record 142 BOOM Sections for new controller. | | 3.74 | 14 Oct 2022 | Modified record 1 Position Enhanced Record. | | 3.75 | 18 Oct 2022 | Modified record 46 Controller TYPE by Name. | | 3.76 | 15 Mar 2023 | Added TLEG record 39. | --- ## 1. Overall Log File Format A log file begins with the ASCII characters **"AS"**, followed by the ASCII IntelliTrac (IT) Version Number, terminated by a zero (0) byte. The binary data records then follow. - Position records are logged periodically, as specified by **Logging Interval** and **Log Minimum Speed** in IntelliTrac setup. - The System Setup record(s) are written at the beginning of the log file; thereafter only when changed. - Other log records are written out only when the information they contain is first known, or has been changed. ### 1.1 Replay Procedures The file is scanned for the next Record Start Flag; the record is validated with the Checksum and correspondence between record type and length. For reverse compatibility, unrecognized records should be skipped with no further action. --- ## 2. General Record Format | Field Type | Bytes | Format | Units | | --- | --- | --- | --- | | Record Start Flag | 1 | uint8_t | 0xA5 | | Record Length | 1 | uint8_t | # of bytes | | Record Type | 1 | uint8_t | | | Record Checksum | 1 | uint8_t | | | Data | variable | | | The Record Checksum is the XOR of all bytes from the Record Start Flag to the end of the data inclusive. Total length of a record is the length of the data + 4 bytes, as shown above. Note that the maximum length of a record, including the 4 header bytes, is 255. Data is logged in metric units whenever applicable. ### 2.1 Time Stamp A Time Stamp field consists of 5 bytes: | Component | Bits | Byte Position | Description | | --- | --- | --- | --- | | Second | 6 | 0 (bits 0-5) | Seconds (0-59) | | Minute | 6 | 0-1 (bits 6-11) | Minutes (0-59) | | Hour | 5 | 1 (bits 12-16) | Hours (0-23) | | Day | 5 | 2 (bits 17-21) | Day of month (1-31) | | Month | 4 | 2-3 (bits 22-25) | Month (1-12) | | Year | 7 | 3 (bits 26-32) | Years since 2000 | **Note:** Time is logged in local time (not UTC). Consequently, if UTC or similar timestamps are required, then such conversions are left to the application --- ## 3. Record Types ### 3.1 Position Short Record | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | `43` (0x2B) | | Record Type | 1 | `uint8_t` | `1` | | Record Checksum | 1 | `uint8_t` | — | | Time of Position | 5 | Time Stamp | — | | Latitude | 8 | `double` | degrees | | Longitude | 8 | `double` | degrees | | Altitude | 4 | `float` | meters | | Speed | 4 | `float` | m/sec | | Track | 4 | `float` | degrees | | X‑Track Deviation | 4 | `float` | meters | | Differential Age | 1 | `uint8_t` | seconds | | Flags (numeric) | 1 | `uint8_t` | see **Flags** below | **Total Length:** 43 **Flags (final byte, by numeric value)** | Value | Meaning | |---:|---| | 0 | Spray **OFF** (boom pressure sensor **OPEN**) | | 1 | Not used | | 2 | Spray **ON** (interpolated position) | --- ### 3.2 Position Enhanced Record (Position/Flow Rate/Boom/Valve Position) | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | **Current** `78` (0x4E); *earlier* `66` (0x42) | | Record Type | 1 | `uint8_t` | `1` | | Record Checksum | 1 | `uint8_t` | — | | Time of Position | 5 | Time Stamp | — | | Latitude | 8 | `double` | degrees | | Longitude | 8 | `double` | degrees | | Altitude | 4 | `float` | meters | | Speed | 4 | `float` | m/sec | | Track | 4 | `float` | degrees | | X‑Track Deviation | 4 | `float` | meters | | Differential Age | 1 | `uint8_t` | seconds | | Flags (numeric) | 1 | `uint8_t` | see record‑specific flags | | Record Type (numeric) | 1 | `uint8_t` | `1` = Enhanced; `2` = Enhanced/LPC boom on | | Boom Control Status | 1 | `uint8_t` | bit0 = boom On/Off | | Target Flow Rate | 4 | `float` | L/ha | | Target Flow Rate | 4 | `float` | L/min | | Flow Rate | 4 | `float` | L/ha | | Flow Rate | 4 | `float` | L/min | | Valve Position | 2 | `int` | Shaft Position | | **Status bit fields** | 1 | `uint8_t` | **Byte 64**; see table below | | Primary Flow Turbine STDev | 1 | `uint8_t` | 0–255% | | Dual Flow Turbine STDev | 1 | `uint8_t` | 0–255% | | Raw GPS velocity fVNorth | 4 | `float` | Raw GPS fVNorth | | Raw GPS velocity fVEast | 4 | `float` | Raw GPS fVEast | | Raw GPS velocity fVUp | 4 | `float` | Raw GPS fVUp | **Total Length:** 78 **Byte 64 — Status Bit Fields** | Bits | Flags | |---|---| | Byte 64 | 0: Aircraft pump **free to run** (aircraft is applying product) | | Byte 64 | 1: Inside a **JOB or PMap polygon** | | Byte 64 | 2: **Constant Rate Poly** or **VR Rate** set | | Byte 64 | 3: **AUTO‑BOOM** set to ON | **Notes** 1) To identify Short vs Enhanced Position record, read byte **Record Type**. 2) When **Position Enhanced** is logged, the following will **not** be logged: **Flow Target Rate** (Type 32) and **Flow Rate** (Type 30). --- ### 3.3 GPS | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `10` | | Record Checksum | 1 | `uint8_t` | — | | GDOP | 4 | `float` | — | | Satellites | 1 | `uint8_t` | `# tracked << 4` + `# used` | | Received DGPS Stn ID | 2 | `int` | — | | AIMMS NAV Source | 1 | `uint8_t` | `0 = IMU`, `1 = GPS` | | AIMMS SV in GPS Solution | 1 | `uint8_t` | — | | AIMMS GPS POS‑Type | 1 | `uint8_t` | `16 = SPS`, `18 = WAAS`, `19 = Extrapolated`, `0 = None` | **Total Length:** 14 --- ### 3.4 GPS Status Extended > *Not used at this time (May/2020).* | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `11` | | Record Checksum | 1 | `uint8_t` | — | | BIN1 NavMode | 2 | `uint16_t` | — | | Age Of Differential | 2 | `uint16_t` | — | | Reserved | 4 | `uint32_t` | — | | Reserved | 4 | `uint32_t` | — | | GDOP | 4 | `float` | — | | HDOP | 4 | `float` | — | | Satellites | 1 | `uint8_t` | `# tracked << 4` + `# used` | | Received DGPS Stn ID | 2 | `uint16_t` | — | **Total Length:** 27 --- ### 3.5 Swath Number | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `20` | | Record Checksum | 1 | `uint8_t` | — | | Swath Number | 2 | `int` | — | **Total Length:** 6 **Note:** A‑B swath number = 1; swaths are 2,3,4… right; −2,−3,−4… left. --- ### 3.6 Flow Monitor/Control | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `30` | | Record Checksum | 1 | `uint8_t` | — | | Flow Rate | 4 | `float` | liters/minute | | Valve Position | 2 | `int` | Position | **Total Length:** 10 **Output conditions:** only if flow monitoring is active, and only on change. **Compatibility:** Valve Position may be absent in legacy logs — support both **8‑byte** and **10‑byte** variants (default to zero if missing). --- ### 3.7 Dual Flow Monitor/Control | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `31` | | Record Checksum | 1 | `uint8_t` | — | | Primary Flow Rate | 4 | `float` | liters/minute | | Secondary Flow Rate | 4 | `float` | liters/minute | | Primary Valve Position | 2 | `int` | Position | | Secondary Valve Position | 2 | `int` | Position | **Total Length:** 16 **Note:** *Deprecated — do not use in new software.* --- ### 3.8 Target Application Rates | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `32` (0x20) | | Record Checksum | 1 | `uint8_t` | — | | Target Application Rate | 4 | `float` | Target Rate LPM | | Flags | 1 | `uint8_t` | BOOM `0=Off, 1=On (Flow)` | **Total Length:** 9 --- ### 3.9 Dual Flow Target Rates (Version 3.46) | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `33` | | Record Checksum | 1 | `uint8_t` | — | | Chan 1: Primary Target Flow Rate | 4 | `float` | Primary liters/minute | | Chan 1: Primary Control Status | 1 | `uint8_t` | bit0 = Primary boom on/off | | Chan 1: Secondary Target Flow Rate | 4 | `float` | Secondary liters/minute | | Chan 1: Secondary Control Status | 1 | `uint8_t` | bit0 = Secondary boom on/off | | …repeat for each configured channel… | — | — | — | — | **Total Length:** `4 + 10 × number_of_channels` --- ### 3.10 Applied Rates | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `36` | | Record Checksum | 1 | `uint8_t` | — | | Number of channels | 1 | `uint16_t` | `0..41` | | Channel 1: Actual Application Units | 1 | `uint16_t` | see table (units id) | | Channel 1: Actual Application Rate | 4 | `float` | — | | …repeat per channel… | — | — | — | — | **Total Length:** `6 + 6 × number_of_channels` --- ### 3.11 Fire/Dry Gate Status (Version 3.47) | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `37` | | Record Checksum | 1 | `uint8_t` | — | | Application MODE | 1 | `uint8_t` | Mode 1–7 | | Units | 1 | `char` | `E` (English) \ | | Applied Resolution | 1 | `uint8_t` | 0 = 1/16”, 1 = 1 mm, 2 = 1/32” | | Active Levels | 1 | `uint8_t` | 1–7 levels | | Logged Target Spread | 4 | `float` | *(Not used)* Kg/min | | Applied Spread Rate | 4 | `float` | Kg/Ha | | Applied Spread per min | 4 | `float` | Kg/min *(Not used)* | | Applied Gate Level* | 2 | `int` | resolution units | | Encoder Position | 2 | `int` | 1–2048 | | Target Encoder Position | 2 | `int` | 1–2048 | | GPS Trim | 2 | `int` | steps ± 1 to n | | Manual Trim | 2 | `int` | steps ± 1 to n | **Total Length:** 30 \* **Gate Level** = numeric level × **Applied Resolution** (read resolution first). Example: resolution 1/16", value 12 → 12/16" = ¾". --- ### 3.12 IF2 Dry Gate (Version 3.63) #### Part A | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `38` (0x26) `"LOGID_IF2DRY"` | | Record Checksum | 1 | `uint8_t` | — | | Application MODE | 1 | `uint8_t` | Mode 2 | | TASK Mode | 1 | `uint8_t` | `0..3` (Local FDG/No PMap = 3) | | Applied Resolution | 1 | `uint8_t` | `0=1/32"`, `1=1/16"` | | Machine State | 1 | `uint8_t` | `0..14` | | Switch State | 1 | `uint8_t` | bit field: bit 0 = ARM On/Off, bit 1 = FUSALAGE On/Off, bit 2 = TRIGGER On/Off, bit 3 = TRIM On/Off | | Gate Status | 1 | `uint8_t` | bit field: bit 0: 0 = Gate Closed, 1 = Gate Open. Gate at index 0 level or beyond; bits 1 and 2: 0 = Dry Gate Fully Closed, completely latched, 1 = Dry Gate Open (This is from Soft Position and beyond), 2 = Dry Gate at Soft Level (Soft closed position (Level) means Gate is 1/16 OPEN or at selected user level) | | Gate SOFT State | 1 | `uint8_t` | `0=Go index 0`, `1=User encoder pos` | | Target Spread Rate | 4 | `float` | Kg/Ha | | Target Spread per min | 4 | `float` | *(Not used)* Kg/min | | Applied Spread Rate | 4 | `float` | Kg/Ha | | Applied Spread per min | 4 | `float` | *(Not used)* Kg/min | | GPS TRIM | 2 | `int` | ± GPS Trimmed Speed Up/Down | | Manual TRIM | 2 | `int` | ± Manually Trimmed Up/Down | #### Part B | Field Type | Bytes | Format | Units | |---|---|---|---| | Misc States | 2 | `uint16_t` | bit field: bit 0: 0 = "Encoder Stationary", 1 = "Encoder Moved"; bit 1: 0 = "Encoder Error", 1 = "Encoder OK"; bit 2: 0 = Hydro Pump State OFF, 1 = Hydro Pump State ON; bit 3: 0 = Hydro OPEN Solenoid OFF, 1 = Hydro OPEN Solenoid ON; bit 4: 0 = Hydro CLOSE Solenoid OFF, 1 = Hydro CLOSE Solenoid ON | | Gate Level Steps | 2 | `uint16_t` | `0..272` in 1/32" | | Encoder Position | 2 | `uint16_t` | absolute `0..10,000` | | Cumulative Uptime CPU | 2 | `uint16_t` | hours | | SOFT Level Target | 2 | `uint16_t` | `12..2000` | | PGT P Gain | 2 | `uint16_t` | `0..65535` | | PGT G Gain | 2 | `uint16_t` | `0..8000` | | PGT Tolerance | 2 | `uint16_t` | `0..65535` | **Total Length:** 47 --- ### 3.13 TLEG Dry Gate (Version 3.76) #### Part A | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `39` (0x27) `"LOGID_TLEGDRY"` | | Record Checksum | 1 | `uint8_t` | — | | Application OP Mode | 1 | `uint8_t` | OFF = 0x00, Open GATE = 0x01, Close GATE = 0x02, Open GATE With Torque Override = 0x03, Close GATE With Torque Override = 0x04, Manual Assist Mode = 0x05, Hold Position = 0x06, Calibrations = 0x07, Override Recovery = 0x08 | | TASK Mode | 1 | `uint8_t` | `0`=Single/Profiles, `1`=Levels/FDG | | Applied Resolution | 1 | `uint8_t` | `0=1/32"`, `1=1/16"` | | Machine State | 1 | `uint8_t` | 0 to 15 enumerated: TLEG_STATE_INIT "INIT", TLEG_STATE_MESSAGE_WAITING "MESSAGE_WAIT", TLEG_STATE_READY "READY", TLEG_FREE_MOVEMENT "FREE", TLEG_ACTIVE_MOVEMENT "ACTIVE", TLEG_DUMMY_1 "Dummy_1", TLEG_DUMMY_2 "Dummy_2", TLEG_DUMMY_3 "Dummy_3", TLEG_DUMMY_4 "Dummy_4", TLEG_DUMMY_5 "Dummy_5", TLEG_STATE_NOT_ARMED "NOT ARMED", TLEG_STATE_SECURITY_OVERRIDE "NOW FREE", TLEG_STATE_BAD_CAL "BAD CAL", TLEG_STATE_JAM_DETECTED "JAM_DETECTED", TLEG_STATE_UNKNOWN "STATE UNKNOWN" | | Switch State | 1 | `uint8_t` | bit field: bit 0 = ARM On/Off, bit 1 = TRIGGER On/Off, bit 2 = FUSELAGE On/Off, bit 3 = MOTOR On/Off, bit 4 = Spray ON On/Off, bit 5 = GATE Moving Yes/No, bit 6 = Encoder Status OK/Error | #### Part B | Field Type | Bytes | Format | Units | |---|---|---|---| | Gate State | 1 | `uint8_t` | bit field: bit 0 Gate Closed State: 0 = Latched, 1 = Soft; bit 1 Gate Open: 0 = Closed, 1 = Gate at 1/16" (Soft) or beyond; bit 2 Not used; bit 3 Not used; bit 4 GATE JAM: 0 = No JAM, 1 = JAMMED | | USER SELECTED Gate Closed State | 1 | `uint8_t` | `0=Latched`, `1=User SOFT` | | TLEG Internal Temperature | 1 | `uint8_t` | °C (system closes at ~105 °C) | | Target Spread Rate | 4 | `float` | Kg/Ha | | Target Spread per min | 4 | `float` | *(Not used)* Kg/min | | Applied Spread Rate | 4 | `float` | Kg/Ha | | Applied Spread per min | 4 | `float` | *(Not used)* Kg/min | | GPS TRIM | 2 | `short int` | ± GPS Trimmed Speed Up/Down | | Manual TRIM | 2 | `short int` | ± Manually Trimmed Up/Down| | PRE Gate Level Steps | 2 | `uint16_t` | `0..158` in 1/32" (max 4" 15/16") | | Gate Level Steps | 2 | `uint16_t` | `0..158` in 1/32" (max 4" 15/16") | | Encoder Position | 2 | `uint16_t` | Internal TLEG Encoder position 0 to 360 deg×10 (`0.0°..360.0°*10`) | | Cumulative Uptime CPU | 2 | `uint16_t` | Total hours uptime | | LATCHED Target Degrees | 2 | `uint16_t` | 0 to 360 deg×10 | | SOFT Target Degrees | 2 | `uint16_t` | 0 to 360 deg×10 | **Total Length:** 44 --- ### 3.14 Laser Altimeter | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `42` | | Record Checksum | 1 | `uint8_t` | — | | Height AGL | 4 | `float` | Meters | **Total Length:** 8 **Output condition:** only if configured, and only when Δheight > **0.5 m**. --- ### 3.15 AgDisp Data (AGD) | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `43` (0x2B) | | Record Checksum | 1 | `uint8_t` | — | | Wind Offset Direction | 4 | `float` | degrees | | Applied OFFSET | 4 | `float` | Meters | **Total Length:** 12 --- ### 3.16 TACH Times | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `byte` | `0xA5` | | Record Length | 1 | `byte` | # of bytes | | Record Type | 1 | `byte` | `45` (0x2D) | | Record Checksum | 1 | `byte` | — | | Total TACH Current Time | 4 | `uint32_t` | Seconds | | Total TACH Total Time | 4 | `uint32_t` | Seconds | **Total Length:** 12 (0x0C) --- ### 3.17 Controller TYPE by Name | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `46` (0x2E) | | Record Checksum | 1 | `uint8_t` | — | | Controller TYPE | 21 | `ASCIIZ` | Controller NAME | **Total Length:** 25 --- ### 3.18 IF2 Liquid BOOM Pressure | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `47` (0x2F) | | Record Checksum | 1 | `uint8_t` | — | | IF2 Liq/Pri Boom Pressure | 4 | `float` | Lbs Pressure | | IF2 Liq/Dual Boom Pressure | 4 | `float` | Lbs Pressure | **Total Length:** 12 --- ### 3.19 Wind | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `50` | | Record Checksum | 1 | `uint8_t` | — | | Wind Direction | 2 | `int` | degrees | | Wind Velocity | 4 | `float` | m/s | **Total Length:** 10 **Output condition:** only if/when wind is calculated. --- ### 3.20 Micro‑RPM (Version 3.66) | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | **25** (0x19) | | Record Type | 1 | `uint8_t` | `52` (0x34) | | Record Checksum | 1 | `uint8_t` | — | | OP Mode | 1 | `uint8_t` | 0 or 1 (On/Off) | | Micro‑Atomiser Left 1..5 | 2×5 | `int` | RPM | | Micro‑Atomiser Right 1..5 | 2×5 | `int` | RPM | **Total Length:** 25 --- ### 3.21 SBC (CPU Temps) (Version 3.63) | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `56` (0x38) | | Record Checksum | 1 | `uint8_t` | — | | CPU Temperature sensor 1 | 4 | `float` | degrees | | CPU Temperature sensor 2 | 4 | `float` | degrees | | CPU Temperature sensor 3 | 4 | `float` | degrees | | CPU Temperature sensor 4 | 4 | `float` | degrees | **Total Length:** 20 --- ### 3.22 Meterate (Version 3.68) | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `57` (0x39) | | Record Checksum | 1 | `uint8_t` | — | | Auto/Manual | 1 | `uint8_t` | Auto or Manual state | | Base Speed | 1 | `uint8_t` | MPH | | Every Speed | 2 | `uint16_t` | MPH ×100 | | Control Voltage | 2 | `uint16_t` | Vdc ×100 | | Tach RPM | 2 | `uint16_t` | RPM | | Steps E‑Speed | 1 | `uint8_t` | RPM steps per E‑Speed | | Target Spread Rate | 2 | `uint16_t` | Kg/Ha ×100 | | Target Spread Per Min | 4 | `uint32_t` | Kg/min ×1000 | | Applied Spread Rate | 2 | `uint16_t` | Kg/Ha ×100 | | Applied Spread Per Min | 4 | `uint32_t` | Kg/min ×1000 | **Total Length:** 25 --- ### 3.23 Marker | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `60` | | Record Checksum | 1 | `uint8_t` | — | | Marker Type | 1 | `uint8_t` | — | | Latitude | 8 | `double` | degrees | | Longitude | 8 | `double` | degrees | | Altitude | 4 | `float` | meters | | Label Length | 1 | `uint8_t` | # of bytes | | Label String | | `ASCIIZ` bytes | | **Total Length:** `26 + label` *A Label Length of 0 is valid (no label text).* --- ### 3.24 Marker — Unicode | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `61` | | Record Checksum | 1 | `uint8_t` | — | | Marker Type | 1 | `uint8_t` | — | | Latitude | 8 | `double` | degrees | | Longitude | 8 | `double` | degrees | | Altitude | 4 | `float` | meters | | Label Length | 1 | `uint8_t` | # of bytes | | Label String | | `Unicode` string with zero word termination | | **Total Length:** `26 + label` --- ### 3.25 System Setup | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `100` (0x64) | | Record Checksum | 1 | `uint8_t` | — | | Time | 5 | Time Stamp | — | | Pilot Name | 11 | `ASCIIZ` | — | | Aircraft ID | 11 | `ASCIIZ` | — | | Logging Interval | 1 | `uint8_t` | seconds ×10 | | Logging Min Speed | 4 | `float` | m/s | | GPS Mask Angle | 1 | `uint8_t` | degrees | | GMT Offset | 2 | `int` | minutes | | Compass Variation | 4 | `float` | degrees | **Total Length:** 43 --- ### 3.26 Environmental | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `110` | | Record Checksum | 1 | `uint8_t` | — | | Temperature | 4 | `float` | degrees | | Relative Humidity | 1 | `uint8_t` | % humidity | | Barometric Pressure | 4 | `float` | kPsc | **Total Length:** 13 --- ### 3.27 Swathing Setup | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `120` | | Record Checksum | 1 | `uint8_t` | — | | Job ID | 11 | `ASCIIZ` | 10 + NULL | | Pattern Type | 1 | `uint8_t` | see **Pattern Types** | | Pattern L/R | 1 | `char` | `'L'` or `'R'` | | Swath Width | 4 | `float` | meters | | Job Long Label Name | 31 | `ASCIIZ` | 30 + NULL | **Total Length:** 21 *or* 52 **Pattern Types** | ID | Name | |---:|---| | 0 | Back_To_Back | | 1 | Racetrack | | 2 | Squeeze | | 3 | Quick_Racetrack | | 4 | Reverse_Racetrack | | 5 | Expand | | 6 | Auto_Lock | | 7 | Back_To_Back_Half_Boom | | 8 | Contour | | 9 | Contour/Headland | | 10 | Area_Measurement | | 11 | Multi_Back_To_Back | | 12 | Back_To_Back_Skip | | 20 | QuickTrac_X | | 21 | Nearest_Swath | --- ### 3.28 Flow Setup | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `140` | | Record Checksum | 1 | `uint8_t` | — | | Flow Control Status | 1 | `uint8_t` | `0=OFF; 1=Control ON; 2=Monitor Only; +0x40 Variable else Constant; +0x80 DRY else WET` | | Total Spray Liters | 4 | `float` | Liters | | Valve Calibration | 2 | `int` | — | | Meter Calibration | 4 | `float` | counts/liter | | Application Per Area | 4 | `float` | L/hectare | | Application Rate | 4 | `float` | L/min | **Total Length:** 23 **Output:** when System Options written and on change. --- ### 3.29 Boom Sections *(Not fully tested, 15 Mar 2023)* | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `142` (0xE8) | | Record Checksum | 1 | `uint8_t` | — | | Boom State | 1 | `uint8_t` | `0=Manual, 1=Automatic` | | Boom Sections | 1 | `uint8_t` | `1, 3, 4, or 5` | | Boom Valve States | 1 | `uint8_t` | bit field: 2 or 3 valve states O/C | | Far LEFT Section | 4 | `uint32_t` | meters ×1000 m | | LEFT/CENTER Section | 4 | `uint32_t` | meters ×1000 m | | LEFT Section | 4 | `uint32_t` | meters ×1000 m | | CENTER Section | 4 | `uint32_t` | meters ×1000 m | | RIGHT Section | 4 | `uint32_t` | meters ×1000 m | | Far RIGHT Section | 4 | `uint32_t` | meters ×1000 m | **Total Length:** 31 **Notes** 1) If `Boom Sections = 3` (legacy L/C/R): use **LEFT**, **CENTER** (may be 0 m), **RIGHT**. 2) Bit fields: - **Boom Valve States** bits 0..4 map to Far Left, Left, Center, Right, Far Right valves. - **Boom Section States** bits 0..5 map to Far Left, Left, Left/Center, Center, Right, Far Right sections. *The PDF includes diagrams showing valve/section layouts.* --- ### 3.30 Job Info String (Note: Used ONLY with Bantam and Bantam2 logs) | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `151` | | Record Checksum | 1 | `uint8_t` | — | | Job ID | 4 | `long` | — | — | | Job Title | 30 | `ASCIIZ` bytes | | | Number of Polygons | 2 | `int` | — | | Number of Patterns | 2 | `int` | — | **Total Length:** `5 + message` **Logged:** when a job is opened, or at log start if a job is already open. --- ### 3.31 Job Info NAME String (Note: Used ONLY with Falcon and G4 logs) | Field Type | Bytes | Format | Units | |---|---|---|---| | Record Start Flag | 1 | `uint8_t` | `0xA5` | | Record Length | 1 | `uint8_t` | # of bytes | | Record Type | 1 | `uint8_t` | `152` | | Record Checksum | 1 | `uint8_t` | — | | Job Version ID | 2 | `int` | — | | Job File Long Name | 32 | `ASCIIZ` | (31 + NULL) | | Number of Polygons | 2 | `int` | — | | Number of Patterns | 2 | `int` | — | **Total Length:** 42 **Logged:** when a job is opened, or at log start if a job is already open. --- ### Appendix — Checksum > Record checksum is the **XOR** of all bytes from **Record Start Flag** through the **end of the data** (inclusive). ## Appendices ### Appendix A: Data Types | Type | Size (bytes) | Description | | --- | --- | --- | | uint8_t | 1 | Unsigned 8-bit integer | | uint16_t | 2 | Unsigned 16-bit integer | | uint32_t | 4 | Unsigned 32-bit integer | | int8_t | 1 | Signed 8-bit integer | | int16_t | 2 | Signed 16-bit integer | | int32_t | 4 | Signed 32-bit integer | | float | 4 | 32-bit floating point | | double | 8 | 64-bit floating point | ### Appendix B: Checksum Calculation The checksum is calculated as the XOR of all bytes in the record, from the Record Start Flag through the end of the data. ```c uint8_t calculate_checksum(uint8_t* record, uint8_t length) { uint8_t checksum = 0; for (int i = 0; i < length; i++) { checksum ^= record[i]; } return checksum; } ``` ### Appendix C: Byte Order All multi-byte numeric values are stored in little-endian format (least significant byte first). ### Appendix D: File Extensions SATLOC log files typically use the following extensions: - `.log` - Standard log files - `.air` - Air application specific logs - `.sat` - SATLOC format logs --- **Document Generation Information:** - Generated from: LOGFileFormat_Air_3_76_converted.md (PDF conversion) - Enhanced with: Transland_SATLOC_Log_File_Formats_v3_76.md (ChatGPT formatting) - Cross-referenced: LOGFileFormat_Air_3_76.md (manual cleanup) - Final validation: 2025-09-05 16:57:22 UTC **End of Document**