diff --git a/.github/workflows/aprs-vectors.yml b/.github/workflows/aprs-vectors.yml new file mode 100644 index 0000000..5d2dac9 --- /dev/null +++ b/.github/workflows/aprs-vectors.yml @@ -0,0 +1,25 @@ +name: APRS vector corpus +on: + push: + branches: [scaffold/aprs-vectors] + pull_request: + paths: + - "packages/aprs/**" + - ".github/workflows/aprs-vectors.yml" +jobs: + source-and-wheel: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - run: python -m pip install 'pytest>=8,<10' build -e ./packages/aprs + - name: Test source including every JSONL vector + run: PYTHONPATH=packages/aprs/src python -m pytest packages/aprs/tests -q + - name: Build and install wheel + run: | + python -m build --wheel packages/aprs + python -m pip install --force-reinstall --no-deps packages/aprs/dist/*.whl + - name: Test installed wheel including every JSONL vector + run: python -m pytest packages/aprs/tests -q diff --git a/README.md b/README.md index 2821d88..208be89 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,12 @@ A collection of useful submodules for HAM Radio. At present, HamKit includes the ## In development -- [hamkit-aprs](packages/aprs/README.md): typed APRS parsing and composition - foundation, with byte-preserving handling of unsupported payloads. The - [packet cookbook](packages/aprs/README.md#setup-and-printable-packets) shows - construction and actual decoding results for every modeled family; the - [coverage matrix](packages/aprs/docs/API_COVERAGE.md) distinguishes models - from implemented codecs. +- [hamkit-aprs](packages/aprs/README.md): typed APRS parsing, validation and + composition foundation, with byte-preserving handling of unsupported payloads. + The [packet cookbook](packages/aprs/README.md#find-an-example) shows Python + and JSON construction for every modeled family, with wire output where a + codec exists; the [coverage matrix](packages/aprs/docs/API_COVERAGE.md) + distinguishes models from implemented codecs. ## License diff --git a/packages/aprs/README.md b/packages/aprs/README.md index 736880f..46e1d45 100644 --- a/packages/aprs/README.md +++ b/packages/aprs/README.md @@ -4,12 +4,12 @@ Parse APRS packets, build them in Python, check them before sending, and move them to and from JSON. Pure Python · MIT license · Python 3.11+ · no runtime dependencies. -This is an **alpha API**. Basic status, position, message and acknowledgment -packets work today, along with the envelope/raw formats shown below. Other -families have usable Python and JSON models but **no wire codec yet**. Those -sections say **Model + JSON only** and print the constructed model's name; -they do not claim to produce a TNC2 line. Calling `serialize_packet` on those -models raises `CodecNotImplementedError`. +This is an **alpha API** with decoding and encoding for the packet families in +our [compliance corpus](docs/APRS_COMPLIANCE_VECTORS.md): positions (including +compressed, ambiguous and Mic-E), objects/items, weather, telemetry, messages, +queries/responses, status, NMEA and historical formats. Unknown or explicitly +raw formats preserve their bytes. Public models and JSON shapes are unchanged. +See [codec coverage and compatibility policies](docs/API_COVERAGE.md) for limits. Install from a repository checkout with `python -m pip install -e packages/aprs`. Construction examples run independently, including those that embed JSON @@ -142,7 +142,7 @@ N0CALL>APRS:>Ready ## Working wire examples Each example uses the supported subset of its family. More elaborate fields can -still require an unimplemented codec; see the [coverage notes](docs/API_COVERAGE.md). +use their own wire layout; see the [coverage notes](docs/API_COVERAGE.md). Serialization returns bytes. Optional fields are keyword-only. ### Position @@ -205,10 +205,23 @@ Output: Course/speed (`088/036`) is decoded into `extensions.motion`, and `comment` holds the text after it, including its leading space. PHG, RNG, DFS, DF -bearing and `/A=` altitude are decoded the same way. Extension-shaped text with -invalid values stays in `comment` with a diagnostic, and extensions this -version cannot decode yet (such as `!DAO!` or weather) make the payload -`Opaque` rather than being mistaken for comment text. +bearing and `/A=` altitude also decode into structured extensions. PHG comments +consume an optional `/` separator and trim surrounding ASCII whitespace. The +[PHGR extension](https://www.aprs.org/aprs12/probes.txt) requires a rate character +(`0`–`9`, `A`–`Z`, representing 0–35 reports per hour) followed by `/`; the public +codec consumes that delimiter and emits it on serialization. A rate without its +slash stays in the comment. These PHG conventions do not strip slashes or +whitespace from ordinary messages or other position comments. Extension-shaped text with +invalid values stays in `comment` with a diagnostic. DAO precision, base91 +telemetry, weather, storm, area and signpost extensions also have structured +decoders and encoders. + +When sending, measurements such as course, speed and altitude are rounded to +whole units, like coordinates. Values with no exact wire form (PHG power must +be n² watts) and values that would read back with a different meaning (a known +speed of zero with no course) raise `ConformanceError`. Modeled fields the wire +format cannot carry, such as an independent altitude reference, raise +a representability error instead of being dropped. Build with Python: @@ -635,14 +648,11 @@ N0CALL>APRS:~vendor data ## Model and JSON examples -**Model + JSON only** means the values below can be built, inspected, checked, -saved and loaded now, but cannot yet be serialized to APRS wire bytes. Both -forms print the same payload class name to confirm the model they construct. -The JSON is the actual data shape, not a proposed wire encoding. No future wire -output is shown. +These examples show equivalent Python and JSON construction, printing the +payload class name. They can also be serialized with `serialize_packet`. +Raw wrappers intentionally preserve their information bytes. -For example, this is what happens if you ask the current encoder to write a -weather report to the wire: +For example, encode a positionless weather report: ```python from hamkit import aprs @@ -657,16 +667,13 @@ packet = aprs.Packet( timestamp=aprs.Timestamp.mdhm(10, 17, 12, 30), ), ) -try: - print(aprs.serialize_packet(packet).decode("utf-8")) -except aprs.CodecNotImplementedError as error: - print(type(error).__name__) +print(aprs.serialize_packet(packet).decode("utf-8")) ``` Output: ```text -CodecNotImplementedError +N0CALL>APRS:_10171230c270s012g015t068 ``` The following examples build and load these models without asking for wire @@ -676,7 +683,7 @@ encoding. They remain useful for storing or exchanging structured data. #### Mic-E -**Model + JSON only.** Compact position data with a Mic-E message type. A future encoder derives the destination address from the latitude and message. +**Wire encoding available.** Compact position data with a Mic-E message type. The supplied destination must match latitude, hemisphere and message; the encoder verifies it. `device_code` holds the APRS 1.2 type code: the type byte that begins the status text plus any declared suffix that ends it, such as `` `_% `` (Yaesu FTM-400DR) or `]=` (Kenwood TM-D710). Build with Python: @@ -684,7 +691,7 @@ Build with Python: from hamkit import aprs packet = aprs.Packet( - aprs.Header("N0CALL", "APRS"), + aprs.Header("N0CALL", "TY0P0P"), aprs.MicE( 49, -72, @@ -713,7 +720,7 @@ packet = aprs.from_json( "type": "packet", "header": { "source": "N0CALL", - "destination": "APRS" + "destination": "TY0P0P" }, "payload": { "type": "mic_e", @@ -745,7 +752,7 @@ MicE #### Object -**Model + JSON only.** A named, timestamped object at a position. +**Wire encoding available.** A named, timestamped object at a position. Build with Python: @@ -814,7 +821,7 @@ Object #### Item -**Model + JSON only.** A named item at a position, without an object timestamp. +**Wire encoding available.** A named item at a position, without an object timestamp. Build with Python: @@ -870,7 +877,7 @@ Item #### Weather -**Model + JSON only.** A positionless report: wind, gust and temperature slots plus an MDHM timestamp. Measurements have explicit units. Use the same Weather model in `Extensions.weather` for located weather. +**Wire encoding available.** A positionless report: wind, gust and temperature slots plus an MDHM timestamp. Measurements have explicit units. Use the same Weather model in `Extensions.weather` for located weather. Build with Python: @@ -956,7 +963,7 @@ Weather #### Telemetry readings -**Model + JSON only.** Five analog and eight digital channels. None represents an unavailable channel, not zero. +**Wire encoding available.** Five analog and eight digital channels. None represents an unavailable channel, not zero. Build with Python: @@ -1028,7 +1035,7 @@ Telemetry #### Telemetry definition -**Model + JSON only.** Channel names for N0CALL's telemetry. TelemetryUnits, TelemetryEquations and TelemetryBits are the other definition variants. +**Wire encoding available.** Channel names for N0CALL's telemetry. TelemetryUnits, TelemetryEquations and TelemetryBits are the other definition variants. Build with Python: @@ -1088,7 +1095,7 @@ TelemetryDefinition #### Automatic answer -**Model + JSON only.** An automatic reply addressed to W1AW. +**Wire encoding available.** An automatic reply addressed to W1AW. Build with Python: @@ -1140,7 +1147,7 @@ AutoAnswer #### Bulletin -**Model + JSON only.** A bulletin identifier, text and optional group. A letter identifier makes it an announcement. +**Wire encoding available.** A bulletin identifier, text and optional group. A letter identifier makes it an announcement. Build with Python: @@ -1192,7 +1199,7 @@ Bulletin #### NWS bulletin -**Model + JSON only.** A National Weather Service product envelope, distinct from a general bulletin. +**Wire encoding available.** A National Weather Service product envelope, distinct from a general bulletin. Build with Python: @@ -1245,7 +1252,7 @@ NWSBulletin #### Radiogram -**Model + JSON only.** One NTS radiogram record in its delivery envelope. This example carries text line 1. +**Wire encoding available.** One NTS radiogram record in its delivery envelope. This example carries text line 1. Build with Python: @@ -1302,7 +1309,7 @@ Radiogram #### Query -**Model + JSON only.** A query with a geographic footprint. +**Wire encoding available.** A query with a geographic footprint. Build with Python: @@ -1360,7 +1367,7 @@ Query #### Response -**Model + JSON only.** A query response listing directly heard stations. HeardStation and Trace are other response variants. +**Wire encoding available.** A query response listing directly heard stations. HeardStation and Trace are other response variants. Build with Python: @@ -1417,7 +1424,7 @@ Response #### Capabilities -**Model + JSON only.** A station advertises a protocol capability token. +**Wire encoding available.** A station advertises a protocol capability token. Build with Python: @@ -1473,7 +1480,7 @@ Capabilities #### NMEA -**Model + JSON only.** A GLL navigation sentence. GGA, RMC, VTG and WPL are also modeled. +**Wire encoding available.** A GLL navigation sentence. GGA, RMC, VTG and WPL are also modeled. Build with Python: @@ -1537,7 +1544,7 @@ NMEA #### Raw vendor weather -**Model + JSON only.** Preserve vendor bytes and their declared format; this is not a decoded weather observation. +**Wire encoding available.** Preserve vendor bytes and their declared format; this is not a decoded weather observation. Build with Python: @@ -1588,7 +1595,7 @@ RawWeather #### Agrelo -**Model + JSON only.** Direction-finding bearing and quality. +**Wire encoding available.** Direction-finding bearing and quality. Build with Python: @@ -1637,7 +1644,7 @@ Agrelo #### Maidenhead beacon -**Model + JSON only.** The historical bracket-style grid beacon. `Grid.bounds` and `Grid.center` are computed from the locator. +**Wire encoding available.** The historical bracket-style grid beacon. `Grid.bounds` and `Grid.center` are computed from the locator. Build with Python: @@ -1689,7 +1696,10 @@ Maidenhead #### Legacy position -**Model + JSON only.** A historical prefix around a position. +**Wire encoding available.** A historical prefix around a position. APRS101 +allowed a `!` position within the first 40 bytes of other text; the APRS 1.1 +addendum deprecates that search, so parsing returns a `Beacon` unless you pass +`legacy_positions=True`. Build with Python: @@ -1748,7 +1758,7 @@ LegacyPosition #### Non-APRS beacon -**Model + JSON only.** Plain beacon text with no APRS interpretation. +**Wire encoding available.** Plain beacon text with no APRS interpretation. Build with Python: @@ -1796,7 +1806,7 @@ Beacon #### External extension -**Model + JSON only.** Preserve external-format data by name; its grammar has not been implemented. +**Wire encoding available.** Preserve external-format data by name; its grammar has not been implemented. Build with Python: @@ -1911,11 +1921,17 @@ Output: Text fields accept UTF-8, following the APRS 1.2 proposed-draft guidance for messages, bulletins, status and comments (adopted for compatibility; the ratified spec is ASCII). Bytes that are not valid UTF-8 are read as -Latin-1 with a diagnostic, never dropped or replaced. Pass `profile="rf"` to -also report AX.25 address and size limits. +Latin-1 with a diagnostic, never dropped or replaced. Pass `policy=aprs.RF` to +apply AX.25 envelope address and size limits. -Unsupported payloads are kept as `Opaque`. This weather packet's information -field is retained, not decoded into Weather measurements: +Envelope entry points accept an immutable `EnvelopePolicy`, with `APRS_IS` as +the default and `RF` for AX.25 envelope constraints. Each policy supplies source, +destination and path address patterns, plus optional path-entry, information-byte +and TNC2-line-byte limits. `None` means no limit. See +[Envelope policies](docs/ENVELOPE_POLICIES.md) for presets, customization and +migration from the former `profile=` argument. + +Positionless weather decodes into measurements with explicit units and a timestamp: ```python from hamkit import aprs @@ -1929,7 +1945,7 @@ print(packet) Output: ```text -Packet(header=Header(source='N0CALL', destination='APRS', path=()), payload=Opaque(information=b'_10090556c220s004g005t077r001p025P012h50b09900WRSW', diagnostic=Diagnostic(code='unsupported', message='unsupported information field family', path='$')), diagnostics=()) +Packet(header=Header(source='N0CALL', destination='APRS', path=()), payload=Weather(wind_direction=Measurement(value=220.0, unit='degrees'), wind_speed=Measurement(value=4.0, unit='mph'), gust=Measurement(value=5.0, unit='mph'), temperature=Measurement(value=77.0, unit='fahrenheit'), humidity=Measurement(value=50.0, unit='percent'), pressure=Measurement(value=990.0, unit='hPa'), rain_1h=Measurement(value=0.01, unit='inches'), rain_24h=Measurement(value=0.25, unit='inches'), rain_since_midnight=Measurement(value=0.12, unit='inches'), snow_24h=None, luminosity=None, rain_counter=None, water_height=None, radiation=None, battery_voltage=None, software_code='W', device_code='RSW', timestamp=Timestamp(kind='mdhm_utc', hour=5, minute=56, day=9, second=None, month=10), comment=''), diagnostics=()) ``` Show that same result as JSON: @@ -1948,12 +1964,62 @@ Output: "destination": "APRS" }, "payload": { - "type": "opaque", - "information": "_10090556c220s004g005t077r001p025P012h50b09900WRSW", - "diagnostic": { - "code": "unsupported", - "message": "unsupported information field family" - } + "type": "weather", + "wind_direction": { + "value": 220.0, + "unit": "degrees", + "raw": "220" + }, + "wind_speed": { + "value": 4.0, + "unit": "mph", + "raw": "004" + }, + "gust": { + "value": 5.0, + "unit": "mph", + "raw": "005" + }, + "temperature": { + "value": 77.0, + "unit": "fahrenheit", + "raw": "077" + }, + "humidity": { + "value": 50.0, + "unit": "percent", + "raw": "50" + }, + "pressure": { + "value": 990.0, + "unit": "hPa", + "raw": "09900" + }, + "rain_1h": { + "value": 0.01, + "unit": "inches", + "raw": "001" + }, + "rain_24h": { + "value": 0.25, + "unit": "inches", + "raw": "025" + }, + "rain_since_midnight": { + "value": 0.12, + "unit": "inches", + "raw": "012" + }, + "software_code": "W", + "device_code": "RSW", + "timestamp": { + "kind": "mdhm_utc", + "hour": 5, + "minute": 56, + "day": 9, + "month": 10 + }, + "raw": "10090556c220s004g005t077r001p025P012h50b09900WRSW" }, "original_wire": "N0CALL>APRS:_10090556c220s004g005t077r001p025P012h50b09900WRSW" } @@ -1977,7 +2043,7 @@ print(packet) Output: ```text -Malformed(original_wire=b'N0CALL>APRS:!4903.50N/19000.00W-', diagnostics=(Diagnostic(code='malformed', message='coordinate out of range', path='$.payload.longitude_deg'),), recovered={'type': 'packet', 'header': {'source': 'N0CALL', 'destination': 'APRS'}, 'payload': {'type': 'position', 'messaging': False, 'latitude_deg': 49.05833333333333, 'comment': '', 'symbol': {'table_id': '/', 'code': '-'}}}) +Malformed(original_wire=b'N0CALL>APRS:!4903.50N/19000.00W-', diagnostics=(Diagnostic(code='malformed', message='coordinate out of range', path='$.payload'), Diagnostic(code='malformed', message='coordinate out of range', path='$.payload.longitude_deg')), recovered={'type': 'packet', 'header': {'source': 'N0CALL', 'destination': 'APRS'}, 'payload': {'type': 'position', 'messaging': False, 'latitude_deg': 49.05833333333333, 'comment': '', 'symbol': {'table_id': '/', 'code': '-'}}}) ``` Show that same result as JSON: @@ -1993,6 +2059,11 @@ Output: "type": "malformed", "original_wire": "N0CALL>APRS:!4903.50N/19000.00W-", "diagnostics": [ + { + "code": "malformed", + "message": "coordinate out of range", + "path": "$.payload" + }, { "code": "malformed", "message": "coordinate out of range", @@ -2092,7 +2163,8 @@ Output: the structured fields. - A missing weather measurement differs from `Measurement(None, "mph")`, which means an unavailable reading. Zero is an actual measurement. Units are - explicit; no automatic conversion is performed. + explicit. Encoders convert supported measurement units to the selected wire + units and quantize to field precision; they reject overflow. - `to_json_dict` and `from_json_dict` work with dictionaries. Use `to_json(packet, indent=2, include_defaults=True)` to show optional defaults. `from_json(text, expected_type=aprs.Packet)` checks the expected model. @@ -2113,8 +2185,8 @@ decisions. - [Wire support by family](docs/API_COVERAGE.md): implemented subsets and gaps. - [Naming guide](docs/NAMING.md): public names and why some qualifiers remain. - [Compliance vectors](docs/APRS_COMPLIANCE_VECTORS.md): specification references - and the future packet/field test corpus. These examples are illustrations, not - a claim that the complete corpus passes. + and the complete packet/field test corpus. Every row is tested, including + profile-specific source assertions and sequence behavior. Run the examples and unit tests with -`python -m unittest discover -s packages/aprs/tests -v` from the repository root. +`python -m pytest packages/aprs/tests -q` from the repository root. diff --git a/packages/aprs/docs/API_COVERAGE.md b/packages/aprs/docs/API_COVERAGE.md index cd8dec0..bb6d47b 100644 --- a/packages/aprs/docs/API_COVERAGE.md +++ b/packages/aprs/docs/API_COVERAGE.md @@ -1,201 +1,166 @@ -# APRS representation and codec coverage - -This is the scope contract for the alpha API. **Representation is not codec -implementation or compliance.** Every payload family within the baseline below -has a public construction model, including historical and optional families. -Known field layouts use named dataclasses and aliases, not untyped dictionaries. -Unimplemented vendor/extension grammars have explicitly named raw wrappers. -See [unresolved specification questions](UNRESOLVED_SPEC.md) for source gaps and profile decisions. - -## Baseline and authority - -The baseline is [APRS_COMPLIANCE_VECTORS.md](APRS_COMPLIANCE_VECTORS.md), edition 1: -APRS101 1.0.1; the APRS 1.1 addendum and corrections cited there; and the explicitly -identified compatibility extensions in its pinned FAP appendix. It is **not** -all future APRS 1.2 proposals, arbitrary NMEA sentences, or every vendor protocol. -No FAP or GPL implementation is incorporated. - -This review cross-checked the document's family headings, expected-field schemas, -ambiguity decisions and selected cases against the [APRS101 reference](https://www.aprs.org/doc/APRS101.PDF), -[1.1 addendum](https://www.aprs.org/aprs11.html), -[weather notes](https://www.aprs.org/aprs11/spec-wx.txt), -[DF notes](https://www.aprs.org/APRS-docs/DF.TXT), -[area correction](https://www.aprs.org/aprs11/areaobjects.txt) and -[reply-ack notes](https://www.aprs.org/aprs11/replyacks.txt). Consulted 2026-10-17; -live links are not immutable revisions. Local vector references below are the -reproducible source for the scope decisions. Page numbers refer to printed pages. - -## Coverage matrix - -**Working** means the named subset has functional tests. **Modeled** means Python -values can be constructed but structured wire encoding raises -`CodecNotImplementedError`; decoding generally returns `Opaque` or raises that -error, as `parse_packet(..., unsupported=...)` selects. **Raw** means byte assembly/preservation, -not interpretation or semantic validation. Rows covering shared fields inherit -the capabilities of their enclosing payloads. - -| Source / category | Public representation | Wire support and boundary | -| ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -| HDR; APRS101 pp.12–16,83–85: TNC2 addresses/path | `Header`, `Hop`, `Path`, `Packet` | Working monitor/RF token validation; ordered explicit `*` only | -| HDR, NME-015–036, OTH-038: destination/source metadata | `Header`, `Symbol`, `Grid` | Header tokens retained exactly. Destination symbol/grid, source-SSID symbol, software ID and destination routing are not interpreted yet | -| POS: all four position DTIs | `Position`, `Symbol` | Working uncompressed unambiguous position; messaging/timestamp options | -| POS: ambiguity and unknown-position convention | `Position.ambiguity`, `ambiguity_extent`, `Extent`; `Position.is_null_position` | Ambiguity digits modeled with a computed cell; null convention working; no guessed exact fix for an ambiguous area | -| TIM: DHM UTC/local, HMS UTC, MDHM UTC | `Timestamp`, `TimestampKind` | DHM/HMS working; MDHM modeled; raw timestamp is evidence, not an encoding override. No inferred year/offset | -| EXT: course/speed, altitude, range | `Extensions`, `Motion`, `Altitude`, `Range` | Working on uncompressed positions: CSE/SPD (including unknown and zero pairs), `/A=` feet and RNG. Compressed and Mic-E altitude modeled | -| EXT: PHG and direction finding | `PHG`, `Signal`, `Bearing` | Working on uncompressed positions: PHG, DFS and DF bearing/NRQ codes; derived radii and ranges are properties. Q-to-accuracy mapping not imposed | -| CMP: compressed positions, csT precedence | `Position(encoding="compressed")`, `Compression`, `Extensions` | Modeled: type/fix/NMEA source/origin, ignored csT, motion/range/altitude. Encoders must validate mutually exclusive interpretations | -| MIC: current/old/beta Mic-E | `MicE`, `MicEMessage`, `Extensions` | Modeled: position, message type, fix, ambiguity, device code, motion/altitude/telemetry. Header context required | -| OBJ: objects/items, live/kill, compressed/moving/weather | `Object`, `Item`, `Extensions` | Modeled: name, lifecycle, timestamp, position, compression and extension fields | -| OBJ: areas/signposts | `Area`, `Signpost` in `Extensions` | Modeled: shape/color/offset codes, corrected anchor/offsets, corridor width, signpost label; rendering is outside scope | -| WX: positionless, located, compressed, object weather | `Weather`; `Extensions.weather` on `Position`, `Object`, `Item` | Modeled; located weather retains its enclosing position/object identity | -| WX: missing/zero/raw sensor data and water gauges | `Weather`, `Measurement`, `WaterHeight`, `Unit` | Modeled: wind/gust/temp/humidity/pressure, three rain windows, snow, luminosity, raw counter, software/device, height/datum | -| WX: hurricanes/tropical storms/depressions | `Storm` in `Extensions` | Modeled: predicted flag, sustained/gust wind, pressure and three radii | -| TLM: classic, MIC, legacy Mic-E, base91 comment, relaxed compatibility | `Telemetry`, `TelemetryEncoding`, `AnalogChannels`, `DigitalChannels` | Modeled: sequence/raw sequence, MIC comma variant, ordered missing channels, raw values. Calibration is not applied implicitly | -| TLM: PARM/UNIT/EQNS/BITS | `TelemetryDefinition`, `TelemetryParameters`, `TelemetryUnits`, `TelemetryEquations`, `Calibration`, `TelemetryBits` | Modeled: target, partial/empty channels, coefficients, sense bits and project title | -| MSG: ordinary/group messages | `Message` | Working: UTF-8 text, message ID and reply-ack. Group addressees retained; delivery/ack policy not inferred | -| MSG: ack/rej, reply-ack and automatic answers | `Acknowledgment`, `Message.reply_ack`, `AutoAnswer` | ack/rej and reply-ack working; auto-answer modeled | -| MSG: bulletins, announcements, group bulletins, NWS | `Bulletin`, `NWSBulletin` | Modeled: identifier (announcement when a letter), group; NWS reference is separate from an ordinary message ID | -| MSG: NTS records N#, NA, NP, N1–N6, NS, NR | `Radiogram`, `NTSRecord`, `NTSHeader`, `NTSAddress`, `NTSPhone`, `NTSText`, `NTSSignature`, `NTSRouting` | Modeled named record fields; no radiogram assembly/state machine | -| QRY: general/directed/unknown queries and footprints | `Query`, `Footprint` | Modeled open query name, recipient, heard station and additional argument bytes | -| QRY: direct stations/heard history/path responses | `Response`, `ResponseValue`, `DirectStations`, `HeardStation`, `Trace` | Modeled refinements. Generic response text still decodes as `Message`; it is not claimed as structured response decoding | -| QRY: capability announcements | `Capabilities`, `Capability` | Modeled ordered tokens with optional values; unknown token names permitted | -| STA: status/grid/beam | `Status`, `Grid`, `Beam`, `Symbol` | UTF-8 text and DHM UTC working; grid/beam modeled. Other timestamp-looking text stays text | -| NME: GGA/GLL/RMC/VTG/WPL | `NMEA`, `NMEASentence`, `GGA`, `GLL`, `RMC`, `VTG`, `WPL`, `NMEAMetadata` | Modeled explicit sentence fields, raw time/date, checksum and fix validity; no automatic trusted position or datum conversion | -| NET: third-party encapsulation | `ThirdParty(Packet(...))` | Working bounded recursion, including binary and opaque inner packets; inner header supplied to decoding | -| NET: APRS-IS path and no-gate/no-archive conventions | `Header.path`, raw payload bytes | Tokens retained, including q constructs. Routing/archive/authentication policy and station state are outside packet codecs | -| OTH: user-defined/experimental | `UserDefined` | Working one-byte ID/type plus arbitrary binary data; user payload semantics remain private | -| OTH: explicit invalid/test | `Invalid` | Working raw body; never interpreted as a position | -| OTH: raw vendor weather `!!`, `#`, `$ULTW`, `*` | `RawWeather` | Named raw wrapper with optional externally interpreted `Weather`; vendor grammar not inferred; codec modeled only | -| APRS101 Appendix 1 p.103: Agrelo DFJr/MicroFinder `%` | `Agrelo` | Bearing and quality-code representation modeled; no guessed quality meaning | -| OTH: obsolete bracket Maidenhead beacon | `Maidenhead`, `Grid` | Modeled historical wrapper | -| OTH: historical X1J, obsolete object/bulletin, non-APRS beacon | `LegacyPosition`, `Beacon` | Modeled. Obsolete object/bulletin forms stay Opaque; the decoder does not search for embedded position DTIs | -| OTH: reserved/unknown DTIs, future/undocumented data | `Reserved`, `Opaque`, `Diagnostic` | Raw reserved construction, opaque recovery. No invented grammar for reserved map/shelter slots | -| Addendum-linked polygon/line or other external vendor grammar | `ExternalExtension` | Named raw wrapper with specification URL; numerical interpretation remains unresolved pending an authoritative grammar | -| FAP-only extensions cited by corpus | `DAO`, `PHG.rate_per_hour`, `Telemetry`, `RawWeather`, raw codes | Represented without asserting compatibility decoding | -| BAD: malformed supported payloads | `Malformed`, `Diagnostic` | Working: undecodable fields yield Malformed with recovered data; out-of-spec but decodable input yields a Packet with nonconforming diagnostics | -| SEQ: station state, ownership, retries, calibration history | Packet models above | Sequence inputs representable; state machines are outside this stateless module | -| AEA, AX.25/KISS/FCS, modem/radio | `Header` plus payload after adapter normalization | Outside payload scope; AEA adapter not implemented. TNC2 LF/CRLF helpers are working | - -`codec_support()` provides a per-payload machine-readable summary, and -`codec_support_for(value_or_type)` returns one entry. A `partial` entry is not a -promise that every combination of that model is encodable. The constructor -examples in `tests/model_examples.py` are checked against **every member of -`Payload` and every public dataclass**; extending the public surface requires -extending those examples and the codec registry. - -## Validation tiers - -Uncompressed extension encoding rejects motion values whose wire form would -change whether a measurement is known or contradict an explicit `zero_pair`. -Invalid DF bearing text remains inspectable in the comment with a conformance -diagnostic, and cannot be sent. PHG `rate_per_hour`, explicit altitude references, -and bearing `usable`/`accuracy_less_than_deg` annotations remain representable in -Python and JSON, but raise `CodecNotImplementedError` on send rather than being -silently discarded. - -- **Constructors** reject values that cannot exist on the wire or contradict - another field: an out-of-range coordinate, an invalid timestamp, a `{` inside - message text, a lowercase overlay on an uncompressed position. These raise - `ModelError` from Python and `JSONModelError` from JSON. A Malformed parse - result means a received field failed this tier. -- **Conformance** covers APRS limits a transmitter could still break: lengths, - reserved characters, control characters, required weather slots, symbol - requirements for storms, DF and areas, data-extension slot conflicts, telemetry - layouts, and RF address/size limits with `profile="rf"`. Received packets - keep these findings in `Packet.diagnostics`. `check_packet` lists them, and - `serialize_packet` raises `ConformanceError` rather than send them. -- Values that follow from other fields are properties, so they cannot - contradict: grid bounds and center, PHG ranges, bearing range and manual flag, - area offsets and anchor, compression type byte, bulletin announcement flag - and the ambiguity cell. - -## Encoding and decoding contracts - -- `serialize_packet` re-validates the whole model, raises - `CodecNotImplementedError` for families without an encoder, then raises - `ConformanceError` with every finding before any bytes are produced. - `validate_packet` performs exactly the same checks. `original_wire` is never - replayed. -- Mic-E's latitude and message bits belong in the destination address, so a - future Mic-E encoder derives the destination inside `serialize_packet`. - `serialize_payload` raises `ContextRequiredError` for Mic-E, as - `parse_payload` does without `header=`; full packet parsing always supplies - the header. -- `Position.comment` (and the comment on objects, items and Mic-E) is the free - text after the data extensions. Course/speed, PHG, RNG, DFS, DF bearing and - `/A=` altitude are decoded into `extensions` and encoded from them. Text shaped - like an extension with invalid values (such as `361/010`) stays in `comment` - with a nonconforming finding. Recognized syntax without a decoder yet (DAO, - positioned weather, storms, areas, signposts, base91 telemetry) makes the - payload `Opaque`, and encoding those extensions raises - `CodecNotImplementedError`; nothing is silently discarded. Before sending, - conformance re-reads the encoded extensions and comment and refuses a comment - that would be read back differently, or extension values with no exact wire - form. Measurements are rounded to whole units, like coordinates; code-table - values (PHG power, height, gain, directivity) must be exact. -- `Position`, `Object`, `Item` and `MicE` carry latitude, longitude and symbol - directly, and share the `coordinates` and `ambiguity_extent` properties. - Compression is present exactly when `compression` is set. -- Raw evidence fields never override structured values and are ignored by - equality. Future codecs must validate consistency rather than prefer evidence. - -## Recovery, framing and limitations - -`parse_packet` consumes an unframed byte sequence. It does not trim or reject -binary CR/LF inside information. `parse_tnc2_line` instead requires exactly one -LF/CRLF terminator and rejects embedded delimiters; its `original_wire` excludes -the terminator. `serialize_tnc2_line` emits CRLF and rejects non-line-safe data. -All 256 byte values are tested in `UserDefined.data` in monitor mode; RF size -limits still apply. Wire input is `bytes` only. - -Free text decodes as UTF-8, following the APRS 1.2 proposed-draft guidance -adopted for compatibility; invalid UTF-8 falls back to Latin-1 with a -nonconforming diagnostic. Protocol tokens are printable -ASCII. See [unresolved specification questions](UNRESOLVED_SPEC.md#text-encoding-ascii-and-utf-8). - -`parse_packet` returns a Packet unless a header or implemented payload field -cannot be decoded; then it returns one top-level Malformed. `parse_payload` -uses the same boundary for a standalone payload. Malformed contains -original_wire, diagnostics with field paths, recovered ordinary JSON in the -normal schema, and the typed `header` when it was intact. It never appears -inside Packet.payload. Missing or undecodable values are not invented. -Corrected recovered data goes through ordinary JSON construction to become a -Packet. - -`unsupported` (`"opaque"` / `"raise"`) and `malformed` (`"return"` / `"raise"`) -are independent keyword options. Unknown or unimplemented formats are -unsupported, not malformed. Context and resource failures raise. A broken outer -header can still recover supported inner fields. Nested third-party failures -produce one outer Malformed with nested diagnostic paths. - -`max_third_party_depth` counts third-party wrappers (default 4, configurable -0–32), in both directions. RF address rules apply to the transmitted header -only, not to Internet-origin inner envelopes; the outer RF information-size -limit still applies. - -## Genuine ambiguities and scope gaps - -- Wind units in uncompressed complete weather and zero-pair semantics remain - disputed in the corpus. `Measurement.unit="disputed_knots_or_mph"` and raw - evidence can represent an unresolved reading. No converter chooses silently. -- Peet vendor layouts have manufacturer documentation but no implemented codec. - External polygon/line geometry and detailed Agrelo quality meanings still need - verified authoritative definitions. Named raw - models preserve these boundaries rather than fabricating fields. -- The area correction specifies numeric offsets/anchors, not a complete rendering - algorithm. `Area` stores codes and corrected quantities; map rendering is out. -- Live symbol/TOCALL registries, later APRS 1.2 proposals (including new radiation - formats), generic NMEA variants, and compatibility acceptance of malformed - input are not exhaustively specified by this baseline. -- Historical and FAP compatibility profiles are not implemented; their - behavioral rules and station-state sequences still need a design. - -These are the limits of “everything represented.” All **defined payload families -in this baseline** have a model; undefined grammars have honest raw boundaries. -This is not a guarantee that future specifications require no additional fields -or classes. No comprehensive vector-compliance claim is made. - -Weather and telemetry use the same semantic model as a full payload or nested -field. Conformance checks the slots and encoding variants each context requires; -neither has a wire codec yet. -See [the naming guide](NAMING.md) for model names and their meanings. +# APRS codec coverage + +Packet dataclasses, payload unions and the packet JSON schema are unchanged. +Envelope entry points now accept `policy=EnvelopePolicy(...)` instead of a +profile string, with public `RF` and `APRS_IS` presets. `APRS_IS` is the default. +Decoding and encoding cover the families exercised by all 1,564 occurrences in +[the edition 1 corpus](APRS_COMPLIANCE_VECTORS.md). Unknown grammars still use +`Opaque`; raw wrappers preserve authoritative information bytes. + +| Family | Decoding and encoding | +| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Envelope | TNC2, configurable address patterns and size limits, RF/APRS-IS presets, explicit repeated hops, AEA normalization, bounded third-party nesting | +| Positions | All four DTIs, ambiguity, compressed coordinates/csT, Mic-E destination-dependent latitude/message/hemisphere | +| Extensions | Motion, altitude, PHG/rate, range, DF signal/bearing, DAO, area/corridor, signpost, storm, weather, base91 and Mic-E telemetry | +| Objects/items | Names, ownership information, alive/killed markers, compressed/uncompressed positions and extensions | +| Weather | MDHM positionless and located reports, unavailable readings, rain/humidity/pressure, luminosity, snow, water height, APRS 1.2 radiation and battery volts, device suffixes | +| Telemetry | Classic samples (short reports decode as nonconforming), PARM/UNIT/EQNS/BITS, comment base91, old Mic-E hex/binary | +| Messages | Ordinary messages, ack/rej, reply-ack, automatic answers, bulletins/announcements/groups, NWS envelopes, NTS records | +| Queries/responses | General/directed queries, footprints, heard-station operands, direct lists, hourly counts, trace headers, capabilities | +| Status | Text, DHM, grid/symbol and beam/ERP | +| NMEA | GGA, GLL, RMC, VTG and WPL, checksums, independent fix usability, destination/source symbol conventions | +| Historical/raw | Grid beacons, X1J embedded positions (opt-in), plain beacons, Agrelo, user-defined, invalid/test, reserved and external raw formats | +| Vendor weather | Ultimeter 2000 measurements plus original bytes; other vendor modes retain bytes without invented measurements | + +`codec_support()` and `codec_support_for()` describe these boundaries at runtime. +Raw models do not promise interpretation of arbitrary vendor or external grammars. +AX.25 framing, KISS, FCS, radio/modem operation and arbitrary NMEA sentences remain +outside this package's packet codec. + +## Receiver profiles without an API change + +The source vectors deliberately describe different receivers. The same TNC2 +bytes can have different expectations: embedded `!` is a modern beacon versus a +legacy X1J position (opt in with `legacy_positions=True`); FAP trims comments, +converts weather units, rounds some values, and accepts certain incomplete +historical reports. + +Schema-only differences are resolved in the stored JSONL expectations, not by +rewriting actual public output during comparison. The offline source-to-schema +generator preserves values while translating names, nesting and equivalent units; +it never consults a parser or expected decoder output. + +The public codec is deterministic and preserves the richer wire interpretation. +There is no receiver-emulation layer: every vector compares public +`parse_packet` output with its stored expectation. FAP's own extra fields +(display resolution, raw timestamps, warnings, indoor sensors) describe that +library's output rather than this schema, so they remain source provenance +without assertions. The pinned reference implementation was consulted; it is +not a runtime dependency. + +Incomplete historical GLL reports and invalid timestamps remain `Malformed` when +required facts cannot be constructed; `Malformed.recovered` keeps the intact +fields of positions, objects and status reports. No missing time, coordinate or +calibration coefficient is fabricated. + +The completed schema migration rewrites 35 expectations (33 FAP, two historical +positions). It stores weather measurements in the public decoder's equivalent +units, compressed weather wind in `extensions.weather`, legacy positions inside +`LegacyPosition`, vendor readings inside `RawWeather.weather`, and captured NMEA +coordinates/speed/course/altitude/symbol/checksum assertions in typed fields. Four +Mic-E comments now store their device marker separately in `device_code`, +preserving every character. +The runtime weather-unit conversion, wrapper flattening, and NMEA source-schema +comparison have been removed. Source snapshots and all raw packet bytes remain +unchanged; inverse-unit and source-value tests check that no information was lost. + +Historical and FAP rows parse with `legacy_positions=True`. Fifty-two FAP +expectations record where FAP's interpretation differs from the +specification-following public decoder (`tests/fap_divergences.json`), each +with its reasons. + +The 23 sequence occurrences run through a test application receiver using public +models. Ownership, deduplication, acknowledgment construction, calibration, +bulletin replacement, status fallback and station-specific weather association +are verified. The codec itself remains stateless. + +## Composition and precision + +Serialization builds bytes from semantic fields, never `original_wire`, lexical +NMEA fields, or extension `raw` evidence. Explicit raw models are the exception: +`information`/`data` are their authoritative semantic content. + +- Uncompressed coordinates round to hundredths of minutes; ambiguity transmits + the requested cell. Compressed coordinates round to their base91 grid. DAO + precision is removed from the reported coordinate before encoding the base + coordinate, preventing a second application of the offset. +- Compressed motion, range and altitude use their specified logarithmic codes. + Field overflow is rejected. No saturation or text truncation is performed. + Numeric overlays use table IDs `a`–`j`; sending compressed positions with + `0`–`9` table IDs is refused as nonconforming. +- Mic-E requires a destination consistent with latitude, ambiguity, message and + longitude flags. `check_packet` reports mismatches at `$.header.destination`, + and sending raises `ConformanceError`; packet headers are not silently changed. + Payload-only Mic-E still requires header context. Longitude degrees + use APRS101's table, so 100–109° are sent as `l`–`u`, never as control bytes. +- Mic-E status text follows the APRS 1.2 type codes + (aprs.org/aprs12/mic-e-types.txt). `device_code` holds the type byte that + begins the text plus any declared suffix that ends it, such as `` `_% `` + (Yaesu FTM-400DR), `'|3` (Byonics TinyTrack3) or `]=` (Kenwood TM-D710). + Legacy grid/status text such as `IO91SX/G Ready` stays in `comment`, separate + from the device code and the encoded latitude/longitude. + A leading `` ` `` or `'` is APRS101 hex telemetry only in its complete form + without a declared suffix; otherwise it is a type byte, and no type byte or + suffix makes a packet `Malformed`. Sending refuses an undeclared type code, a + type code combined with hex or binary telemetry, and a comment that would be + read back as a different type code. +- NMEA uses semantic numeric fields and recomputes a supplied checksum. Checksum + characters can change when equivalent numeric spellings change. A sentence + received with a bad checksum (`checksum_valid=False`) is a conformance finding: + it is reported when parsed and refused when sending, so corrupt data is never + re-signed implicitly. Repair it explicitly by clearing `checksum_valid` (a fresh + checksum is computed) or by omitting the checksum. + An explicit NMEA symbol must match the packet header; `check_packet` reports + conflicts at `$.payload.symbol`. Payload-only encoding with an explicit symbol + raises `ContextRequiredError`; use `serialize_packet` to supply the header. +- Weather encoders convert supported units to wire units, then round to field + precision. Uncompressed located wind retains the corpus's explicit + `disputed_knots_or_mph` unit on decode; composition of an explicitly metric or + mph reading follows the FAP mph interpretation. No interpretation is assigned + to a received disputed reading by the core decoder. + Standalone `serialize_payload` applies the same positionless report requirements + as packet serialization, including mandatory slots and the prohibition on snow. +- Structured weather data is exempt from the 43-byte position-comment budget. + Uncompressed wind (`ddd/sss`) still counts as the 7-byte data extension, leaving + 36 comment bytes; with wind in compressed csT all weather data is exempt. + Envelope limits (information and line bytes) still count every byte. +- Weather software/unit codes end a report (APRS101 pp. 63–66 define no comment + after them). They are decoded only when they end the report, so sending refuses + codes followed by a comment, and a comment alone that would read back as codes + (3–5 characters such as `home`). +- Message text is a query response only when it matches a response grammar + completely; anything else remains an ordinary `Message`. +- Explicit altitude datum and DF interpretation annotations with no wire form + remain unsendable rather than being silently discarded. Raw vendor weather + annotations do not replace authoritative bytes. + +Constructors enforce model validity. `check_packet` reports conformance findings; +`serialize_packet` rejects them and additionally checks representability. Received +warnings alone do not prevent encoding: Latin-1 input can become valid UTF-8. + +## Verification + +All 1,564 decode cases pass without skips or expected failures. Public JSON +projections and source assertions outside the projections are both checked, +including partial values recovered before a rejection. +All original packet bytes, semantic expectations, options and provenance have a +frozen integrity hash tied to PR #4's head commit. + +Every vector also has an encoding test. With an explicit permissive envelope +policy (`EnvelopePolicy(".*", ".*", ".*")`), 1,305 occurrences encode and stabilize +through semantic decode/encode round trips with all raw evidence removed. The +other 259 have explicit refusal records: 176 malformed public packets and 83 +violations of the existing transmit-conformance rules. Those refusal tests assert +the reason; they are not broad exception catches or skipped tests. Three NMEA +sentences with bad checksums are first refused, then encode after an explicit +repair; they are counted among the 1,305. + +Of those 1,305, 15 have addresses rejected by the new default `APRS_IS` policy, +including two with SSID `-0`; the tests independently require those +default-policy refusals and validate the other 1,290 under the default policy. The permissive policy changes no decoded +fields, packet bytes or payload conformance checks. Dedicated policy tests cover +custom patterns, optional and zero limits, boundary sizes including CRLF, +repeated markers, and consistent outer-envelope handling of third-party packets. + +PHG/PHGR vectors exercise the public API directly. The PHGR rate character and required slash, ordinary PHG separators, +and PHG comment whitespace are handled by the shared public decoder/encoder. diff --git a/packages/aprs/docs/APRS_COMPLIANCE_VECTORS.md b/packages/aprs/docs/APRS_COMPLIANCE_VECTORS.md index 1349b57..3d06b36 100755 --- a/packages/aprs/docs/APRS_COMPLIANCE_VECTORS.md +++ b/packages/aprs/docs/APRS_COMPLIANCE_VECTORS.md @@ -2,7 +2,9 @@ Edition 1 — prepared 2026-10-15. Source baseline: APRS Protocol Reference document 1.0.1, the live APRS 1.1 addendum and selected clarifications it links, and the pinned `hessu/go-aprs-fap` tests. -This document contains **1,545 numbered cases: 1,538 individual packet cases and 7 stateful sequences containing 23 additional packet occurrences**. There are 1,028 specification-derived, historical, policy, ambiguity, and robustness cases, plus 517 FAP compatibility snapshots. The individual cases contain 1,515 distinct byte strings. Repeated strings are intentional where profiles or parser options change the expected result. +Amended 2026-10-17: added [WX-067](#wx-067)–[WX-069](#wx-069) for the placement of weather software/unit codes (APRS101 pp. 63–66). The verification notes below describe the original edition. + +This document contains **1,548 numbered cases: 1,541 individual packet cases and 7 stateful sequences containing 23 additional packet occurrences**. There are 1,031 specification-derived, historical, policy, ambiguity, and robustness cases, plus 517 FAP compatibility snapshots. The individual cases contain 1,518 distinct byte strings. Repeated strings are intentional where profiles or parser options change the expected result. Every packet is fully expanded. JSON strings preserve padding, backslashes, embedded colons, control bytes, and high-bit bytes. The decoded fields are intended as inputs to an implementation-neutral test adapter; the FAP appendix deliberately uses a separate schema. This is a broad finite corpus, not a claim that all possible APRS byte combinations, products, or later extensions have been enumerated. @@ -20,7 +22,7 @@ Every packet is fully expanded. JSON strings preserve padding, backslashes, embe - [CMP: Compressed positions](#family-cmp) — 122 cases - [MIC: Mic-E](#family-mic) — 265 cases - [OBJ: Objects, items, areas and signposts](#family-obj) — 53 cases -- [WX: Weather and storms](#family-wx) — 66 cases +- [WX: Weather and storms](#family-wx) — 69 cases - [TLM: Telemetry and definition messages](#family-tlm) — 18 cases - [MSG: Messages, bulletins, announcements and radiograms](#family-msg) — 45 cases - [QRY: Queries and station capabilities](#family-qry) — 20 cases @@ -110,7 +112,7 @@ Exact conversions used: 1 knot = 1.852 km/h = 1852/3600 m/s; 1 mph = 0.44704 m/s | Profile | Cases | Purpose | | -------------------------- | ----: | ------------------------------------------------------------------------------------------------------------------------------- | -| `core-1.1` | 801 | APRS101 plus explicit live-addendum corrections; field decoding and selected application semantics. | +| `core-1.1` | 804 | APRS101 plus explicit live-addendum corrections; field decoding and selected application semantics. | | `historical-1.0` | 41 | Legacy behavior retained for deliberate backward compatibility; not a modern transmission recommendation. | | `strict-envelope` | 14 | RF/TNC2 transmitter and envelope constraints. Do not apply RF address restrictions indiscriminately to APRS-IS. | | `strict-validation` | 112 | Malformed fields, width/range limits, or a stated conservative extension-extraction policy. Valid surrounding data may survive. | @@ -140,26 +142,26 @@ Stateful records have `steps` instead of a single `packet` and `outcome`. Reset ## Coverage and verification -| Family | Cases | Coverage | -| ------------------ | ----: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [HDR](#family-hdr) | 51 | Envelope splitting; repeated markers; eight-hop boundary; destination dispatch; historical destination-SSID routing. | -| [POS](#family-pos) | 68 | Four position DTIs; hemispheres and poles; null convention; all ambiguity levels; comments and overlays. | -| [TIM](#family-tim) | 20 | DHM UTC/local, HMS, weather MDHM, component boundaries, invalid timestamps, status timestamp restrictions. | -| [EXT](#family-ext) | 50 | Course/speed; altitude placement; PHG height/gain/directivity; explicit range; DFS and every DF quality code. | -| [CMP](#family-cmp) | 122 | Coordinate quantization; table/overlay encoding; motion/range/altitude precedence; all 64 six-bit compression types. | -| [MIC](#family-mic) | 265 | All longitude degrees 0–179; minute/hundredth boundaries; message-bit combinations; speed/course encodings; ambiguity; type markers; altitude and legacy telemetry. | -| [OBJ](#family-obj) | 53 | Object/item live and killed forms; name boundaries; compressed and moving forms; ten area shapes; sixteen colors; signposts. | -| [WX](#family-wx) | 66 | Positionless/uncompressed/compressed weather; missing and zero values; temperatures; humidity/pressure; rain windows; luminosity; snowfall; water level; storms. | -| [TLM](#family-tlm) | 18 | Numeric/MIC sequence fields; five analog/eight digital channels; definition messages; partial/empty definitions. | -| [MSG](#family-msg) | 45 | Text/ID/address limits; groups; ack/rej; reply-ack; automatic answers; bulletins/announcements/NWS; NTS record types. | -| [QRY](#family-qry) | 20 | General and directed queries; geographic footprints; response payloads; capability tokens. | -| [STA](#family-sta) | 29 | Empty/padded/timed status; Maidenhead cells; beam heading/ERP; suffix anchoring. | -| [NME](#family-nme) | 36 | GGA/GLL/RMC/VTG/WPL; checksum and no-fix isolation; destination symbols; historical SSID symbols; symbol precedence. | -| [NET](#family-net) | 15 | Third-party nested envelopes; no-gate/no-archive; q-token preservation; AEA adapter. | -| [OTH](#family-oth) | 38 | Opaque vendor formats; user-defined binary data; explicit invalid/test; obsolete grids/beacons; reserved DTIs; old/new X1J behavior. | -| [BAD](#family-bad) | 125 | Envelope, field width, coordinate range, truncation, symbol, compression, message, telemetry, weather, and nested-packet failures. | -| [SEQ](#family-seq) | 7 | Object ownership/lifecycle; case/name identity; duplicate messages/reply-ack; telemetry calibration; bulletins; status precedence; weather association. | -| [FAP](#family-fap) | 517 | Every captured root-parser invocation plus eligible full-packet/encoder/CLI supplements from the pinned tests. | +| Family | Cases | Coverage | +| ------------------ | ----: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [HDR](#family-hdr) | 51 | Envelope splitting; repeated markers; eight-hop boundary; destination dispatch; historical destination-SSID routing. | +| [POS](#family-pos) | 68 | Four position DTIs; hemispheres and poles; null convention; all ambiguity levels; comments and overlays. | +| [TIM](#family-tim) | 20 | DHM UTC/local, HMS, weather MDHM, component boundaries, invalid timestamps, status timestamp restrictions. | +| [EXT](#family-ext) | 50 | Course/speed; altitude placement; PHG height/gain/directivity; explicit range; DFS and every DF quality code. | +| [CMP](#family-cmp) | 122 | Coordinate quantization; table/overlay encoding; motion/range/altitude precedence; all 64 six-bit compression types. | +| [MIC](#family-mic) | 265 | All longitude degrees 0–179; minute/hundredth boundaries; message-bit combinations; speed/course encodings; ambiguity; type markers; altitude and legacy telemetry. | +| [OBJ](#family-obj) | 53 | Object/item live and killed forms; name boundaries; compressed and moving forms; ten area shapes; sixteen colors; signposts. | +| [WX](#family-wx) | 69 | Positionless/uncompressed/compressed weather; missing and zero values; temperatures; humidity/pressure; rain windows; luminosity; snowfall; water level; storms; software/unit code placement. | +| [TLM](#family-tlm) | 18 | Numeric/MIC sequence fields; five analog/eight digital channels; definition messages; partial/empty definitions. | +| [MSG](#family-msg) | 45 | Text/ID/address limits; groups; ack/rej; reply-ack; automatic answers; bulletins/announcements/NWS; NTS record types. | +| [QRY](#family-qry) | 20 | General and directed queries; geographic footprints; response payloads; capability tokens. | +| [STA](#family-sta) | 29 | Empty/padded/timed status; Maidenhead cells; beam heading/ERP; suffix anchoring. | +| [NME](#family-nme) | 36 | GGA/GLL/RMC/VTG/WPL; checksum and no-fix isolation; destination symbols; historical SSID symbols; symbol precedence. | +| [NET](#family-net) | 15 | Third-party nested envelopes; no-gate/no-archive; q-token preservation; AEA adapter. | +| [OTH](#family-oth) | 38 | Opaque vendor formats; user-defined binary data; explicit invalid/test; obsolete grids/beacons; reserved DTIs; old/new X1J behavior. | +| [BAD](#family-bad) | 125 | Envelope, field width, coordinate range, truncation, symbol, compression, message, telemetry, weather, and nested-packet failures. | +| [SEQ](#family-seq) | 7 | Object ownership/lifecycle; case/name identity; duplicate messages/reply-ack; telemetry calibration; bulletins; status precedence; weather association. | +| [FAP](#family-fap) | 517 | Every captured root-parser invocation plus eligible full-packet/encoder/CLI supplements from the pinned tests. | Verification performed while building this edition: @@ -33244,6 +33246,148 @@ Positionless/uncompressed/compressed weather; missing and zero values; temperatu } ``` + + +### WX-067 — APRS101 rain-gauge example: trailing text as software/unit + +```json +{ + "id": "WX-067", + "title": "APRS101 rain-gauge example: trailing text as software/unit", + "profile": "core-1.1", + "outcome": "accept", + "source": "APRS101 pp. 63-64", + "packet": "N0CALL>APRS:_10090556c...s...g...t...P012Jim", + "expected": { + "header": { + "source": "N0CALL", + "destination": "APRS", + "path": [] + }, + "kind": "weather", + "timestamp": { + "raw": "10090556", + "format": "MDHM", + "zone": "UTC", + "month": 10, + "day": 9, + "hour": 5, + "minute": 56 + }, + "weather": { + "wind_direction_deg": null, + "wind_speed_mph": null, + "wind_speed_mps": null, + "gust_mph": null, + "gust_mps": null, + "temperature_f": null, + "temperature_c": null, + "rain_since_midnight_hundredth_in": 12, + "rain_since_midnight_mm": 3.048, + "software_code": "J", + "device_code": "im" + } + }, + "note": "The specification's own example. By the p.63 layout a report ends with the optional software code S (1 byte) and unit code uuuu (2-4 bytes), so the trailing 'Jim' is software 'J' and unit 'im'. The grammar cannot distinguish a short name from these codes.", + "packet_length_bytes": 44 +} +``` + + + +### WX-068 — Short trailing text reads as software/unit codes + +```json +{ + "id": "WX-068", + "title": "Short trailing text reads as software/unit codes", + "profile": "core-1.1", + "outcome": "accept", + "source": "APRS101 p. 63", + "packet": "N0CALL>APRS:_10090556c220s004g005t077P012Home", + "expected": { + "header": { + "source": "N0CALL", + "destination": "APRS", + "path": [] + }, + "kind": "weather", + "timestamp": { + "raw": "10090556", + "format": "MDHM", + "zone": "UTC", + "month": 10, + "day": 9, + "hour": 5, + "minute": 56 + }, + "weather": { + "wind_direction_deg": 220, + "wind_speed_mph": 4, + "wind_speed_mps": 1.78816, + "gust_mph": 5, + "gust_mps": 2.2352, + "temperature_f": 77, + "temperature_c": 25.0, + "rain_since_midnight_hundredth_in": 12, + "rain_since_midnight_mm": 3.048, + "software_code": "H", + "device_code": "ome" + } + }, + "note": "Unit codes are open-ended ('Users may specify any other 2-4 character code'), so any 3-5 trailing characters that end the report are read as S plus uuuu. Receivers must not reinterpret them as comment text.", + "packet_length_bytes": 45 +} +``` + + + +### WX-069 — Text after software/unit codes is comment + +```json +{ + "id": "WX-069", + "title": "Text after software/unit codes is comment", + "profile": "core-1.1", + "outcome": "accept", + "source": "APRS101 pp. 63-66", + "packet": "N0CALL>APRS:_10090556c220s004g005t077P012wRSW home", + "expected": { + "header": { + "source": "N0CALL", + "destination": "APRS", + "path": [] + }, + "kind": "weather", + "timestamp": { + "raw": "10090556", + "format": "MDHM", + "zone": "UTC", + "month": 10, + "day": 9, + "hour": 5, + "minute": 56 + }, + "weather": { + "wind_direction_deg": 220, + "wind_speed_mph": 4, + "wind_speed_mps": 1.78816, + "gust_mph": 5, + "gust_mps": 2.2352, + "temperature_f": 77, + "temperature_c": 25.0, + "rain_since_midnight_hundredth_in": 12, + "rain_since_midnight_mm": 3.048, + "software_code": null, + "device_code": null + }, + "comment": "wRSW home" + }, + "note": "Every weather format ends with the optional S and uuuu codes; none defines a comment after them. Text that does not end the report as exactly those codes is retained as comment and no codes are inferred. Transmitters must not place a comment after the codes.", + "packet_length_bytes": 50 +} +``` + ## TLM — Telemetry and definition messages @@ -35924,7 +36068,7 @@ General and directed queries; geographic footprints; response payloads; capabili "ack_requested": false }, "query": { - "type": "PING?", + "type": "PING", "directed": true, "ack_requested": false } diff --git a/packages/aprs/docs/ENVELOPE_POLICIES.md b/packages/aprs/docs/ENVELOPE_POLICIES.md new file mode 100644 index 0000000..cd30ad1 --- /dev/null +++ b/packages/aprs/docs/ENVELOPE_POLICIES.md @@ -0,0 +1,77 @@ +# Envelope policies + +`parse_packet`, `parse_tnc2_line`, `check_packet`, `validate_packet`, +`serialize_packet`, and `serialize_tnc2_line` accept `policy=`, defaulting to +`aprs.APRS_IS`. Policies are immutable data: + +```python +from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class EnvelopePolicy: + source_pattern: str + destination_pattern: str + path_address_pattern: str + max_path_entries: int | None = None + max_information_bytes: int | None = None + max_tnc2_line_bytes: int | None = None +``` + +Each regular expression uses `fullmatch`. Path entries are checked individually, +without their trailing `*` repeated marker. `None` means no limit; zero means +zero entries or bytes. Invalid regular expressions, negative limits, and limits +that are not integers are rejected when constructing a policy. + +| Constraint | `aprs.RF` | `aprs.APRS_IS` | +| ------------------------------- | -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| Source | 1–6 uppercase ASCII letters/digits, optional numeric SSID 0–15 | At least 3 ASCII letters/digits, optional 1–2 alphanumeric SSID characters other than `-0`, at most 9 characters total | +| Destination and path address | Same format as RF source | At least 1 ASCII letter/digit, optional 1–2 alphanumeric SSID characters other than `-0`, at most 9 characters total | +| Path entries | 8 | No separate limit | +| Information bytes | 256 | No separate limit | +| TNC2 line bytes, including CRLF | No separate limit | 512 | + +APRS-IS patterns permit mixed case, including `qAR` in paths, and refuse SSID +`-0`, which APRS-IS drops because it conflicts with an absent SSID. Patterns check +individual formats, not q-construct ordering or network routing rules. The +APRS-IS limits follow the [server address rules](https://www.aprs-is.net/ServerDesign.aspx) +and [connection specification](https://www.aprs-is.net/Connecting.aspx). + +Information length counts every byte after the outer header's colon, including +third-party encapsulation. Line length includes the whole envelope plus a +canonical two-byte CRLF, even for unframed input or LF-terminated input. +These are byte limits, not character counts. Parsing measures received bytes; +validation and serialization measure newly encoded bytes, which can differ +after UTF-8 conversion or normalization. + +The selected envelope policy applies only to the outer packet. Inner third-party +headers remain text within its information field; they are not subjected to the +outer transport's address patterns or limits. Basic TNC2 syntax and payload +conformance checks still apply throughout the packet tree. + +```python +from dataclasses import replace +from hamkit import aprs + +packet = aprs.parse_packet(b"N0CALL>APRS,WIDE1-1:>Ready", policy=aprs.RF) +assert isinstance(packet, aprs.Packet) +assert aprs.check_packet(packet, policy=aprs.RF) == () +wire = aprs.serialize_packet(packet, policy=aprs.RF) + +custom = replace(aprs.RF, max_path_entries=None, max_information_bytes=200) +``` + +Parsing preserves decoded fields and reports policy violations in diagnostics. +Serialization refuses current violations; clearing stored diagnostics does not +bypass validation. Policies are separate from packet models and their JSON +schema. For configuration JSON, use `dataclasses.asdict(policy)` with +`json.dumps`, and reconstruct with `aprs.EnvelopePolicy(**json.loads(text))`; +`None` becomes JSON `null`. + +This replaces `EnvelopeProfile` and the `profile="rf"`/`profile="monitor"` +arguments. `policy=aprs.RF` replaces the RF profile. The new default `APRS_IS` +enforces address formats and the 512-byte line limit that `monitor` did not. +For explicit permissive envelope handling, use +`aprs.EnvelopePolicy(".*", ".*", ".*")`; basic syntax and payload checks still +apply. Payload-only APIs have no outer envelope and retain their existing +signatures. diff --git a/packages/aprs/docs/JSON_FORMAT.md b/packages/aprs/docs/JSON_FORMAT.md index 854eee0..8872ddc 100644 --- a/packages/aprs/docs/JSON_FORMAT.md +++ b/packages/aprs/docs/JSON_FORMAT.md @@ -178,12 +178,12 @@ Standalone tag: `measurement`. [Back to type map](#type-map-and-object-catalog). } ``` -| Field | JSON value / allowed values | Presence / default | -| ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | -| `type` | `"measurement"` | see [Tags](#tags) | -| `value` | finite number or null | **required** | -| `unit` | `'degrees'`, `'knots'`, `'mph'`, `'m/s'`, `'km/h'`, `'feet'`, `'meters'`, `'miles'`, `'nautical_miles'`, `'fahrenheit'`, `'celsius'`, `'percent'`, `'hPa'`, `'inches'`, `'mm'`, `'W/m2'`, `'watts'`, `'dBi'`, `'dB'`, `'S_units'`, `'count'`, `'raw'`, `'disputed_knots_or_mph'` | **required** | -| `raw` | Latin-1 byte string or null | optional; default `null` | +| Field | JSON value / allowed values | Presence / default | +| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------ | +| `type` | `"measurement"` | see [Tags](#tags) | +| `value` | finite number or null | **required** | +| `unit` | `'degrees'`, `'knots'`, `'mph'`, `'m/s'`, `'km/h'`, `'feet'`, `'meters'`, `'miles'`, `'nautical_miles'`, `'fahrenheit'`, `'celsius'`, `'percent'`, `'hPa'`, `'inches'`, `'mm'`, `'W/m2'`, `'nSv/h'`, `'volts'`, `'watts'`, `'dBi'`, `'dB'`, `'S_units'`, `'count'`, `'raw'`, `'disputed_knots_or_mph'` | **required** | +| `raw` | Latin-1 byte string or null | optional; default `null` | ### Timestamp @@ -563,6 +563,8 @@ Weather measurements are direct JSON properties; `weather` is not a JSON propert "luminosity": null, "rain_counter": null, "water_height": null, + "radiation": null, + "battery_voltage": null, "software_code": null, "device_code": null, "timestamp": { @@ -595,6 +597,8 @@ Weather measurements are direct JSON properties; `weather` is not a JSON propert | `luminosity` | [Measurement](#measurement) or null | optional; default `null` | | `rain_counter` | [Measurement](#measurement) or null | optional; default `null` | | `water_height` | [WaterHeight](#waterheight) or null | optional; default `null` | +| `radiation` | [Measurement](#measurement) or null | optional; default `null` | +| `battery_voltage` | [Measurement](#measurement) or null | optional; default `null` | | `software_code` | string or null | optional; default `null` | | `device_code` | string or null | optional; default `null` | | `timestamp` | [Timestamp](#timestamp) or null | optional; default `null` | @@ -650,16 +654,16 @@ Standalone tag: `telemetry`. [Back to type map](#type-map-and-object-catalog). } ``` -| Field | JSON value / allowed values | Presence / default | -| -------------- | ----------------------------------------------------------------------------------- | ----------------------------- | -| `type` | `"telemetry"` | see [Tags](#tags) | -| `analog` | array of finite number or null | optional; default `[]` | -| `digital` | array of boolean or null | optional; default `[]` | -| `sequence` | integer or `'MIC'` or null | optional; default `null` | -| `encoding` | `'classic'`, `'mic_e_hex'`, `'mic_e_binary'`, `'base91_comment'`, `'compatibility'` | optional; default `'classic'` | -| `comment` | string | optional; default `""` | -| `sequence_raw` | Latin-1 byte string or null | optional; default `null` | -| `raw` | Latin-1 byte string or null | optional; default `null` | +| Field | JSON value / allowed values | Presence / default | +| -------------- | ---------------------------------------------------------------- | ----------------------------- | +| `type` | `"telemetry"` | see [Tags](#tags) | +| `analog` | array of finite number or null | optional; default `[]` | +| `digital` | array of boolean or null | optional; default `[]` | +| `sequence` | integer or `'MIC'` or null | optional; default `null` | +| `encoding` | `'classic'`, `'mic_e_hex'`, `'mic_e_binary'`, `'base91_comment'` | optional; default `'classic'` | +| `comment` | string | optional; default `""` | +| `sequence_raw` | Latin-1 byte string or null | optional; default `null` | +| `raw` | Latin-1 byte string or null | optional; default `null` | ### Extensions @@ -695,6 +699,8 @@ Standalone tag: `extensions`. [Back to type map](#type-map-and-object-catalog). "luminosity": null, "rain_counter": null, "water_height": null, + "radiation": null, + "battery_voltage": null, "software_code": null, "device_code": null, "timestamp": null, @@ -2472,6 +2478,8 @@ Each allowed member is shown in its actual container, where it carries its tag. "luminosity": null, "rain_counter": null, "water_height": null, + "radiation": null, + "battery_voltage": null, "software_code": null, "device_code": null, "timestamp": { diff --git a/packages/aprs/docs/NAMING.md b/packages/aprs/docs/NAMING.md index 182262c..5214f42 100644 --- a/packages/aprs/docs/NAMING.md +++ b/packages/aprs/docs/NAMING.md @@ -41,7 +41,7 @@ the packet is sent, not a property of the model. | `Malformed` | Input with undecodable fields; a parse result, never a Packet or payload. | Named unions describe allowed values; they are not instantiable models or JSON -tags. Policy aliases such as `EnvelopeProfile`, `TimestampKind` and +tags. Type aliases such as `TimestampKind` and `TelemetryEncoding` include their subject so their values are understandable outside a field annotation. diff --git a/packages/aprs/docs/UNRESOLVED_SPEC.md b/packages/aprs/docs/UNRESOLVED_SPEC.md index d5f7fc0..a146322 100644 --- a/packages/aprs/docs/UNRESOLVED_SPEC.md +++ b/packages/aprs/docs/UNRESOLVED_SPEC.md @@ -6,8 +6,8 @@ exist on the wire or contradict another field, and conformance rules report APRS limits that a transmitter could still break. Received packets keep conformance findings as diagnostics; `serialize_packet` refuses to send them. The questions below are deliberately not resolved by guessing values, inventing sensor observations, or treating interoperability examples as -normative specifications. Wire codecs remain unavailable for these families -unless [API_COVERAGE.md](API_COVERAGE.md) states otherwise. +normative specifications. Implemented layouts and selected receiver policies are documented in +[API_COVERAGE.md](API_COVERAGE.md). APRS101 page numbers below are printed page numbers. PDF viewer pages are ten higher. The [APRS 1.1 addendum](https://www.aprs.org/aprs11.html) evolves over time; @@ -30,7 +30,8 @@ services such as aprs.fi decode UTF-8 in these fields. **Current behavior:** free-text fields decode as UTF-8; invalid UTF-8 falls back to Latin-1, one character per byte, with a nonconforming diagnostic. That fallback is a reversible reading, not proof of the sender's encoding; the exact bytes -remain in `original_wire`. The envelope profile (`monitor` or `rf`) selects +remain in `original_wire`. The envelope policy (`APRS_IS`, `RF`, or a custom +`EnvelopePolicy`) selects address and size rules, not a text encoding, so RF output also carries UTF-8. Free text is sent as UTF-8 and length limits count encoded bytes. Control characters are nonconforming. Protocol tokens (callsigns, addressees, message IDs, object and item names, query names, NTS @@ -52,7 +53,7 @@ fixes, but their keys remain required. Time, and the RMC date, remain required even for a void fix. No zero position, clock, date, talker ID or usable-fix flag is invented. GGA quality remains 0..8; newer mode fields are not represented. This is a limited model contract, not proof that absent times are prohibited by -every NMEA version. No NMEA wire codec exists. Unsupported sentences stay opaque. +every NMEA version. GGA/GLL/RMC/VTG/WPL codecs preserve these requirements. Unsupported sentences stay opaque. **What resolves it:** consult the versioned normative sentence tables and select the intended core and receiver extensions before changing omission semantics, @@ -72,12 +73,12 @@ describes date and variation, but a two-digit year does not identify a century. **Current behavior:** `VTG.speed_knots` and `speed_kmh_reported` remain separately reported observations; agreement is not enforced because numeric fields do not -retain the precision needed to compare rounded wire readings. They are not two -independent authoring sources for a future encoder. Calendar validation rejects +retain the precision needed to compare rounded wire readings. The encoder preserves both reported observations. Calendar validation rejects impossible dates, allowing February 29 in YY=00 without assigning a century. `checksum_valid` requires a supplied checksum, but is evidence about original -input, not certification of an edited sentence. No checksum is invented or -recomputed by the model. +input, not certification of an edited sentence. The model does not calculate +checksums; the encoder recomputes a supplied checksum, and refuses to send a +sentence still marked `checksum_valid=False` until the caller repairs it. **What resolves it:** define which speed is authoritative for composition and retain each received field's precision, or define an explicitly selected rounding @@ -92,8 +93,7 @@ allows sequence-only telemetry. The extension describes itself as experimental. **Current behavior:** conformance for `base91_comment` follows §3.7: a sequence in 0..8280 and at least one analog value are required. Digital data follows all five analog fields. Sequence-only data is unsupported by this model contract, not declared universally -malformed on receipt; there is no wire decoder for it. `compatibility` is an -explicitly unverified representation, not a named normative encoding. +malformed on receipt; the core decoder retains sequence-only blocks as comment text. **What resolves it:** choose a versioned extension profile or obtain an author clarification reconciling the documents. Do not silently expand the baseline by @@ -112,10 +112,16 @@ slot presence. There is no extra requirement for a numeric observation. A `Weather` model may be incomplete; only sending an incomplete report is refused. The later minimum flood example omits gust; proposed water units and examples -disagree across the documents. `WaterHeight` consequently remains a signed -measurement with explicit feet/meters and optional external datum metadata; no -water-wire encoding is inferred. `disputed_knots_or_mph` explicitly records -unresolved velocity units and must not be converted without a selected profile. +disagree across the documents. `WaterHeight` remains a signed measurement with +explicit feet/meters and optional external datum metadata. The two water-level +spellings are told apart by their syntax: a decimal value (`F20.1`, `f-1.2`) is +the 1.1 clarification's feet or meters, and four bytes without a decimal point +(`F0123`, `F-042`, `F....`) are the 1.2 proposal's tenths of a foot. The 1.2 +proposal's `Xnnn` radiation (two digits times a power of ten, nSv/h) and `Vnnn` +battery volts (tenths) decode into `radiation` and `battery_voltage`, with `...` +for unavailable, so they are never read as software/unit codes. +`disputed_knots_or_mph` explicitly records unresolved velocity units and must +not be converted without a selected profile. **What resolves it:** a chosen, cited water/flood profile and clarification of units, unavailable markers, field widths and mandatory slots. The blanket baseline @@ -145,19 +151,27 @@ and delimiter accounting before implementing a wire codec. **Authority:** [APRS101 pp28–30](https://www.aprs.org/doc/APRS101.PDF#page=38), [original protocol notes](https://www.aprs.org/APRS-docs/PROTOCOL.TXT), [DF notes](https://www.aprs.org/APRS-docs/DF.TXT), and -[PHG display guidance](https://www.aprs.org/symbols/PHGmobile.txt). +[PHG display guidance](https://www.aprs.org/symbols/PHGmobile.txt), and the +[PHGR proposal dated 26 February 2003](https://www.aprs.org/aprs12/probes.txt). **Current behavior:** code ranges and positive accuracy bounds are checked. The manual flag, bearing range and PHG radii are computed properties, so they cannot disagree with the codes. A single Q-to-accuracy or usability mapping is not imposed: the original notes omit Q=6 and differ from APRS101 at low Q values. `Bearing.usable` and accuracy remain reported -interpretations, not certified derivations. PHG rate-per-hour has no verified -extension authority here. Display half-radius is a documented display choice, +interpretations, not certified derivations. PHGR uses the documented +`PHGabcdr/` layout: `r` is `0`–`9` or `A`–`Z` (0–35 reports per hour), with zero +denoting an unscheduled transmission. Its slash is required and consumed by the +public decoder. The encoder emits the rate and slash before other extensions. +The older PHG form accepts an optional slash before the comment; surrounding +ASCII whitespace is trimmed for PHG comments. Other position comments and message +text do not acquire this normalization. This follows the PHGR note's delimiter +convention, not a universal rule in APRS101 (p20 says there is no separator unless +otherwise specified). Display half-radius is a documented display choice, not an independently transmitted observation. -**What resolves it:** identify a versioned DF mapping and a primary specification -for PHG rate. Do not silently combine conflicting tables or treat UI guidance as +**What resolves it:** identify a versioned DF mapping. Do not silently combine +conflicting tables or treat UI guidance as another on-air field. ## NWS, historical beacons and vendor weather @@ -192,19 +206,18 @@ contradictory overview's optional-timestamp wording. Semantic names exclude oute padding but do not impose every waypoint-friendly punctuation recommendation. Reply-ack is one `reply_ack` suffix on the message or acknowledgment ID, so the two cannot disagree; conformance checks that the combined field fits five -characters, and exact two-character halves are not forced. Obsolete object and -bulletin forms are not modeled as flags; they remain Opaque until a historical -profile defines them. +characters, and exact two-character halves are not forced. Truncated historical objects cannot construct the required public fields and +remain Malformed; no missing timestamp or position is invented. **What resolves it:** a documented compatibility profile for truncated kills, obsolete reports, stricter name conventions or shorter reply-ack halves. These choices must not weaken strict modern construction silently. -## Quantization and unimplemented codecs +## Quantization and wire precision Physical measurements and some derived fields can have more precision or a larger magnitude than a selected wire format can express. Current semantic -validation is not universal representability validation. Future encoders must +validation is not universal representability validation. Encoders must choose and document exact conversion, rounding, saturation-versus-rejection and field-budget rules. They must not round implicitly in constructors, truncate text, reuse stale raw evidence, or invent unavailable data. The original APRS101 widths diff --git a/packages/aprs/pyproject.toml b/packages/aprs/pyproject.toml index 2642337..bf74e83 100644 --- a/packages/aprs/pyproject.toml +++ b/packages/aprs/pyproject.toml @@ -79,3 +79,14 @@ explicit_package_bases = true # hamkit, as first-party keeps import order the same whichever directory ruff # runs from; otherwise package-dir and repository-root runs disagree. known-first-party = ["hamkit", "generate_json_reference", "model_examples", "vector_adapter"] + +[tool.hatch.envs.default] +extra-dependencies = ["pytest>=8,<10"] + +[tool.hatch.envs.default.scripts] +test = "pytest {args:tests}" + +[tool.pytest.ini_options] +testpaths = ["tests"] +pythonpath = ["tests"] +xfail_strict = true diff --git a/packages/aprs/src/hamkit/aprs/__init__.py b/packages/aprs/src/hamkit/aprs/__init__.py index 4295499..4baeba3 100644 --- a/packages/aprs/src/hamkit/aprs/__init__.py +++ b/packages/aprs/src/hamkit/aprs/__init__.py @@ -94,7 +94,6 @@ Diagnostic, DiagnosticCode, DirectStations, - EnvelopeProfile, ExternalExtension, Header, HeardStation, @@ -128,14 +127,17 @@ UserDefined, ) from ._nmea import GGA, GLL, RMC, VTG, WPL, NMEAMetadata, NMEASentence +from ._policy import APRS_IS, RF, EnvelopePolicy from ._transport import parse_tnc2_line, serialize_tnc2_line __all__ = [ + "APRS_IS", "DAO", "GGA", "GLL", "NMEA", "PHG", + "RF", "RMC", "VTG", "WPL", @@ -165,7 +167,7 @@ "DigitalChannels", "DirectStations", "EnvelopeError", - "EnvelopeProfile", + "EnvelopePolicy", "Extensions", "Extent", "ExternalExtension", diff --git a/packages/aprs/src/hamkit/aprs/_capabilities.py b/packages/aprs/src/hamkit/aprs/_capabilities.py index 08c114a..be6080c 100644 --- a/packages/aprs/src/hamkit/aprs/_capabilities.py +++ b/packages/aprs/src/hamkit/aprs/_capabilities.py @@ -3,8 +3,9 @@ # SPDX-License-Identifier: MIT """Discover codec availability without confusing model coverage with support.""" + from dataclasses import dataclass -from typing import Literal, TypeAlias +from typing import Literal, TypeAlias, cast from . import _models as m @@ -21,96 +22,149 @@ class CodecSupport: notes: str -_SUPPORT: tuple[CodecSupport, ...] = ( - CodecSupport( - m.Position, - "partial", - "partial", - "Uncompressed, unambiguous positions with course/speed, PHG, RNG, DFS, " - "DF bearing and /A= altitude. DAO, weather, storm, area, signpost and " - "base91 telemetry extensions are unsupported (Opaque).", - ), - CodecSupport( - m.Status, - "partial", - "partial", - "Text and DHM UTC timestamp; structured grid/symbol/beam are not encoded.", - ), - CodecSupport( - m.Message, - "partial", - "partial", - "Text, message ID and reply-ack; bulletins and other specialized messages " - "are separate families.", - ), - CodecSupport( - m.Acknowledgment, "implemented", "implemented", "ack/rej including reply-ack." - ), - CodecSupport( - m.MicE, - "unimplemented", - "unimplemented", - "Requires the packet header: the destination carries latitude and message bits.", - ), - CodecSupport( - m.ThirdParty, - "implemented", - "implemented", - "Bounded nesting; inner codec support still applies.", - ), - CodecSupport( - m.UserDefined, - "implemented", - "implemented", - "User ID/type and arbitrary binary data; no interpretation of user data.", - ), - CodecSupport( - m.Invalid, - "implemented", - "implemented", - "Explicit invalid/test DTI, never a trusted position.", - ), - CodecSupport( - m.Reserved, - "unimplemented", - "raw", - "Explicit DTI/data construction; decoding unknown DTIs returns Opaque.", - ), - CodecSupport( - m.Opaque, - "raw", - "raw", - "Unsupported content only; malformed input has a separate recovery result.", - ), - *( - CodecSupport( - model, - "unimplemented", - "unimplemented", - "Model and JSON only; the wire codec raises CodecNotImplementedError.", - ) - for model in ( +_SUPPORT: tuple[CodecSupport, ...] = tuple( + CodecSupport(model, cast(SupportLevel, decode), cast(SupportLevel, encode), notes) + for model, decode, encode, notes in ( + ( + m.Position, + "implemented", + "implemented", + "Uncompressed, ambiguous and compressed positions with structured extensions.", + ), + ( + m.MicE, + "implemented", + "implemented", + "Destination-dependent latitude/message; serialization requires a matching header.", + ), + ( + m.Status, + "implemented", + "implemented", + "Text, timestamp, grid/symbol and beam/ERP.", + ), + ( + m.Message, + "implemented", + "implemented", + "Message IDs and reply acknowledgments.", + ), + ( + m.Acknowledgment, + "implemented", + "implemented", + "ack/rej including reply-ack.", + ), + (m.ThirdParty, "implemented", "implemented", "Bounded nesting."), + ( + m.UserDefined, + "implemented", + "implemented", + "User ID/type and arbitrary data.", + ), + (m.Invalid, "implemented", "implemented", "Explicit invalid/test information."), + ( + m.Reserved, + "raw", + "raw", + "Unassigned DTIs decode as Opaque; explicit Reserved values can be composed.", + ), + ( + m.Opaque, + "raw", + "raw", + "Unknown information retained without invented semantics.", + ), + ( m.Object, + "implemented", + "implemented", + "Named live/killed objects, positions and extensions.", + ), + ( m.Item, + "implemented", + "implemented", + "Named live/killed items, positions and extensions.", + ), + ( m.Weather, + "implemented", + "implemented", + "Weather observations; absent and unavailable fields remain distinct.", + ), + ( m.Telemetry, + "implemented", + "implemented", + "Classic telemetry and context-specific extension encodings.", + ), + ( m.TelemetryDefinition, + "implemented", + "implemented", + "PARM, UNIT, EQNS and BITS definitions.", + ), + ( m.AutoAnswer, + "implemented", + "implemented", + "Automatic answers with previous acknowledgment.", + ), + ( m.Bulletin, + "implemented", + "implemented", + "Bulletins, announcements and groups.", + ), + ( m.NWSBulletin, - m.Radiogram, + "implemented", + "implemented", + "NWS bulletins with reference IDs.", + ), + (m.Radiogram, "implemented", "implemented", "NTS records."), + ( m.Query, + "implemented", + "implemented", + "General/directed queries, footprints and operands.", + ), + ( m.Response, - m.Capabilities, + "implemented", + "implemented", + "Direct stations, hourly heard counts and trace headers.", + ), + (m.Capabilities, "implemented", "implemented", "Ordered capability tokens."), + ( m.NMEA, + "implemented", + "implemented", + "GGA, GLL, RMC, VTG and WPL; checksum recomputed on send.", + ), + ( m.RawWeather, - m.Agrelo, - m.Maidenhead, + "partial", + "raw", + "Vendor information authoritative; Ultimeter 2000 numeric fields decoded.", + ), + (m.Agrelo, "implemented", "implemented", "Bearing and quality."), + (m.Maidenhead, "implemented", "implemented", "Historical grid beacons."), + ( m.LegacyPosition, - m.Beacon, + "implemented", + "implemented", + "X1J prefix with position within the first forty bytes.", + ), + (m.Beacon, "implemented", "implemented", "Recognized non-APRS beacons."), + ( m.ExternalExtension, - ) - ), + "raw", + "raw", + "Explicit extension bytes; no invented external grammar.", + ), + ) ) diff --git a/packages/aprs/src/hamkit/aprs/_codec.py b/packages/aprs/src/hamkit/aprs/_codec.py index 455e55b..da8429e 100644 --- a/packages/aprs/src/hamkit/aprs/_codec.py +++ b/packages/aprs/src/hamkit/aprs/_codec.py @@ -3,13 +3,16 @@ # SPDX-License-Identifier: MIT """Pure TNC2 parsing/composition; no AX.25, KISS, networking or radio I/O.""" + from __future__ import annotations import re -from dataclasses import dataclass +from dataclasses import dataclass, replace from typing import get_args -from . import _extensions +from . import _data as d +from . import _extensions, _messages +from . import _models as m from ._capabilities import codec_support_for from ._conformance import check from ._data import Symbol, Timestamp @@ -25,14 +28,12 @@ from ._fields import ( decode_coordinate, decode_timestamp, - encode_coordinate, encode_timestamp, ) from ._fields.position import CoordinateAxis from ._models import ( Acknowledgment, Diagnostic, - EnvelopeProfile, Header, Hop, Invalid, @@ -45,11 +46,11 @@ Payload, Position, Reserved, - Status, ThirdParty, UnsupportedPolicy, UserDefined, ) +from ._policy import APRS_IS, EnvelopePolicy from ._recovery import payload_data from ._text import free_text, token from ._validation import validate_tree @@ -72,24 +73,33 @@ @dataclass(frozen=True) class _Options: - profile: EnvelopeProfile + policy: EnvelopePolicy unsupported: UnsupportedPolicy malformed: MalformedPolicy max_depth: int + legacy_positions: bool = False def _options( - profile: str, unsupported: str, malformed: str, max_depth: object + policy: EnvelopePolicy, + unsupported: str, + malformed: str, + max_depth: object, + legacy_positions: object = False, ) -> _Options: - if profile not in ("monitor", "rf"): - raise ValueError("profile must be 'monitor' or 'rf'") + if not isinstance(policy, EnvelopePolicy): + raise TypeError("policy must be an EnvelopePolicy") if unsupported not in ("opaque", "raise"): raise ValueError("unsupported must be 'opaque' or 'raise'") if malformed not in ("return", "raise"): raise ValueError("malformed must be 'return' or 'raise'") if type(max_depth) is not int or not 0 <= max_depth <= 32: raise ValueError("max_third_party_depth must be an integer in 0..32") - return _Options(profile, unsupported, malformed, max_depth) # type: ignore[arg-type] + if type(legacy_positions) is not bool: + raise TypeError("legacy_positions must be a bool") + return _Options( + policy, unsupported, malformed, max_depth, legacy_positions # type: ignore[arg-type] + ) def _special_message(address: str, body: bytes) -> bool: @@ -141,7 +151,9 @@ def _decode_payload( if dti in (b"`", b"'", b"\x1c", b"\x1d"): if header is None: raise ContextRequiredError("Mic-E decoding requires header=Header(...)") - raise CodecNotImplementedError("Mic-E destination and information decoding") + from . import _mic_e + + return _mic_e.read(information, header, diagnostics) if dti == b"}": if depth >= options.max_depth: raise ResourceLimitError("third-party nesting limit reached") @@ -157,16 +169,103 @@ def _decode_payload( if dti == b",": return Invalid(body) if information.startswith((b"!!", b"$ULTW", b"#", b"*")): - raise CodecNotImplementedError("vendor raw-weather interpretation") + from . import _weather + + return m.RawWeather( + ( + "ultimeter_2000" + if information.startswith((b"!!", b"$ULTW")) + else "ultimeter_ii" + ), + information, + weather=_weather.vendor(information), + ) if dti in (b"!", b"=", b"/", b"@"): return _decode_position(dti, body, diagnostics) if dti == b">": - timestamp = None - if len(body) >= 7 and body[:6].isdigit() and body[6:7] == b"z": - timestamp, body = _timestamp(body[:7]), body[7:] - return Status(free_text(body, "$.text", diagnostics), timestamp=timestamp) + return _messages.status(body, diagnostics) + if dti == b"?": + return _messages.query(information) + if dti == b"<": + tokens = [] + for part in token(body, "$.tokens").split(","): + name, sep, value = part.partition("=") + tokens.append(d.Capability(name, value if sep else None)) + return m.Capabilities(tuple(tokens)) + if information.startswith(b"T#"): + return _messages.telemetry(information, diagnostics) + if dti == b"_": + from . import _weather + + return _weather.read(body, diagnostics=diagnostics)[0] + if dti == b";": + if len(body) < 17 or body[9:10] not in (b"*", b"_"): + raise FieldError("invalid object name or alive marker") + name = token(body[:9], "$.name").rstrip() + position = _decode_position(b"/", body[10:], diagnostics) + assert position.timestamp is not None + return m.Object( + name, + position.latitude_deg, + position.longitude_deg, + position.symbol, + timestamp=position.timestamp, + alive=body[9:10] == b"*", + comment=position.comment, + ambiguity=position.ambiguity, + compression=position.compression, + extensions=position.extensions, + ) + if dti == b")": + match = re.match(rb"([^!_]{1,9})([!_])(.*)", body, re.DOTALL) + if not match: + raise FieldError("invalid item name or marker") + position = _decode_position(b"!", match[3], diagnostics) + return m.Item( + token(match[1], "$.name"), + position.latitude_deg, + position.longitude_deg, + position.symbol, + alive=match[2] == b"!", + comment=position.comment, + ambiguity=position.ambiguity, + compression=position.compression, + extensions=position.extensions, + ) + if dti == b"$": + from . import _nmea_codec + + return _nmea_codec.read(information, header, diagnostics) + if dti == b"[": + match = re.match(rb"([A-Ra-r]{2}\d{2}(?:[A-Xa-x]{2})?)(.*)", body, re.DOTALL) + if not match: + raise FieldError("invalid Maidenhead locator") + return m.Maidenhead( + d.Grid(match[1].decode().upper()), + comment=free_text(match[2], "$.comment", diagnostics), + ) + if dti == b"%": + match = re.fullmatch(rb"%(\d{3})/(\d)", information) + if match: + return m.Agrelo(int(match[1]), int(match[2]), raw=information) if dti == b":": return _decode_message(body, diagnostics) + # APRS101 p.18 lets a position start within the first 40 bytes of other + # text (X1J); the APRS 1.1 addendum deprecates that search, so it is opt-in. + offset = information.find(b"!") if options.legacy_positions else -1 + if 0 < offset < 40: + return m.LegacyPosition( + information[:offset], + _decode_position(b"!", information[offset + 1 :], diagnostics), + ) + if ( + header is not None + and header.destination.split("-")[0] in ("BEACON", "ID", "UIDIGI", "CQ") + or len(information) > 1 + and information[:1].isalpha() + and b" " in information + ): + return m.Beacon(free_text(information, "$.text", diagnostics)) raise CodecNotImplementedError("unsupported information field family") @@ -176,34 +275,63 @@ def _decode_position( timestamp = None if dti in (b"/", b"@"): timestamp, body = _timestamp(body[:7]), body[7:] - if body and body[:1] in b"/\\ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij": - raise CodecNotImplementedError("compressed positions") - # Compressed numeric overlays can start with a digit, but not a DDMM. field. - if ( - len(body) >= 5 - and body[4:5] != b"." - and body[:1] in b"0123456789" - and body[7:8] not in (b"N", b"S") - and body[17:18] not in (b"E", b"W") - ): - raise CodecNotImplementedError("compressed or unsupported position format") + from . import _position_codec as pc + + compressed = bool( + body + and ( + body[:1] in b"/\\ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij" + or (len(body) >= 13 and body[4:5] != b"." and body[7:8] not in (b"N", b"S")) + ) + ) + if compressed: + latitude, longitude, symbol, compression, primary, rest = pc.compressed(body) + if body[10] != 32 and body[12] - 33 >= 64: + diagnostics.append( + Diagnostic( + "nonconforming", "reserved compression type bit", "$.compression" + ) + ) + extensions, rest = _extensions.read(rest, symbol) + for name in ("motion", "altitude", "range"): + value = getattr(primary, name) + if value is not None: + extensions = replace(extensions, **{name: value}) + if symbol.code in "_W" and primary.motion is not None: + weather = extensions.weather or d.Weather() + weather = replace( + weather, + wind_direction=d.Measurement(primary.motion.course_deg, "degrees"), + wind_speed=d.Measurement(primary.motion.speed_knots, "knots"), + ) + extensions = replace(extensions, motion=None, weather=weather) + return Position( + pc.dao_offset(latitude, extensions.dao, "latitude"), + pc.dao_offset(longitude, extensions.dao, "longitude"), + symbol, + compression=compression, + extensions=extensions, + timestamp=timestamp, + messaging=dti in (b"=", b"@"), + comment=free_text(rest, "$.comment", diagnostics), + ) if len(body) < 19: raise ModelError("$", "truncated uncompressed position") - latitude = _coordinate(body[:8], "latitude") - longitude = _coordinate(body[9:18], "longitude") + latitude, longitude, ambiguity = pc.coordinates(body[:8], body[9:18]) try: symbol = Symbol(chr(body[8]), chr(body[18])) except ModelError as exc: raise ModelError("$.symbol" + exc.path[1:], exc.message) from exc extensions, rest = _extensions.read(body[19:], symbol) return Position( - latitude, - longitude, + pc.dao_offset(latitude, extensions.dao, "latitude"), + pc.dao_offset(longitude, extensions.dao, "longitude"), symbol, comment=free_text(rest, "$.comment", diagnostics), messaging=dti in (b"=", b"@"), timestamp=timestamp, extensions=extensions, + ambiguity=ambiguity, ) @@ -215,7 +343,9 @@ def _decode_message(body: bytes, diagnostics: list[Diagnostic]) -> Payload: address = token(body[:9], "$.addressee").rstrip(" ") body = body[10:] if _special_message(address, body): - raise CodecNotImplementedError("specialized message semantics") + special = _messages.specialized(address, body, diagnostics) + if special is not None: + return special ack = _ACK.fullmatch(body) if ack: return Acknowledgment( @@ -230,6 +360,10 @@ def _decode_message(body: bytes, diagnostics: list[Diagnostic]) -> Payload: number, brace, ack_part = identifier.partition(b"}") message_id = token(number, "$.message_id") reply_ack = token(ack_part, "$.reply_ack") if brace else None + if not separator: + response = _messages.response(address, text) + if response is not None: + return response return Message( address, free_text(text, "$.text", diagnostics), @@ -297,6 +431,10 @@ def address(path: str, raw_token: bytes) -> str | None: if not separator: issue("$.payload", "missing information separator") + if envelope.count(b">") > 1 and b"," not in envelope: + parts = envelope.split(b">") + if all(parts): + envelope = parts[0] + b">" + parts[-1] + b"," + b",".join(parts[1:-1]) source, arrow, route = envelope.partition(b">") if not arrow: issue("$.header", "missing source separator") @@ -349,23 +487,23 @@ def address(path: str, raw_token: bytes) -> str | None: assert header is not None and payload is not None assert not isinstance(payload, Malformed) found = _prefixed("$.payload", found) - if options.profile == "rf" and len(information) > 256: - found.append( - Diagnostic("nonconforming", "RF information exceeds 256 bytes", "$.payload") - ) + policy = options.policy if depth == 0 else None + if policy is not None: + found.extend(_envelope_sizes(policy, len(information), len(raw) + 2)) packet = Packet(header, payload, original_wire=raw) # Findings are computed from the finished packet; set them once, in place. - object.__setattr__(packet, "diagnostics", (*found, *check(packet, options.profile))) + object.__setattr__(packet, "diagnostics", (*found, *check(packet, policy))) return packet, found def parse_packet( wire: bytes, *, - profile: EnvelopeProfile = "monitor", + policy: EnvelopePolicy = APRS_IS, unsupported: UnsupportedPolicy = "opaque", malformed: MalformedPolicy = "return", max_third_party_depth: int = 4, + legacy_positions: bool = False, ) -> Packet | Malformed: """Parse one unframed TNC2 packet, such as ``b"N0CALL>APRS:>Ready"``. @@ -373,14 +511,19 @@ def parse_packet( are listed in Packet.diagnostics as "nonconforming". Fields that cannot be decoded yield a Malformed with recovered values (or raise with malformed="raise"). Families without a decoder become Opaque (or raise with - unsupported="raise"). profile="rf" adds AX.25 address and size findings. + unsupported="raise"). The envelope policy defaults to APRS_IS; pass RF for + AX.25 address and size constraints, or supply a custom EnvelopePolicy. CR/LF is never stripped; use parse_tnc2_line for line-oriented input. + legacy_positions=True restores the deprecated APRS101 search for a "!" + position within the first 40 bytes of other text (LegacyPosition). """ if not isinstance(wire, bytes): raise TypeError( "parse_packet requires bytes; encode text first, e.g. line.encode()" ) - options = _options(profile, unsupported, malformed, max_third_party_depth) + options = _options( + policy, unsupported, malformed, max_third_party_depth, legacy_positions + ) return _parse(wire, options, 0)[0] @@ -391,6 +534,7 @@ def parse_payload( unsupported: UnsupportedPolicy = "opaque", malformed: MalformedPolicy = "return", max_third_party_depth: int = 4, + legacy_positions: bool = False, ) -> Payload | Malformed: """Decode an information field alone. Mic-E always requires header. @@ -398,7 +542,9 @@ def parse_payload( """ if not isinstance(information, bytes): raise TypeError("parse_payload requires bytes") - options = _options("monitor", unsupported, malformed, max_third_party_depth) + options = _options( + APRS_IS, unsupported, malformed, max_third_party_depth, legacy_positions + ) if header is not None: validate_tree(header) return _recover_payload(information, header, options, 0, []) @@ -416,10 +562,69 @@ def _encode_payload( payload: Payload, header: Header | None, max_depth: int, depth: int ) -> bytes: """Construct an information field from validated, conforming values.""" + application = _messages.write(payload) + if application is not None: + return application + if isinstance(payload, m.Weather): + from . import _weather + + return _weather.write(payload) + if isinstance(payload, (m.Object, m.Item)): + p = payload + position = Position( + p.latitude_deg, + p.longitude_deg, + p.symbol, + comment=p.comment, + ambiguity=p.ambiguity, + compression=p.compression, + extensions=p.extensions, + ) + raw = _encode_payload(position, header, max_depth, depth)[1:] + if isinstance(p, m.Object): + return ( + b";" + + p.name.ljust(9).encode() + + (b"*" if p.alive else b"_") + + encode_timestamp(p.timestamp) + + raw + ) + return b")" + p.name.encode() + (b"!" if p.alive else b"_") + raw + if isinstance(payload, m.NMEA): + from . import _nmea_codec + + if payload.symbol is not None and payload.symbol != _nmea_codec.header_symbol( + header + ): + raise FieldError("NMEA symbol does not match the packet header") + return _nmea_codec.write(payload) + if isinstance(payload, (m.RawWeather, m.ExternalExtension)): + return payload.information + if isinstance(payload, m.Agrelo): + return b"%%%03d/%d" % (round(payload.bearing_deg), payload.quality_code) + if isinstance(payload, m.Maidenhead): + return ( + b"[" + + payload.grid.locator.encode() + + ( + payload.symbol.table_id.encode() + payload.symbol.code.encode() + if payload.symbol + else b"" + ) + + payload.comment.encode() + ) + if isinstance(payload, m.Beacon): + return payload.text.encode() + if isinstance(payload, m.LegacyPosition): + return payload.prefix + _encode_payload( + payload.position, header, max_depth, depth + ) if isinstance(payload, MicE): if header is None: raise ContextRequiredError("Mic-E encoding needs the packet header") - raise CodecNotImplementedError("Mic-E joint destination/information encoding") + from . import _mic_e + + return _mic_e.write(payload, header) if isinstance(payload, ThirdParty): if depth >= max_depth: raise ResourceLimitError("third-party nesting limit reached") @@ -433,8 +638,6 @@ def _encode_payload( if isinstance(payload, Opaque): return payload.information if isinstance(payload, Position): - if payload.compression is not None or payload.ambiguity: - raise CodecNotImplementedError("compressed or ambiguous position encoding") raw = ( (b"@" if payload.messaging else b"/") if payload.timestamp @@ -442,23 +645,36 @@ def _encode_payload( ) if payload.timestamp is not None: raw += encode_timestamp(payload.timestamp) + from . import _position_codec as pc + symbol = payload.symbol + extensions = payload.extensions + payload = replace( + payload, + latitude_deg=pc.dao_offset( + payload.latitude_deg, extensions.dao, "latitude", -1 + ), + longitude_deg=pc.dao_offset( + payload.longitude_deg, extensions.dao, "longitude", -1 + ), + ) + if payload.compression is not None: + position_wire, extensions = pc.compressed_bytes(payload) + else: + position_wire = ( + pc.coordinate_bytes(payload.latitude_deg, "latitude", payload.ambiguity) + + symbol.table_id.encode() + + pc.coordinate_bytes( + payload.longitude_deg, "longitude", payload.ambiguity + ) + + symbol.code.encode() + ) return ( raw - + encode_coordinate(payload.latitude_deg, "latitude") - + symbol.table_id.encode("ascii") - + encode_coordinate(payload.longitude_deg, "longitude") - + symbol.code.encode("ascii") - + _extensions.write(payload.extensions, symbol) + + position_wire + + _extensions.write(extensions, symbol, payload.comment.encode("utf-8")) + payload.comment.encode("utf-8") ) - if isinstance(payload, Status): - if payload.grid is not None or payload.beam is not None: - raise CodecNotImplementedError("structured status grid/symbol/beam") - raw = b">" - if payload.timestamp is not None: - raw += encode_timestamp(payload.timestamp) - return raw + payload.text.encode("utf-8") if isinstance(payload, (Message, Acknowledgment)): raw = b":" + payload.addressee.ljust(9).encode("ascii") + b":" reply = b"" if payload.reply_ack is None else b"}" + payload.reply_ack.encode() @@ -468,6 +684,13 @@ def _encode_payload( verb = b"rej" if payload.rejected else b"ack" return raw + verb + payload.message_id.encode("ascii") + reply body = payload.text.encode("utf-8") + if ( + payload.message_id is None + and _messages.response(payload.addressee, body) is not None + ): + raise FieldError( + "message text would be interpreted as a query response; use Response" + ) if _special_message(payload.addressee, body): raise CodecNotImplementedError("specialized message") if payload.message_id is not None: @@ -494,26 +717,56 @@ def _bound_depth(value: Packet | Payload, max_depth: int) -> None: payload = payload.packet.payload +def _envelope_sizes( + policy: EnvelopePolicy, information_bytes: int, line_bytes: int +) -> tuple[Diagnostic, ...]: + """Measure the outer envelope, including canonical CRLF for line limits.""" + result = [] + if ( + policy.max_information_bytes is not None + and information_bytes > policy.max_information_bytes + ): + result.append( + Diagnostic( + "nonconforming", + f"information exceeds {policy.max_information_bytes} bytes", + "$.payload", + ) + ) + if ( + policy.max_tnc2_line_bytes is not None + and line_bytes > policy.max_tnc2_line_bytes + ): + result.append( + Diagnostic( + "nonconforming", + f"TNC2 line exceeds {policy.max_tnc2_line_bytes} bytes including CRLF", + "$", + ) + ) + return tuple(result) + + def _findings( - value: Packet | Payload, profile: EnvelopeProfile, max_depth: int + value: Packet | Payload, policy: EnvelopePolicy, max_depth: int ) -> tuple[Diagnostic, ...]: - """Conformance findings, plus the RF information size of an encodable packet.""" - findings = check(value, profile) - if isinstance(value, Packet) and profile == "rf": + """Conformance findings, including the encoded outer envelope size.""" + findings = check(value, policy) + if isinstance(value, Packet) and ( + policy.max_information_bytes is not None + or policy.max_tnc2_line_bytes is not None + ): try: information = _encode_payload(value.payload, value.header, max_depth, 0) except (CodecNotImplementedError, ContextRequiredError, FieldError): return findings # Reported elsewhere; there are no bytes to measure. - if len(information) > 256: - size = Diagnostic( - "nonconforming", "RF information exceeds 256 bytes", "$.payload" - ) - findings = (*findings, size) + line_bytes = len(str(value.header).encode("ascii")) + 1 + len(information) + 2 + findings = (*findings, *_envelope_sizes(policy, len(information), line_bytes)) return findings def _ready_to_send( - value: Packet | Payload, profile: EnvelopeProfile, max_depth: int + value: Packet | Payload, policy: EnvelopePolicy, max_depth: int ) -> None: _bound_depth(value, max_depth) validate_tree(value) @@ -522,8 +775,16 @@ def _ready_to_send( raise ContextRequiredError( "Mic-E encoding needs the header; use serialize_packet" ) + if ( + isinstance(payload, m.NMEA) + and payload.symbol is not None + and not isinstance(value, Packet) + ): + raise ContextRequiredError( + "NMEA symbol encoding needs the header; use serialize_packet" + ) _require_codecs(payload) - findings = _findings(value, profile, max_depth) + findings = _findings(value, policy, max_depth) if findings: raise ConformanceError(findings) @@ -531,7 +792,7 @@ def _ready_to_send( def serialize_packet( packet: Packet, *, - profile: EnvelopeProfile = "monitor", + policy: EnvelopePolicy = APRS_IS, max_third_party_depth: int = 4, ) -> bytes: """Encode a packet for sending. Never replays original_wire. @@ -539,29 +800,32 @@ def serialize_packet( Every packet is validated first: ResourceLimitError for excessive third-party nesting, ModelError for invalid fields, CodecNotImplementedError for families without an encoder, and ConformanceError (with every finding) - for anything outside APRS rules. profile="rf" also applies AX.25 address - and information-size limits. + for anything outside APRS rules or the selected envelope policy. The default + policy is APRS_IS; pass RF or a custom EnvelopePolicy as needed. """ if not isinstance(packet, Packet): raise TypeError("serialize_packet requires a Packet; repair a Malformed first") - options = _options(profile, "raise", "raise", max_third_party_depth) - _ready_to_send(packet, options.profile, options.max_depth) + options = _options(policy, "raise", "raise", max_third_party_depth) + _ready_to_send(packet, options.policy, options.max_depth) return _serialize(packet, options.max_depth, 0) def serialize_payload(payload: Payload, *, max_third_party_depth: int = 4) -> bytes: - """Encode an information field alone, with the same validation as packets.""" + """Encode an information field alone, with the same payload validation as packets. + + Mic-E and NMEA with an explicit symbol need header context; use serialize_packet. + """ if isinstance(payload, (Packet, Malformed)): raise TypeError("serialize_payload requires a payload model") - options = _options("monitor", "raise", "raise", max_third_party_depth) - _ready_to_send(payload, options.profile, options.max_depth) + options = _options(APRS_IS, "raise", "raise", max_third_party_depth) + _ready_to_send(payload, options.policy, options.max_depth) return _encode_payload(payload, None, options.max_depth, 0) def check_packet( packet: Packet, *, - profile: EnvelopeProfile = "monitor", + policy: EnvelopePolicy = APRS_IS, max_third_party_depth: int = 4, ) -> tuple[Diagnostic, ...]: """Every conformance finding serialize_packet would raise, without raising. @@ -570,19 +834,17 @@ def check_packet( """ if not isinstance(packet, Packet): raise TypeError("check_packet requires a Packet") - options = _options(profile, "raise", "raise", max_third_party_depth) + options = _options(policy, "raise", "raise", max_third_party_depth) _bound_depth(packet, options.max_depth) validate_tree(packet) - return _findings(packet, options.profile, options.max_depth) + return _findings(packet, options.policy, options.max_depth) def validate_packet( packet: Packet, *, - profile: EnvelopeProfile = "monitor", + policy: EnvelopePolicy = APRS_IS, max_third_party_depth: int = 4, ) -> None: """Raise exactly as serialize_packet would; return None when it can be sent.""" - serialize_packet( - packet, profile=profile, max_third_party_depth=max_third_party_depth - ) + serialize_packet(packet, policy=policy, max_third_party_depth=max_third_party_depth) diff --git a/packages/aprs/src/hamkit/aprs/_conformance.py b/packages/aprs/src/hamkit/aprs/_conformance.py index df74a77..11bd202 100644 --- a/packages/aprs/src/hamkit/aprs/_conformance.py +++ b/packages/aprs/src/hamkit/aprs/_conformance.py @@ -9,6 +9,7 @@ the APRS 1.2 proposed-draft guidance (aprs.org/aprs12/utf-8.txt), adopted for compatibility rather than as a ratified requirement. """ + from __future__ import annotations import re @@ -32,15 +33,15 @@ TelemetryUnits, Weather, ) -from ._errors import CodecNotImplementedError +from ._errors import APRSError, CodecNotImplementedError, FieldError from ._models import ( + NMEA, Acknowledgment, AutoAnswer, Bulletin, Capabilities, Diagnostic, DirectStations, - EnvelopeProfile, Header, HeardStation, Item, @@ -54,10 +55,11 @@ Status, Trace, ) +from ._policy import EnvelopePolicy from ._validation import _fields, walk Finding = tuple[str, str] -_Rule = Callable[[Any, EnvelopeProfile], Iterable[Finding]] +_Rule = Callable[[Any, EnvelopePolicy | None], Iterable[Finding]] _RULES: dict[type, list[_Rule]] = {} @@ -83,12 +85,17 @@ def _plan(model: type) -> tuple[tuple[str, ...], tuple[_Rule, ...]]: return plan -def check(value: Any, profile: EnvelopeProfile = "monitor") -> tuple[Diagnostic, ...]: +def check(value: Any, policy: EnvelopePolicy | None = None) -> tuple[Diagnostic, ...]: """Every conformance finding in a model graph, with JSON-style paths.""" - result = [] + result: list[Diagnostic] = [] + if isinstance(value, Weather): + result.extend( + Diagnostic("nonconforming", message, path) + for path, message in _weather_report(value, "$", positioned=False) + ) for node, path in walk(value): - # RF limits apply to the transmitted header, not third-party inner ones. - node_profile = profile if path in ("$", "$.header") else "monitor" + # Envelope policies apply to the outer header, not encapsulated text. + node_policy = policy if path in ("$", "$.header") else None free, rules = _plan(type(node)) for name in free: if _has_control(getattr(node, name)): @@ -100,7 +107,7 @@ def check(value: Any, profile: EnvelopeProfile = "monitor") -> tuple[Diagnostic, ) ) for rule in rules: - for relative, message in rule(node, node_profile): + for relative, message in rule(node, node_policy): result.append(Diagnostic("nonconforming", message, path + relative[1:])) return tuple(result) @@ -124,40 +131,50 @@ def _text( # Envelope ------------------------------------------------------------------ -_RF_ADDRESS = re.compile(r"[A-Z0-9]{1,6}(?:-(?:[0-9]|1[0-5]))?") - @_conformance(Header) -def _header(v: Header, profile: EnvelopeProfile) -> Iterator[Finding]: - if profile != "rf": +def _header(v: Header, policy: EnvelopePolicy | None) -> Iterator[Finding]: + if policy is None: return - for name, address in (("source", v.source), ("destination", v.destination)): - if not _RF_ADDRESS.fullmatch(address): - yield f"$.{name}", "not a valid AX.25 address or SSID" + for name, address, pattern in ( + ("source", v.source, policy.source_pattern), + ("destination", v.destination, policy.destination_pattern), + ): + if re.fullmatch(pattern, address) is None: + yield f"$.{name}", f"address does not match {name}_pattern" for i, hop in enumerate(v.path): - if not _RF_ADDRESS.fullmatch(hop.address): - yield f"$.path[{i}].address", "not a valid AX.25 address or SSID" - if len(v.path) > 8: - yield "$.path", "RF paths have at most eight hops" + if re.fullmatch(policy.path_address_pattern, hop.address) is None: + yield f"$.path[{i}].address", "address does not match path_address_pattern" + if policy.max_path_entries is not None and len(v.path) > policy.max_path_entries: + yield "$.path", f"path exceeds {policy.max_path_entries} entries" @_conformance(Packet) -def _packet(v: Packet, profile: EnvelopeProfile) -> Iterator[Finding]: +def _packet(v: Packet, policy: EnvelopePolicy | None) -> Iterator[Finding]: payload = v.payload if isinstance(payload, Weather): yield from _weather_report(payload, "$.payload", positioned=False) - if isinstance(payload, Telemetry) and payload.encoding not in ( - "classic", - "compatibility", - ): + if isinstance(payload, Telemetry) and payload.encoding != "classic": yield "$.payload.encoding", "comment and Mic-E telemetry need a position report" + if isinstance(payload, MicE): + from . import _mic_e + + try: + _mic_e.position_bytes(payload, v.header) + except FieldError as exc: + yield "$.header.destination", str(exc) + if isinstance(payload, NMEA) and payload.symbol is not None: + from ._nmea_codec import header_symbol + + if payload.symbol != header_symbol(v.header): + yield "$.payload.symbol", "NMEA symbol does not match the packet header" # Status and messages ------------------------------------------------------- @_conformance(Status) -def _status(v: Status, profile: EnvelopeProfile) -> Iterator[Finding]: +def _status(v: Status, policy: EnvelopePolicy | None) -> Iterator[Finding]: yield from _text("text", v.text, None) size = _size(v.text) + (7 if v.timestamp is not None else 0) if v.grid is not None: @@ -171,7 +188,7 @@ def _status(v: Status, profile: EnvelopeProfile) -> Iterator[Finding]: @_conformance(Message) -def _message(v: Message, profile: EnvelopeProfile) -> Iterator[Finding]: +def _message(v: Message, policy: EnvelopePolicy | None) -> Iterator[Finding]: yield from _text("text", v.text, 67) reply = v.reply_ack if reply is not None and v.message_id and len(v.message_id) + 1 + len(reply) > 5: @@ -179,13 +196,13 @@ def _message(v: Message, profile: EnvelopeProfile) -> Iterator[Finding]: @_conformance(Acknowledgment) -def _ack(v: Acknowledgment, profile: EnvelopeProfile) -> Iterator[Finding]: +def _ack(v: Acknowledgment, policy: EnvelopePolicy | None) -> Iterator[Finding]: if v.reply_ack is not None and len(v.message_id) + 1 + len(v.reply_ack) > 5: yield "$.reply_ack", "reply-ack ID and ack exceed five characters" @_conformance(AutoAnswer) -def _auto_answer(v: AutoAnswer, profile: EnvelopeProfile) -> Iterator[Finding]: +def _auto_answer(v: AutoAnswer, policy: EnvelopePolicy | None) -> Iterator[Finding]: suffix = 1 + len(v.previous_ack) if v.previous_ack is not None else 0 yield from _text("text", v.text, 67 - 3 - suffix) if v.previous_ack is not None and len(v.previous_ack) > 2: @@ -193,7 +210,7 @@ def _auto_answer(v: AutoAnswer, profile: EnvelopeProfile) -> Iterator[Finding]: @_conformance(Bulletin, NWSBulletin) -def _bulletin(v: Any, profile: EnvelopeProfile) -> Iterator[Finding]: +def _bulletin(v: Any, policy: EnvelopePolicy | None) -> Iterator[Finding]: yield from _text("text", v.text, 67) @@ -201,7 +218,7 @@ def _bulletin(v: Any, profile: EnvelopeProfile) -> Iterator[Finding]: @_conformance(TelemetryParameters, TelemetryUnits) -def _labels(v: Any, profile: EnvelopeProfile) -> Iterator[Finding]: +def _labels(v: Any, policy: EnvelopePolicy | None) -> Iterator[Finding]: if not 1 <= len(v.channels) <= len(_CHANNEL_LIMITS): yield "$.channels", "requires one to thirteen channels" for i, (channel, limit) in enumerate(zip(v.channels, _CHANNEL_LIMITS)): @@ -210,13 +227,15 @@ def _labels(v: Any, profile: EnvelopeProfile) -> Iterator[Finding]: @_conformance(TelemetryEquations) -def _equations(v: TelemetryEquations, profile: EnvelopeProfile) -> Iterator[Finding]: +def _equations( + v: TelemetryEquations, policy: EnvelopePolicy | None +) -> Iterator[Finding]: if not 1 <= len(v.coefficients) <= 5: yield "$.coefficients", "requires one to five channels" @_conformance(TelemetryBits) -def _bits(v: TelemetryBits, profile: EnvelopeProfile) -> Iterator[Finding]: +def _bits(v: TelemetryBits, policy: EnvelopePolicy | None) -> Iterator[Finding]: yield from _text("project_title", v.project_title, 23, "|~{") @@ -240,7 +259,7 @@ def _nts_values(v: Any) -> list[str]: @_conformance(NTSHeader, NTSAddress, NTSPhone, NTSText, NTSSignature, NTSRouting) -def _nts(v: Any, profile: EnvelopeProfile) -> Iterator[Finding]: +def _nts(v: Any, policy: EnvelopePolicy | None) -> Iterator[Finding]: if isinstance(v, NTSHeader): if not re.fullmatch(r"(?:SVC )?[1-9][0-9]*", v.number): yield "$.number", "requires a positive number, optionally after SVC" @@ -274,7 +293,7 @@ def _nts(v: Any, profile: EnvelopeProfile) -> Iterator[Finding]: @_conformance(Query) -def _query(v: Query, profile: EnvelopeProfile) -> Iterator[Finding]: +def _query(v: Query, policy: EnvelopePolicy | None) -> Iterator[Finding]: if v.name in _GENERAL_QUERIES and v.addressee is not None: yield "$.addressee", "general queries have no addressee" if v.name in _DIRECTED_QUERIES and v.addressee is None: @@ -291,18 +310,18 @@ def _query(v: Query, profile: EnvelopeProfile) -> Iterator[Finding]: @_conformance(Footprint) -def _footprint(v: Footprint, profile: EnvelopeProfile) -> Iterator[Finding]: +def _footprint(v: Footprint, policy: EnvelopePolicy | None) -> Iterator[Finding]: if v.radius_miles > 9999 or v.radius_miles != int(v.radius_miles): yield "$.radius_miles", "requires whole miles in 0..9999" @_conformance(DirectStations) -def _direct(v: DirectStations, profile: EnvelopeProfile) -> Iterator[Finding]: +def _direct(v: DirectStations, policy: EnvelopePolicy | None) -> Iterator[Finding]: yield from _text("stations", "Directs= " + " ".join(v.stations), 67) @_conformance(HeardStation) -def _heard(v: HeardStation, profile: EnvelopeProfile) -> Iterator[Finding]: +def _heard(v: HeardStation, policy: EnvelopePolicy | None) -> Iterator[Finding]: if len(v.counts) != 8: yield "$.counts", "requires eight hourly slots (None when unavailable)" counts = " ".join("." if x is None else str(x) for x in v.counts) @@ -310,12 +329,24 @@ def _heard(v: HeardStation, profile: EnvelopeProfile) -> Iterator[Finding]: @_conformance(Trace) -def _trace(v: Trace, profile: EnvelopeProfile) -> Iterator[Finding]: +def _trace(v: Trace, policy: EnvelopePolicy | None) -> Iterator[Finding]: yield from _text("header", str(v.header) + ":", 67) +@_conformance(NMEA) +def _nmea(v: NMEA, policy: EnvelopePolicy | None) -> Iterator[Finding]: + # The encoder computes a fresh checksum, so sending a sentence received with + # a bad one would make corrupt data look verified. Require explicit repair: + # clear checksum_valid (or omit the checksum) once the fields are trusted. + if v.metadata.checksum_valid is False: + yield ( + "$.metadata.checksum_valid", + "NMEA checksum mismatch; clear checksum_valid to repair before sending", + ) + + @_conformance(Capabilities) -def _capabilities(v: Capabilities, profile: EnvelopeProfile) -> Iterator[Finding]: +def _capabilities(v: Capabilities, policy: EnvelopePolicy | None) -> Iterator[Finding]: if not v.tokens: yield "$.tokens", "a capabilities report requires at least one token" for i, token in enumerate(v.tokens): @@ -329,30 +360,82 @@ def _capabilities(v: Capabilities, profile: EnvelopeProfile) -> Iterator[Finding @_conformance(Item) -def _item(v: Item, profile: EnvelopeProfile) -> Iterator[Finding]: +def _item(v: Item, policy: EnvelopePolicy | None) -> Iterator[Finding]: if len(v.name) < 3: yield "$.name", "item names have at least three characters" -@_conformance(Position) -def _position(v: Position, profile: EnvelopeProfile) -> Iterator[Finding]: +# APRS101 pp.63-66 end every weather report with the optional software (S) and +# unit (uuuu) codes and define no comment after them, so the decoder reads codes +# only when they end the report. Text after them would hide the codes. +WEATHER_CODES_LAST = ( + "weather software/unit codes must end the report; a comment cannot follow them" +) +WEATHER_COMMENT_AS_CODES = "comment would be read back as weather software/unit codes" + + +def _weather_comment(weather: Any, comment: str) -> str | None: + """Why a comment after weather data would not read back unchanged.""" + if not comment: + return None + if weather.software_code or weather.device_code: + return WEATHER_CODES_LAST + from ._weather import CODES + + if CODES.fullmatch(comment.encode("utf-8")): + return WEATHER_COMMENT_AS_CODES + return None + + +def _weather_exempt_bytes(extensions: Any) -> int: + """Encoded weather bytes outside the 43-byte position-comment budget. + + Uncompressed wind (ddd/sss) occupies the 7-byte data-extension slot, which + the budget still counts, leaving 36 comment bytes as for course/speed. The + other weather fields, and all of them when wind is in compressed csT, are + structured data rather than comment. Envelope limits still apply to them. + """ + w = extensions.weather + if w is None: + return 0 + from . import _weather + + compressed_wind = w.wind_direction is None and w.wind_speed is None + encoded = _weather.write(w, positioned=True, compressed=compressed_wind) + return len(encoded) - (0 if compressed_wind else 7) + + +@_conformance(Position, Object, Item) +def _position(v: Position, policy: EnvelopePolicy | None) -> Iterator[Finding]: """The encoded tail must read back as the same extensions and comment.""" - if v.compression is not None or v.ambiguity: - return # No encoder yet; serialization raises CodecNotImplementedError. + if any(_located(v, policy)): + return # Report structural slot errors without secondary comment errors. try: - prefix = _extensions.write(v.extensions, v.symbol) + extensions = v.extensions + if v.compression is not None: + from ._position_codec import compressed_bytes + + _, extensions = compressed_bytes(v) + prefix = _extensions.write(extensions, v.symbol, v.comment.encode("utf-8")) except CodecNotImplementedError: return except _extensions.Unrepresentable as exc: yield exc.path, exc.message return + except FieldError as exc: + yield "$.extensions", str(exc) + return comment = v.comment.encode("utf-8") - if len(prefix) + len(comment) > 43: + problem = extensions.weather and _weather_comment(extensions.weather, v.comment) + if problem: + yield "$.comment", problem + return + if len(prefix) - _weather_exempt_bytes(extensions) + len(comment) > 43: yield "$.comment", "extensions and comment exceed 43 bytes" try: expected, _ = _extensions.read(prefix, v.symbol) actual, rest = _extensions.read(prefix + comment, v.symbol) - except CodecNotImplementedError: + except (CodecNotImplementedError, FieldError): yield "$.comment", "contains extension syntax this version cannot decode" return if (actual, rest) != (expected, comment): @@ -362,7 +445,7 @@ def _position(v: Position, profile: EnvelopeProfile) -> Iterator[Finding]: @_conformance(Position, Object, Item, MicE) -def _located(v: Any, profile: EnvelopeProfile) -> Iterator[Finding]: +def _located(v: Any, policy: EnvelopePolicy | None) -> Iterator[Finding]: e = v.extensions symbol = (v.symbol.table_id, v.symbol.code) primary = [ @@ -388,14 +471,14 @@ def _located(v: Any, profile: EnvelopeProfile) -> Iterator[Finding]: if getattr(e, name) is not None and symbol != required: yield "$.symbol", f"{name} requires symbol {''.join(required)}" if e.weather is not None: - if v.symbol.code != "_": + if v.symbol.code not in "_W": yield "$.symbol", "located weather uses the weather symbol" if primary or e.bearing is not None: yield "$.extensions.weather", "weather uses the wind extension slot" yield from _weather_report(e.weather, "$.extensions.weather", positioned=True) if e.telemetry is not None: allowed = ( - ("mic_e_hex", "mic_e_binary") + ("mic_e_hex", "mic_e_binary", "base91_comment") if isinstance(v, MicE) else ("base91_comment",) ) @@ -404,13 +487,36 @@ def _located(v: Any, profile: EnvelopeProfile) -> Iterator[Finding]: if isinstance(v, MicE): if e.motion is None: yield "$.extensions.motion", "Mic-E always carries course and speed" + yield from _mic_e_status(v) return if v.compression is not None: yield from _compressed(v) +def _mic_e_status(v: MicE) -> Iterator[Finding]: + """The type code and status text must read back as composed.""" + from . import _mic_e + + try: + _mic_e.device_parts(v.device_code) + except APRSError: + yield "$.device_code", "not a declared Mic-E type code" + return + if v.extensions.telemetry and any(_telemetry(v.extensions.telemetry, None)): + return # Channel findings are reported when walking the telemetry model. + try: + device, _, comment = _mic_e.read_status(_mic_e.write_status(v), v.symbol) + except APRSError as error: + yield "$.device_code", str(error) + return + if (device, comment) != (v.device_code, v.comment.encode()): + yield "$.comment", "would be read back as a different Mic-E type code" + + def _compressed(v: Any) -> Iterator[Finding]: e, csT = v.extensions, v.compression + if v.symbol.table_id in "0123456789": + yield "$.symbol.table_id", "compressed numeric overlays require a-j, not 0-9" if any(getattr(e, n) is not None for n in ("phg", "signal", "area", "bearing")): yield "$.extensions", "not available in the compressed position layout" altitude = e.altitude is not None and e.altitude.encoding == "compressed" @@ -445,7 +551,20 @@ def _weather_report(w: Weather, path: str, positioned: bool) -> Iterator[Finding @_conformance(Weather) -def _weather(v: Weather, profile: EnvelopeProfile) -> Iterator[Finding]: +def _weather(v: Weather, policy: EnvelopePolicy | None) -> Iterator[Finding]: + problem = _weather_comment(v, v.comment) + if problem: + yield "$.comment", problem + elif v.comment: + from . import _weather as codec + + try: + back, _ = codec.read(codec.write(v)[1:]) + except APRSError: + pass # Missing slots and unencodable values are reported separately. + else: + if back.comment != v.comment: + yield "$.comment", "comment would be read back as weather fields" for name in ( "wind_direction", "wind_speed", @@ -459,6 +578,8 @@ def _weather(v: Weather, profile: EnvelopeProfile) -> Iterator[Finding]: "snow_24h", "luminosity", "rain_counter", + "radiation", + "battery_voltage", ): reading: Measurement | None = getattr(v, name) if reading is None or reading.value is None: @@ -467,6 +588,16 @@ def _weather(v: Weather, profile: EnvelopeProfile) -> Iterator[Finding]: high = {"humidity": 100, "wind_direction": 360}.get(name, float("inf")) if not low <= reading.value <= high: yield f"$.{name}.value", "reading outside the quantity's range" + if v.radiation is not None and v.radiation.value is not None: + from . import _weather as codec + + try: + codec.radiation_code(v.radiation.value) + except FieldError: + yield "$.radiation.value", "requires two digits times a power of ten" + volts = v.battery_voltage.value if v.battery_voltage is not None else None + if volts is not None and round(volts * 10) > 999: + yield "$.battery_voltage.value", "exceeds the three-digit tenths field" if v.software_code is not None and len(v.software_code) != 1: yield "$.software_code", "requires one character" if v.device_code is not None and not 2 <= len(v.device_code) <= 4: @@ -474,9 +605,11 @@ def _weather(v: Weather, profile: EnvelopeProfile) -> Iterator[Finding]: @_conformance(Telemetry) -def _telemetry(v: Telemetry, profile: EnvelopeProfile) -> Iterator[Finding]: - def analog(low: int, high: int) -> Iterator[Finding]: +def _telemetry(v: Telemetry, policy: EnvelopePolicy | None) -> Iterator[Finding]: + def analog(low: int, high: int, missing: tuple[int, ...] = ()) -> Iterator[Finding]: for i, value in enumerate(v.analog): + if i in missing and value is None: + continue if ( value is None or not float(value).is_integer() @@ -498,7 +631,14 @@ def analog(low: int, high: int) -> Iterator[Finding]: counts = (2, 5) if v.encoding == "mic_e_hex" else (5,) if len(v.analog) not in counts: yield "$.analog", f"{v.encoding} carries {' or '.join(map(str, counts))} channels" - yield from analog(0, 255) + missing = ( + (1, 3, 4) + if v.encoding == "mic_e_hex" + and len(v.analog) == 5 + and all(v.analog[i] is None for i in (1, 3, 4)) + else () + ) + yield from analog(0, 255, missing) if v.digital: yield "$.digital", "Mic-E telemetry has no digital channels" if v.sequence is not None: @@ -517,5 +657,3 @@ def analog(low: int, high: int) -> Iterator[Finding]: yield "$.digital", "eight binary channels follow five analog channels" if v.comment: yield "$.comment", "base91 telemetry uses the report comment" - elif not v.analog and not v.digital: - yield "$.analog", "at least one channel is required" diff --git a/packages/aprs/src/hamkit/aprs/_data.py b/packages/aprs/src/hamkit/aprs/_data.py index f5fd6c8..d8a31ee 100644 --- a/packages/aprs/src/hamkit/aprs/_data.py +++ b/packages/aprs/src/hamkit/aprs/_data.py @@ -37,6 +37,8 @@ "inches", "mm", "W/m2", + "nSv/h", + "volts", "watts", "dBi", "dB", @@ -307,6 +309,8 @@ class Weather(Validated): luminosity: Measurement | None = None rain_counter: Measurement | None = None water_height: WaterHeight | None = None + radiation: Measurement | None = None + battery_voltage: Measurement | None = None software_code: str | None = None device_code: str | None = None timestamp: Timestamp | None = None @@ -330,7 +334,7 @@ class Storm(Validated): AnalogChannels: TypeAlias = tuple[float | None, ...] DigitalChannels: TypeAlias = tuple[bool | None, ...] TelemetryEncoding: TypeAlias = Literal[ - "classic", "mic_e_hex", "mic_e_binary", "base91_comment", "compatibility" + "classic", "mic_e_hex", "mic_e_binary", "base91_comment" ] diff --git a/packages/aprs/src/hamkit/aprs/_extensions.py b/packages/aprs/src/hamkit/aprs/_extensions.py index d0a693f..de97f08 100644 --- a/packages/aprs/src/hamkit/aprs/_extensions.py +++ b/packages/aprs/src/hamkit/aprs/_extensions.py @@ -1,18 +1,20 @@ # SPDX-FileCopyrightText: 2024-present Adam Fourney # SPDX-License-Identifier: MIT -"""Uncompressed position data extensions (APRS101 ch. 7) and /A= altitude. +"""APRS position extensions and their shared read/write grammar. -read() and write() share one grammar, so conformance can check that a comment -is read back as the same comment. Valid course/speed, PHG, RNG, DFS, DF bearing -and /A= altitude are decoded. Extension-shaped text with invalid values stays in -the comment (and conformance reports it). Recognized syntax this version cannot -decode yet raises CodecNotImplementedError, so it is never mistaken for comment. +Decode motion, radio/DF fields, weather, storm/area/signpost descriptors, altitude, +DAO and telemetry. Invalid extension-shaped text remains inspectable as comment +with a conformance finding. Wire evidence never overrides semantic fields. """ + from __future__ import annotations import math import re +from dataclasses import replace +from typing import Any, Literal, cast +from . import _data as d from ._data import ( PHG, Altitude, @@ -25,11 +27,13 @@ Symbol, ) from ._errors import CodecNotImplementedError, FieldError +from ._text import token _FIELD = rb"(\d{3}|\.{3}| {3})" _COURSE_SPEED = re.compile(_FIELD + rb"/" + _FIELD) _BEARING = re.compile(rb"/(\d{3})/(\d)(\d)(\d)") _PHG = re.compile(rb"PHG(\d)([0-9:;])(\d)([0-8])") +_PHGR_RATES = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" _RNG = re.compile(rb"RNG(\d{4})") _DFS = re.compile(rb"DFS(\d)([0-9:;])(\d)([0-8])") _ALTITUDE = re.compile(rb"/A=(-\d{5}|\d{6})") @@ -52,24 +56,6 @@ def _is_df(symbol: Symbol) -> bool: return (symbol.table_id, symbol.code) == ("/", "\\") -def _unsupported(tail: bytes, symbol: Symbol) -> None: - starts_with_motion = _COURSE_SPEED.match(tail) is not None - if symbol.code == "_" and starts_with_motion: - raise CodecNotImplementedError("positioned weather report") - if symbol.code == "@" and symbol.table_id in "/\\" and starts_with_motion: - raise CodecNotImplementedError("storm report") - if (symbol.table_id, symbol.code) == ("\\", "l") and re.match( - rb"T\d\d/C\d\d", tail - ): - raise CodecNotImplementedError("area object descriptor") - if (symbol.table_id, symbol.code) == ("\\", "m") and b"{" in tail: - raise CodecNotImplementedError("signpost label") - if _DAO.search(tail): - raise CodecNotImplementedError("!DAO! precision and datum extension") - if _BASE91_TELEMETRY.search(tail): - raise CodecNotImplementedError("base91 comment telemetry") - - def _height(code: bytes) -> float: return 10.0 * 2 ** (code[0] - ord("0")) @@ -106,9 +92,29 @@ def _motion(match: re.Match[bytes], df: bool) -> Motion | None: def read(tail: bytes, symbol: Symbol) -> tuple[Extensions, bytes]: """Split decoded extensions from the information after an uncompressed symbol.""" - _unsupported(tail, symbol) - found: dict[str, object] = {} - if match := _COURSE_SPEED.match(tail): + + found: dict[str, Any] = {} + if symbol.code in "_W" and ( + _COURSE_SPEED.match(tail) or tail.startswith((b"g", b"t", b"c")) + ): + from . import _weather + + weather, tail = _weather.read( + tail, positioned=True, compressed=not bool(_COURSE_SPEED.match(tail)) + ) + found["weather"] = weather + elif (symbol.table_id, symbol.code) == ("\\", "l") and ( + match := re.match(rb"(\d)(\d{2})(/[0-9]|1[0-5])(\d{2})(?:\{([0-9.]+)\})?", tail) + ): + found["area"] = d.Area( + int(match[1]), + int(match[3].lstrip(b"/")), + int(match[2]), + int(match[4]), + corridor_half_width_miles=float(match[5]) if match[5] else None, + ) + tail = tail[match.end() :] + elif match := _COURSE_SPEED.match(tail): if (motion := _motion(match, _is_df(symbol))) is not None: found["motion"] = motion tail = tail[7:] @@ -131,6 +137,17 @@ def read(tail: bytes, symbol: Symbol) -> tuple[Extensions, bytes]: raw=match[0][3:], ) tail = tail[7:] + # PHGR (aprs.org/aprs12/probes.txt) requires both the rate character + # and its delimiter. Without '/', a digit/letter belongs to the comment. + if re.match(rb"[0-9A-Z]/", tail): + found["phg"] = replace( + found["phg"], rate_per_hour=_PHGR_RATES.index(tail[0]) + ) + tail = tail[2:] + elif tail.startswith(b"/") and not _ALTITUDE.match(tail): + # The older PHG form also commonly separates its comment with '/'. + # Consume one delimiter, but leave /A= altitude for the decoder below. + tail = tail[1:] elif match := _RNG.match(tail): found["range"] = Range(int(match[1]), raw=match[0]) tail = tail[7:] @@ -143,13 +160,82 @@ def read(tail: bytes, symbol: Symbol) -> tuple[Extensions, bytes]: raw=match[0], ) tail = tail[7:] + if symbol.code == "@" and ( + match := re.match( + rb"/(HC|TS|TD)/(\d{3})\^(\d{3})/(\d{4})>(\d{3})&(\d{3})(?:%(\d{3}))?", tail + ) + ): + found["storm"] = d.Storm( + cast(Literal["HC", "TS", "TD"], match[1].decode()), + predicted=symbol.table_id == "/", + sustained_wind_knots=int(match[2]), + peak_gust_knots=int(match[3]), + central_pressure_hpa=int(match[4]), + hurricane_radius_nm=int(match[5]), + tropical_storm_radius_nm=int(match[6]), + whole_gale_radius_nm=int(match[7]) if match[7] else None, + ) + tail = tail[match.end() :] + if (symbol.table_id, symbol.code) == ("\\", "m") and ( + match := re.search(rb"\{([^{}]{1,3})\}", tail) + ): + found["signpost"] = d.Signpost(token(match[1], "$.extensions.signpost.label")) + tail = tail[: match.start()] + tail[match.end() :] + if match := _BASE91_TELEMETRY.search(tail): + from ._position_codec import base91 + + raw = match[0][1:-1] + values = [base91(raw[i : i + 2]) for i in range(0, len(raw), 2)] + digital = ( + tuple(bool(values[-1] & (1 << i)) for i in range(8)) + if len(values) == 7 + else () + ) + found["telemetry"] = d.Telemetry( + tuple(values[1:6]), + digital, + sequence=values[0], + encoding="base91_comment", + raw=match[0], + ) + tail = tail[: match.start()] + tail[match.end() :] + if match := re.search(rb"!([A-Za-z])([\x20-\x7b]{2})!", tail): + datum = match[1].decode() + pair = match[2] + if pair == b" ": + dao = d.DAO(datum, raw=match[0]) + elif datum.isupper() and pair.isdigit(): + dao = d.DAO( + datum, + latitude_precision=int(chr(pair[0])), + longitude_precision=int(chr(pair[1])), + encoding="decimal", + raw=match[0], + ) + elif datum.islower() and all(33 <= c <= 123 for c in pair): + dao = d.DAO( + datum, + latitude_precision=pair[0] - 33, + longitude_precision=pair[1] - 33, + encoding="base91", + raw=match[0], + ) + else: + dao = None + if dao: + found["dao"] = dao + tail = tail[: match.start()] + tail[match.end() :] if match := _ALTITUDE.search(tail): feet = int(match[1]) found["altitude"] = Altitude( Measurement(feet, "feet", raw=match[1]), "feet_extension" ) tail = tail[: match.start()] + tail[match.end() :] - return Extensions(**found), tail # type: ignore[arg-type] + if "phg" in found: + # PHG/PHGR's presentation convention ignores surrounding whitespace. + # This is not a general rule for message text or other position comments. + tail = tail.strip() + return Extensions(**found), tail def lookalikes( @@ -220,7 +306,9 @@ def _motion_bytes(m: Motion) -> bytes: return b"%03d/%03d" % (course, speed) -def write(extensions: Extensions, symbol: Symbol) -> bytes: +def _write_primary( + extensions: Extensions, symbol: Symbol, comment: bytes = b"" +) -> bytes: """The bytes read() would split back into these extensions.""" e = extensions for name in ("dao", "area", "signpost", "weather", "storm", "telemetry"): @@ -230,8 +318,6 @@ def write(extensions: Extensions, symbol: Symbol) -> bytes: raise CodecNotImplementedError(f"{e.altitude.encoding} altitude encoding") if e.altitude is not None and e.altitude.reference != "unspecified": raise CodecNotImplementedError("altitude reference cannot be encoded in /A=") - if e.phg is not None and e.phg.rate_per_hour is not None: - raise CodecNotImplementedError("PHG rate extension encoding") if e.bearing is not None and ( e.bearing.usable is not None or e.bearing.accuracy_less_than_deg is not None ): @@ -277,6 +363,17 @@ def write(extensions: Extensions, symbol: Symbol) -> bytes: ) raw += b"%d" % _code("$.extensions.phg.gain_dbi", p.gain_dbi, 0, 9) raw += _directivity_code("$.extensions.phg.directivity_deg", p.directivity_deg) + if p.rate_per_hour is not None: + if not 0 <= p.rate_per_hour < len(_PHGR_RATES): + raise Unrepresentable( + "$.extensions.phg.rate_per_hour", "requires 0..35 (0-9 or A-Z)" + ) + # Terminate PHGR before altitude or other extensions, too. + raw += _PHGR_RATES[p.rate_per_hour : p.rate_per_hour + 1] + b"/" + elif comment.startswith(b"/") or re.match(rb"[0-9A-Z]/", comment): + # The optional separator protects comments that would otherwise + # lose their leading slash or be read as a PHGR rate. + raw += b"/" elif e.range is not None: raw += b"RNG%04d" % _rounded("$.extensions.range.miles", e.range.miles, 0, 9999) elif e.signal is not None: @@ -299,3 +396,112 @@ def write(extensions: Extensions, symbol: Symbol) -> bytes: ) raw += b"/A=-%05d" % -feet if feet < 0 else b"/A=%06d" % feet return raw + + +def write(extensions: Extensions, symbol: Symbol, comment: bytes = b"") -> bytes: + e = extensions + extra = b"" + if e.weather: + from . import _weather + + extra += _weather.write( + e.weather, + positioned=True, + compressed=e.weather.wind_direction is None + and e.weather.wind_speed is None, + ) + if e.area: + a = e.area + extra += ( + b"%d%02d" % (a.shape_code, a.latitude_offset_code) + + (b"/%d" % a.color_code if a.color_code < 10 else b"%02d" % a.color_code) + + b"%02d" % a.longitude_offset_code + ) + if a.corridor_half_width_miles is not None: + extra += b"{" + f"{a.corridor_half_width_miles:g}".encode() + b"}" + if e.storm: + s = e.storm + extra += ( + b"/" + + s.kind.encode() + + b"/%03d^%03d/%04d>%03d&%03d" + % ( + _rounded( + "$.extensions.storm.sustained_wind_knots", + s.sustained_wind_knots, + 0, + 999, + ), + _rounded( + "$.extensions.storm.peak_gust_knots", s.peak_gust_knots, 0, 999 + ), + _rounded( + "$.extensions.storm.central_pressure_hpa", + s.central_pressure_hpa, + 0, + 9999, + ), + _rounded( + "$.extensions.storm.hurricane_radius_nm", + s.hurricane_radius_nm, + 0, + 999, + ), + _rounded( + "$.extensions.storm.tropical_storm_radius_nm", + s.tropical_storm_radius_nm, + 0, + 999, + ), + ) + ) + if s.whole_gale_radius_nm is not None: + extra += b"%%%03d" % _rounded( + "$.extensions.storm.whole_gale_radius_nm", + s.whole_gale_radius_nm, + 0, + 999, + ) + if e.signpost: + extra += b"{" + e.signpost.label.encode() + b"}" + if e.dao: + dao = e.dao + if not dao.datum_byte.isascii() or not dao.datum_byte.isalpha(): + raise Unrepresentable( + "$.extensions.dao.datum_byte", "DAO requires a datum letter" + ) + if dao.encoding is not None and ( + dao.latitude_precision is None or dao.longitude_precision is None + ): + raise FieldError("DAO precision is required") + pair = ( + b" " + if dao.encoding is None + else bytes( + [ + cast(int, dao.latitude_precision) + + (48 if dao.encoding == "decimal" else 33), + cast(int, dao.longitude_precision) + + (48 if dao.encoding == "decimal" else 33), + ] + ) + ) + extra += b"!" + dao.datum_byte.encode() + pair + b"!" + if e.telemetry: + from ._position_codec import pack91 + + t = e.telemetry + if t.encoding != "base91_comment" or not isinstance(t.sequence, int): + raise FieldError("comment telemetry requires base91 encoding and sequence") + values = [t.sequence, *t.analog] + if t.digital: + if len(t.analog) != 5: + raise FieldError("digital comment telemetry requires five analog slots") + values.append(sum(int(bool(v)) << i for i, v in enumerate(t.digital))) + if any(v is None or v != int(v) for v in values): + raise FieldError("base91 telemetry requires integer channels") + extra += b"|" + b"".join(pack91(int(cast(float, v)), 2) for v in values) + b"|" + primary = replace( + e, dao=None, area=None, signpost=None, weather=None, storm=None, telemetry=None + ) + return _write_primary(primary, symbol, comment) + extra diff --git a/packages/aprs/src/hamkit/aprs/_fields/timestamp.py b/packages/aprs/src/hamkit/aprs/_fields/timestamp.py index 65af130..99b0634 100644 --- a/packages/aprs/src/hamkit/aprs/_fields/timestamp.py +++ b/packages/aprs/src/hamkit/aprs/_fields/timestamp.py @@ -2,15 +2,17 @@ # # SPDX-License-Identifier: MIT -"""Seven-byte APRS DHM and HMS timestamps (APRS101 pp. 22–23).""" +"""APRS DHM, HMS and eight-byte MDHM weather timestamps.""" from .._data import Timestamp -from .._errors import CodecNotImplementedError, FieldError +from .._errors import FieldError def encode_timestamp(value: Timestamp) -> bytes: if value.kind == "mdhm_utc": - raise CodecNotImplementedError("MDHM weather timestamp") + return ( + f"{value.month:02}{value.day:02}{value.hour:02}{value.minute:02}".encode() + ) if value.month is not None: raise FieldError("month is only valid in MDHM timestamps") if not all(type(n) is int for n in (value.hour, value.minute)): @@ -39,7 +41,7 @@ def encode_timestamp(value: Timestamp) -> bytes: def decode_timestamp(raw: bytes) -> Timestamp: if len(raw) == 8 and raw.isdigit(): - raise CodecNotImplementedError("MDHM weather timestamp") + return Timestamp.mdhm(int(raw[:2]), int(raw[2:4]), int(raw[4:6]), int(raw[6:8])) if len(raw) != 7 or not raw[:6].isdigit(): raise FieldError("timestamp must contain six digits and a suffix") a, b, c = int(raw[:2]), int(raw[2:4]), int(raw[4:6]) diff --git a/packages/aprs/src/hamkit/aprs/_messages.py b/packages/aprs/src/hamkit/aprs/_messages.py new file mode 100644 index 0000000..1e30b4b --- /dev/null +++ b/packages/aprs/src/hamkit/aprs/_messages.py @@ -0,0 +1,413 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Addressed APRS applications, queries, status, and telemetry definitions.""" + +from __future__ import annotations + +import re +from typing import Any, cast + +from . import _data as d +from . import _models as m +from ._errors import APRSError, FieldError +from ._fields import decode_timestamp, encode_timestamp +from ._text import free_text, token + + +def query(body: bytes, address: str | None = None) -> m.Query: + match = re.match(rb"\?([A-Z][A-Z0-9]*)(\??)(.*)", body, re.DOTALL) + if not match: + raise FieldError("invalid query") + name = match[1].decode() + rest = match[3] + footprint = None + heard = None + if address is None and name == "APRS" and rest: + values = rest.strip().split(b",") + if len(values) == 3: + try: + footprint = d.Footprint( + d.Coordinates(float(values[0]), float(values[1])), float(values[2]) + ) + rest = b"" + except ValueError as exc: + raise FieldError("invalid query footprint") from exc + elif name == "APRSH" and rest: + heard = token(rest.strip(), "$.heard_station") + rest = b"" + return m.Query( + name, + addressee=address, + footprint=footprint, + heard_station=heard, + arguments=rest, + ) + + +def status(body: bytes, diagnostics: list) -> m.Status: + timestamp = None + grid = None + symbol = None + beam = None + if re.match(rb"\d{6}z", body): + timestamp = decode_timestamp(body[:7]) + body = body[7:] + else: + match = re.match( + rb"([A-Ra-r]{2}\d{2}(?:[A-Xa-x]{2})?)([/\\0-9A-Z])([!-~])", body + ) + if match: + grid = d.Grid(match[1].decode().upper()) + symbol = d.Symbol(match[2].decode(), match[3].decode()) + body = body[match.end() :] + match = re.search(rb"\^([0-9A-Z])([0-K])$", body) + if match: + heading = int(chr(match[1][0]), 36) * 10 + beam = d.Beam(heading, 10 * (match[2][0] - 48) ** 2, raw=match[0]) + body = body[: match.start()] + return m.Status( + free_text(body, "$.text", diagnostics), + timestamp=timestamp, + grid=grid, + symbol=symbol, + beam=beam, + ) + + +def definition(address: str, body: bytes) -> m.TelemetryDefinition: + tag = body[:5] + values = token(body[5:], "$.definition").split(",") + value: d.TelemetryDefinitionValue + if tag in (b"PARM.", b"UNIT."): + value = (d.TelemetryParameters if tag == b"PARM." else d.TelemetryUnits)( + tuple(v or None for v in values) + (None,) * max(0, 13 - len(values)) + ) + elif tag == b"EQNS.": + if len(values) % 3: + raise FieldError("EQNS requires complete triples") + triples = [] + for i in range(0, len(values), 3): + v = values[i : i + 3] + try: + triples.append( + None if v == ["", "", ""] else d.Calibration(*map(float, v)) + ) + except ValueError as exc: + raise FieldError("invalid EQNS coefficient") from exc + value = d.TelemetryEquations(tuple(triples)) + else: + if not re.fullmatch("[01]{8}", values[0]): + raise FieldError("BITS requires eight bits") + value = d.TelemetryBits( + cast(Any, tuple(v == "1" for v in values[0])), + project_title=",".join(values[1:]), + ) + return m.TelemetryDefinition(address, value) + + +def specialized(address: str, body: bytes, diagnostics: list): + if body.startswith((b"PARM.", b"UNIT.", b"EQNS.", b"BITS.")): + return definition(address, body) + if body.startswith(b"?"): + return query(body, address) + if body.startswith(b"AA:"): + text, sep, ack = body[3:].rpartition(b"}") + return m.AutoAnswer( + address, + free_text(text if sep else body[3:], "$.text", diagnostics), + previous_ack=token(ack, "$.previous_ack") if sep else None, + ) + if address.startswith("BLN"): + if len(address) < 4: + raise FieldError("bulletin requires identifier") + return m.Bulletin( + address[3], + free_text(body, "$.text", diagnostics), + group=address[4:] or None, + ) + if address.startswith("NWS-"): + text, sep, ref = body.partition(b"{") + return m.NWSBulletin( + address, + free_text(text, "$.text", diagnostics), + reference_id=token(ref, "$.reference_id") if sep else None, + ) + if re.match(rb"N[#AP1-6SR]\\", body): + content, sep, identifier = body.partition(b"{") + values = token(content, "$.record").split("\\") + tag = values.pop(0) + if values and values[-1] == "": + values.pop() + record: d.NTSRecord + try: + if tag == "N#": + if len(values) != 8: + raise ValueError("NTS header requires eight fields") + record = d.NTSHeader( + **dict( + zip( + ( + "number", + "precedence", + "handling", + "originator", + "check", + "place", + "time", + "date", + ), + values, + ) + ) + ) + elif tag == "NA": + record = d.NTSAddress(cast(Any, tuple(values))) + elif tag == "NP": + record = d.NTSPhone(*values) + elif tag == "NS": + record = d.NTSSignature(*values) + elif tag == "NR": + if len(values) != 4: + raise ValueError("NTS routing requires four fields") + record = d.NTSRouting( + **dict( + zip( + ("received_from", "received_at", "sent_to", "sent_at"), + values, + ) + ) + ) + else: + record = d.NTSText(cast(Any, int(tag[1])), *values) + except (ValueError, TypeError) as exc: + raise FieldError("invalid NTS record") from exc + return m.Radiogram( + address, + record, + message_id=token(identifier, "$.message_id") if sep else None, + ) + return None + + +def response(address: str, body: bytes): + """Recognize the three documented directed-query response grammars. + + Text that does not match a grammar completely is an ordinary message. + """ + try: + if re.fullmatch(rb"Directs=(?: [A-Za-z0-9-]{1,9})+", body): + return m.Response( + address, + m.DirectStations(tuple(body[9:].decode("ascii").split())), + ) + match = re.fullmatch( + rb"([A-Za-z0-9-]+) HEARD: ((?:[0-9]+|\.)(?: (?:[0-9]+|\.)){7})", body + ) + if match: + return m.Response( + address, + m.HeardStation( + match[1].decode(), + tuple(None if c == b"." else int(c) for c in match[2].split()), + ), + ) + if re.fullmatch(rb"[A-Za-z0-9-]+>[A-Za-z0-9,*-]+:", body): + return m.Response(address, m.Trace(m.Header.parse(body[:-1].decode()))) + except APRSError: + pass + return None + + +def telemetry(raw: bytes, diagnostics: list) -> d.Telemetry: + match = re.match(rb"T#(MIC|\d+),?", raw) + if not match: + raise FieldError("invalid telemetry sequence") + sequence = match[1] + if len(sequence) > 32: + raise FieldError("telemetry sequence exceeds numeric field budget") + rest = raw[match.end() :] + fields = rest.split(b",", 5) if rest else [] + # Missing analog channels are a departure, not undecodable data: they + # decode as fewer channels and conformance reports the short report. + # Eight binary digits are never an APRS101 analog value (0..255), so a + # short report still ends with its digital bits. + if len(fields) == 6 or fields and re.match(rb"[01]{8}(?![0-9.])", fields[-1]): + values, tail = fields[:-1], fields[-1] + else: + values, tail = fields, None + analog = [] + for value in values: + # Plain decimals only: float() would also accept inf, nan and 1e5. + if value and not re.fullmatch(rb"-?(?:\d+(?:\.\d+)?|\.\d+)", value): + raise FieldError("invalid telemetry channel") + analog.append(float(value) if value else None) + bits, comment = b"", b"" + if tail is not None: + bits, comment = tail[:8], tail[8:] + if len(bits) != 8 or any(v not in b"01" for v in bits): + raise FieldError("telemetry requires eight binary digits") + return d.Telemetry( + tuple(analog), + tuple(v == 49 for v in bits), + sequence="MIC" if sequence == b"MIC" else int(sequence), + sequence_raw=sequence, + comment=free_text(comment, "$.comment", diagnostics), + ) + + +def write(payload): + p = payload + if isinstance(p, m.Status): + raw = b">" + (encode_timestamp(p.timestamp) if p.timestamp else b"") + if p.grid: + raw += ( + p.grid.locator.encode() + + p.symbol.table_id.encode() + + p.symbol.code.encode() + ) + raw += p.text.encode() + if p.beam: + h = round(p.beam.heading_deg / 10) % 36 + power = round((p.beam.erp_w / 10) ** 0.5) + if ( + not 0 <= h <= 35 + or not 0 <= power <= 27 + or abs(power**2 * 10 - p.beam.erp_w) > 1e-6 + ): + raise FieldError("beam/ERP not representable") + raw += ( + b"^" + + b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[h : h + 1] + + bytes([48 + power]) + ) + decoded = status(raw[1:], []) + if ( + decoded.text, + decoded.timestamp, + decoded.grid, + decoded.symbol, + bool(decoded.beam), + ) != (p.text, p.timestamp, p.grid, p.symbol, bool(p.beam)): + raise FieldError("status text would be interpreted as structured fields") + return raw + if isinstance(p, m.Query): + raw = ( + b"?" + + p.name.encode() + + (b"?" if p.addressee is None or p.name == "PING" else b"") + ) + if p.footprint: + raw += f" {p.footprint.center.latitude_deg:g},{p.footprint.center.longitude_deg:g},{p.footprint.radius_miles:g}".encode() + if p.heard_station: + raw += b" " + p.heard_station.encode() + raw += p.arguments + return ( + b":" + p.addressee.ljust(9).encode() + b":" if p.addressee else b"" + ) + raw + if isinstance(p, m.Capabilities): + return b"<" + b",".join( + c.name.encode() + (b"=" + c.value.encode() if c.value is not None else b"") + for c in p.tokens + ) + if isinstance(p, d.Telemetry): + if p.encoding != "classic": + raise FieldError("telemetry encoding requires an enclosing position") + seq = b"MIC" if p.sequence in (None, "MIC") else f"{p.sequence:03d}".encode() + values = b",".join( + ( + b"" + if v is None + else (f"{int(v):03d}" if v == int(v) else f"{v:g}").encode() + ) + for v in p.analog + ) + raw = b"T#" + seq + (b"," + values if p.analog else b"") + if p.digital or p.comment: + raw += b"," + bytes(49 if v else 48 for v in p.digital) + p.comment.encode() + return raw + if isinstance(p, m.Bulletin): + address = "BLN" + p.identifier + (p.group or "") + body = p.text.encode() + elif isinstance(p, m.AutoAnswer): + address = p.addressee + body = ( + b"AA:" + + p.text.encode() + + (b"}" + p.previous_ack.encode() if p.previous_ack else b"") + ) + elif isinstance(p, m.NWSBulletin): + address = p.addressee + body = p.text.encode() + ( + b"{" + p.reference_id.encode() if p.reference_id else b"" + ) + elif isinstance(p, m.TelemetryDefinition): + address = p.addressee + v = p.definition + if isinstance(v, (d.TelemetryParameters, d.TelemetryUnits)): + body = ( + b"PARM." if isinstance(v, d.TelemetryParameters) else b"UNIT." + ) + ",".join(x or "" for x in v.channels).encode() + elif isinstance(v, d.TelemetryEquations): + body = ( + b"EQNS." + + ",".join( + ",," if x is None else ",".join(f"{a:g}" for a in (x.a, x.b, x.c)) + for x in v.coefficients + ).encode() + ) + else: + body = ( + b"BITS." + + bytes(49 if x else 48 for x in v.sense) + + b"," + + v.project_title.encode() + ) + elif isinstance(p, m.Radiogram): + address = p.addressee + v = p.record + if isinstance(v, d.NTSHeader): + tag = "N#" + values = [ + v.number, + v.precedence, + v.handling or "", + v.originator, + v.check, + v.place, + v.time or "", + v.date, + ] + elif isinstance(v, d.NTSAddress): + tag = "NA" + values = v.lines + elif isinstance(v, d.NTSPhone): + tag = "NP" + values = [v.number] + elif isinstance(v, d.NTSText): + tag = f"N{v.line}" + values = [v.text] + elif isinstance(v, d.NTSSignature): + tag = "NS" + values = [v.text] + else: + tag = "NR" + values = [v.received_from, v.received_at, v.sent_to, v.sent_at] + body = (tag + "\\" + "\\".join(values)).encode() + ( + b"{" + p.message_id.encode() if p.message_id else b"" + ) + elif isinstance(p, m.Response): + address = p.addressee + v = p.response + if isinstance(v, m.DirectStations): + body = ("Directs= " + " ".join(v.stations)).encode() + elif isinstance(v, m.HeardStation): + body = ( + v.station + + " HEARD: " + + " ".join("." if c is None else str(c) for c in v.counts) + ).encode() + else: + body = str(v.header).encode() + b":" + else: + return None + return b":" + address.ljust(9).encode() + b":" + body diff --git a/packages/aprs/src/hamkit/aprs/_mic_e.py b/packages/aprs/src/hamkit/aprs/_mic_e.py new file mode 100644 index 0000000..a6d34fe --- /dev/null +++ b/packages/aprs/src/hamkit/aprs/_mic_e.py @@ -0,0 +1,320 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Mic-E joint destination/information codec (APRS101 chapter 10). + +Status text follows the APRS 1.2 type codes (aprs.org/aprs12/mic-e-types.txt): +"T......Mv", where T is a type byte and a declared suffix may end the text. +APRS 1.2 redefines the ` and ' type bytes, which APRS101 used for hex +telemetry; that reading remains only for the complete legacy hex form. +""" + +from __future__ import annotations + +import math +import re +from dataclasses import replace +from typing import cast + +from ._data import Altitude, Extensions, Measurement, Motion, Symbol, Telemetry +from ._errors import FieldError +from ._models import Header, MicE +from ._position_codec import base91, center, dao_offset, pack91 +from ._text import free_text + +# Declared version suffixes. The manufacturer/version pair after ` or ' does +# not depend on which of the two type bytes was sent. +_OTHER_SUFFIXES = ( + *("_ ", '_"', "_#", "_$", "_%", "_)", "_(", "_0", "_3", "_1"), # Yaesu + *(" X", "(5", "(8", "|3", "|4", ":4", ":8"), # AP510, Anytone, Byonics, SCS +) +TYPE_SUFFIXES: dict[str, tuple[str, ...]] = { + ">": ("=", "^"), # TH-D72, TH-D74 + "]": ("=",), # TM-D710 + "`": _OTHER_SUFFIXES, + "'": _OTHER_SUFFIXES, +} +_MESSAGES = ( + "emergency", + "priority", + "special", + "committed", + "returning", + "in_service", + "en_route", + "off_duty", +) + + +def destination(raw: str): + raw = raw.split("-")[0] + if not re.fullmatch(r"[0-9A-LP-Z]{3}[0-9LP-Z]{3}", raw): + raise FieldError("invalid Mic-E destination") + digits = "".join( + ( + c + if c.isdigit() + else ( + str(ord(c) - 65) + if "A" <= c <= "J" + else str(ord(c) - 80) + if "P" <= c <= "Y" + else " " + ) + ) + for c in raw + ) + n = len(digits) - len(digits.rstrip()) + if n > 4 or " " in digits[: -n or None]: + raise FieldError("invalid Mic-E latitude ambiguity") + d = digits.replace(" ", "0") + if int(d[2:4]) >= 60: + raise FieldError("invalid Mic-E latitude minutes") + lat = center(int(d[:2]) + int(d[2:]) / 6000, n) + if raw[3] < "P": + lat = -lat + bits = sum( + (1 << (2 - i)) + for i, c in enumerate(raw[:3]) + if "A" <= c <= "K" or "P" <= c <= "Z" + ) + custom = any("A" <= c <= "K" for c in raw[:3]) + standard = any("P" <= c <= "Z" for c in raw[:3]) + message = ( + "unknown" + if custom and standard + else f"custom_{7-bits}" + if custom and bits + else _MESSAGES[bits] + ) + return lat, n, message, raw[4] >= "P", raw[5] >= "P" + + +def read(information: bytes, header: Header, diagnostics: list) -> MicE: + lat, n, message, offset, west = destination(header.destination) + b = information[1:] + if len(b) < 8 or any(not 28 <= c <= 127 for c in b[:6]): + raise FieldError("truncated or invalid Mic-E information") + degrees = b[0] - 28 + (100 if offset else 0) + if 180 <= degrees <= 189: + degrees -= 80 + elif 190 <= degrees <= 199: + degrees -= 190 + minutes = b[1] - 28 + if minutes >= 60: + minutes -= 60 + hundredths = b[2] - 28 + if minutes >= 60 or hundredths > 99: + raise FieldError("invalid Mic-E longitude minutes") + lon = center(degrees + (minutes + hundredths / 100) / 60, n) + if west: + lon = -lon + speed = (b[3] - 28) * 10 + (b[4] - 28) // 10 + if speed >= 800: + speed -= 800 + course = ((b[4] - 28) % 10) * 100 + b[5] - 28 + if course >= 400: + course -= 400 + motion = Motion(course, speed, course_code=course, speed_code=speed) + symbol = Symbol(chr(b[7]), chr(b[6])) + device, extra, tail = read_status(b[8:], symbol) + e = replace(extra, motion=motion) + return MicE( + dao_offset(lat, e.dao, "latitude"), + dao_offset(lon, e.dao, "longitude"), + symbol, + message=message, + fix="current" if information[:1] in (b"`", b"\x1c") else "old", + ambiguity=n, + device_code=device, + extensions=e, + comment=free_text(tail, "$.comment", diagnostics), + ) + + +def _longitude_degrees_byte(degrees: int, offset: bool) -> int: + """APRS101 p.48 longitude-degrees table. + + 100-109 degrees use 'l'-'u' (108-117). Bytes 28-37 decode to the same + values arithmetically, but they are not the specified encoding and include + the FS-US control characters. + """ + if offset: + if 0 <= degrees <= 9: + return degrees + 118 + if 100 <= degrees <= 109: + return degrees + 8 + if 110 <= degrees <= 179: + return degrees - 100 + 28 + elif 10 <= degrees <= 99: + return degrees + 28 + raise FieldError("Mic-E destination longitude offset does not match longitude") + + +def position_bytes(p: MicE, header: Header) -> bytes: + """Check the joint header/position fields and encode the longitude bytes.""" + p = replace( + p, + latitude_deg=dao_offset(p.latitude_deg, p.extensions.dao, "latitude", -1), + longitude_deg=dao_offset(p.longitude_deg, p.extensions.dao, "longitude", -1), + ) + lat, n, message, offset, west = destination(header.destination) + if ( + abs(lat - center(p.latitude_deg, p.ambiguity)) > 1 / 12000 + or n != p.ambiguity + or message != p.message + or west != (math.copysign(1, p.longitude_deg) < 0) + ): + raise FieldError( + "Mic-E destination does not match latitude, ambiguity, message, or longitude hemisphere" + ) + units = round(abs(p.longitude_deg) * 6000) + degrees, minutes = divmod(units, 6000) + minutes, hundredths = divmod(minutes, 100) + degree_byte = _longitude_degrees_byte(degrees, offset) + return bytes([degree_byte, minutes + (88 if minutes < 10 else 28), hundredths + 28]) + + +def write(p: MicE, header: Header) -> bytes: + position = position_bytes(p, header) + m = p.extensions.motion + if m is None or m.course_deg is None or m.speed_knots is None: + raise FieldError("Mic-E requires course and speed") + speed, course = round(m.speed_knots), round(m.course_deg) + if not 0 <= speed <= 799 or not 0 <= course <= 360: + raise FieldError("Mic-E motion outside wire range") + body = ( + position + + bytes( + [ + speed // 10 + 28, + speed % 10 * 10 + course // 100 + 28, + course % 100 + 28, + ] + ) + + p.symbol.code.encode() + + p.symbol.table_id.encode() + ) + return (b"`" if p.fix == "current" else b"'") + body + write_status(p) + + +def device_parts(code: str | None) -> tuple[str, str]: + """Split a device code into what precedes and what ends the status text.""" + if not code: + return "", "" + head, rest = code[:1], code[1:] + if head[:1] not in TYPE_SUFFIXES or rest and rest not in TYPE_SUFFIXES[code[0]]: + raise FieldError("unsupported Mic-E type code") + return head, rest + + +def _suffix(device: str, text: bytes) -> bytes: + for suffix in TYPE_SUFFIXES[device]: + if text.endswith(suffix.encode()): + return suffix.encode() + return b"" + + +def _legacy_hex(tail: bytes) -> int: + """Width of complete APRS101 hex telemetry after ` or ', or 0.""" + width = 4 if tail[:1] == b"`" else 10 + complete = re.fullmatch(rb"[0-9A-Fa-f]{%d}" % width, tail[1 : width + 1]) + if complete and not _suffix(tail[:1].decode(), tail[width + 1 :]): + return width + return 0 + + +def read_status(tail: bytes, symbol: Symbol) -> tuple[str | None, Extensions, bytes]: + """Decode the status text after the symbol: device code, extensions, comment.""" + device = None + suffix = b"" + telemetry = None + altitude = None + width = _legacy_hex(tail) if tail[:1] in (b"`", b"'") else 0 + if width: + values: tuple[int | None, ...] = tuple( + bytes.fromhex(tail[1 : width + 1].decode()) + ) + if width == 4: + values = (values[0], None, values[1], None, None) + telemetry = Telemetry(values, encoding="mic_e_hex") + tail = tail[width + 1 :] + elif tail[:1] == b"\x1d": + if len(tail) < 6: + raise FieldError("truncated Mic-E binary telemetry") + telemetry = Telemetry(tuple(tail[1:6]), encoding="mic_e_binary") + tail = tail[6:] + elif tail[:1] in (b">", b"]", b"`", b"'"): + device = tail[:1].decode() + suffix = _suffix(device, tail[1:]) + tail = tail[1 : len(tail) - len(suffix)] + if len(tail) >= 4 and tail[3:4] == b"}": + altitude = Altitude(Measurement(base91(tail[:3]) - 10000, "meters"), "mic_e") + tail = tail[4:] + # A legacy grid/status prefix remains literal comment text. It is neither + # a device identifier nor a replacement for the encoded Mic-E coordinates. + if device is not None: + device += suffix.decode() + from . import _extensions + + extra, tail = _extensions.read(tail, symbol) + e = replace( + extra, + altitude=altitude or extra.altitude, + telemetry=telemetry or extra.telemetry, + ) + return device, e, tail + + +def write_status(p: MicE) -> bytes: + """Encode the status text after the symbol; the inverse of read_status.""" + head, suffix = device_parts(p.device_code) + e = replace(p.extensions, motion=None) + first = b"" + if e.telemetry and e.telemetry.encoding in ("mic_e_hex", "mic_e_binary"): + if head: + raise FieldError("Mic-E telemetry and a type code share the first byte") + t = e.telemetry + values = t.analog + if len(values) == 2 and t.encoding == "mic_e_hex": + values = (values[0], None, values[1], None, None) + if len(values) != 5 or t.digital: + raise FieldError("invalid Mic-E telemetry channels") + two_channel = ( + t.encoding == "mic_e_hex" + and values[1] is None + and values[3:] == (None, None) + ) + present = (values[0], values[2]) if two_channel else values + if any(v is None or v != int(v) or not 0 <= v <= 255 for v in present): + raise FieldError("Mic-E telemetry channels require integers in 0..255") + if t.encoding == "mic_e_binary": + first = b"\x1d" + bytes(int(cast(float, v)) for v in values) + elif values[1] is None and values[3:] == (None, None): + first = ( + b"`" + + bytes([int(cast(float, values[0])), int(cast(float, values[2]))]) + .hex() + .upper() + .encode() + ) + else: + first = ( + b"'" + bytes(int(cast(float, v)) for v in values).hex().upper().encode() + ) + e = replace(e, telemetry=None) + else: + first = head[:1].encode() + if e.altitude and e.altitude.encoding == "mic_e": + if e.altitude.reference != "unspecified": + raise FieldError( + "Mic-E altitude reference is not an independent wire field" + ) + a = e.altitude.measurement + if a.unit != "meters" or a.value is None: + raise FieldError("Mic-E altitude requires meters") + first += pack91(round(a.value) + 10000, 3) + b"}" + e = replace(e, altitude=None) + from . import _extensions + + comment = p.comment.encode() + return first + _extensions.write(e, p.symbol, comment) + comment + suffix.encode() diff --git a/packages/aprs/src/hamkit/aprs/_models.py b/packages/aprs/src/hamkit/aprs/_models.py index 6432a62..0eb9a50 100644 --- a/packages/aprs/src/hamkit/aprs/_models.py +++ b/packages/aprs/src/hamkit/aprs/_models.py @@ -29,7 +29,6 @@ from ._nmea import NMEAMetadata, NMEASentence from ._validation import ANY_TEXT, FREE_TEXT, Validated -EnvelopeProfile: TypeAlias = Literal["monitor", "rf"] UnsupportedPolicy: TypeAlias = Literal["opaque", "raise"] MalformedPolicy: TypeAlias = Literal["return", "raise"] DiagnosticCode: TypeAlias = Literal["unsupported", "malformed", "nonconforming"] @@ -154,7 +153,11 @@ def is_null_position(self) -> bool: @dataclass(frozen=True) class MicE(_Located, Validated): - """Header-dependent position: the destination address carries latitude.""" + """Header-dependent position: the destination address carries latitude. + + device_code contains the type byte and declared manufacturer suffix only. + Optional legacy grid/status text is preserved in comment. + """ latitude_deg: float longitude_deg: float diff --git a/packages/aprs/src/hamkit/aprs/_nmea_codec.py b/packages/aprs/src/hamkit/aprs/_nmea_codec.py new file mode 100644 index 0000000..a92deac --- /dev/null +++ b/packages/aprs/src/hamkit/aprs/_nmea_codec.py @@ -0,0 +1,248 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""NMEA sentence codecs. Checksums and fix validity do not imply each other.""" + +from __future__ import annotations + +import functools +import math +import operator +import re +from typing import Literal, cast + +from . import _nmea as n +from ._data import Coordinates, Symbol +from ._errors import CodecNotImplementedError, FieldError +from ._models import NMEA, Diagnostic, Header +from ._text import free_text, token + + +def _coordinate(number: str, hemisphere: str, width: int) -> float: + if ( + not re.fullmatch(r"\d{" + str(width + 2) + r"}(?:\.\d+)?", number) + or hemisphere not in ("NS" if width == 2 else "EW") + or len(hemisphere) != 1 + ): + raise FieldError("invalid NMEA coordinate") + deg = int(number[:width]) + minutes = float(number[width:]) + if minutes >= 60: + raise FieldError("NMEA coordinate minutes exceed 60") + value = deg + minutes / 60 + return -value if hemisphere in "SW" else value + + +def _coordinates(fields: list[str]) -> Coordinates | None: + if not any(fields): + return None + return Coordinates( + _coordinate(fields[0], fields[1], 2), _coordinate(fields[2], fields[3], 3) + ) + + +def header_symbol(header: Header | None) -> Symbol | None: + if header is None: + return None + dest = header.destination.split("-")[0] + match = re.fullmatch(r"(?:GPS|SPC|SYM)([CE])(\d{2})", dest) + if match and 1 <= int(match[2]) <= 94: + return Symbol("/" if match[1] == "C" else "\\", chr(32 + int(match[2]))) + # APRS symbol XY codes: B/P are punctuation; M/N are vehicles and + # the remaining primary/alternate groups follow the APRS symbol table. + match = re.fullmatch(r"(?:GPS|SPC|SYM)([BPMNOAHS DQJL])([A-Z])([0-9A-Z]?)", dest) + if match: + group, letter, overlay = match.groups() + groups = { + "B": (32, "/"), + "P": (32, "\\"), + "M": (41, "/"), + "N": (41, "\\"), + "O": (64, "/"), + "A": (64, "\\"), + "H": (96, "/"), + "D": (96, "\\"), + } + if group in groups: + offset, table = groups[group] + code = chr(offset + ord(letter) - 65) + if 33 <= ord(code) <= 126: + return Symbol(overlay or table, code) + suffix = header.source.rpartition("-")[2] + if dest in ("GPS", "APRS") and suffix.isdigit() and 1 <= int(suffix) <= 15: + return Symbol("/", "aUfbYX's> NMEA: + match = re.match(rb"\$([A-Z]{2})([A-Z]{3}),(.*)", raw, re.DOTALL) + if not match: + raise FieldError("invalid NMEA sentence identifier") + talker, kind = match[1].decode(), match[2].decode() + data, star, trailer = match[3].partition(b"*") + supplied = None + valid = None + comment = b"" + if star: + if len(trailer) < 2 or not re.fullmatch(rb"[0-9a-fA-F]{2}", trailer[:2]): + raise FieldError("invalid NMEA checksum field") + supplied = trailer[:2].decode() + comment = trailer[2:] + actual = functools.reduce(operator.xor, raw[1 : raw.index(b"*")], 0) + # A mismatch is reported by conformance, so it also blocks sending. + valid = actual == int(supplied, 16) + fields_raw = tuple(data.split(b",")) + f = [token(v, "$.sentence") for v in fields_raw] + number = lambda i: float(f[i]) if f[i] else None + s: n.NMEASentence + try: + if kind == "GGA": + if len(f) < 14: + raise FieldError("GGA requires fourteen fields") + if f[9] != "M" or f[11] != "M": + raise FieldError("GGA height units must be meters") + s = n.GGA( + f[0], + _coordinates(f[1:5]), + int(f[5]), + satellites=int(f[6]) if f[6] else None, + hdop=number(7), + altitude_msl_m=number(8), + geoid_separation_m=number(10), + dgps_age=f[12] or None, + dgps_station=f[13] or None, + ) + usable = s.fix_quality > 0 + elif kind == "GLL": + if len(f) < 6: + raise FieldError("GLL requires six fields") + s = n.GLL(_coordinates(f[:4]), f[4], cast(Literal["A", "V"], f[5])) + usable = s.fix_status == "A" + elif kind == "RMC": + if len(f) < 11: + raise FieldError("RMC requires eleven fields") + s = n.RMC( + f[0], + f[8], + cast(Literal["A", "V"], f[1]), + _coordinates(f[2:6]), + speed_knots=number(6), + course_deg=number(7), + magnetic_variation=number(9), + magnetic_variation_direction=cast( + Literal["E", "W"] | None, f[10] or None + ), + ) + usable = s.fix_status == "A" + elif kind == "VTG": + if len(f) < 8 or [f[i] for i in (1, 3, 5, 7)] != ["T", "M", "N", "K"]: + raise FieldError("invalid VTG fields or units") + s = n.VTG( + course_true_deg=number(0), + course_magnetic_deg=number(2), + speed_knots=number(4), + speed_kmh_reported=number(6), + ) + usable = False + elif kind == "WPL": + if len(f) < 5: + raise FieldError("WPL requires five fields") + coords = _coordinates(f[:4]) + if coords is None: + raise FieldError("WPL requires coordinates") + s = n.WPL(coords, f[4]) + usable = True + else: + raise CodecNotImplementedError("unknown NMEA sentence " + kind) + except CodecNotImplementedError: + raise + except (ValueError, IndexError) as exc: + raise FieldError("invalid NMEA field") from exc + if not usable and kind in ("GGA", "GLL", "RMC"): + diagnostics.append( + Diagnostic( + "nonconforming", "NMEA reports no valid fix", "$.position_usable" + ) + ) + return NMEA( + s, + n.NMEAMetadata( + talker, + checksum_supplied=supplied, + checksum_valid=valid, + fields_raw=fields_raw, + ), + position_usable=usable and valid is not False, + symbol=header_symbol(header), + comment=free_text(comment, "$.comment", diagnostics), + ) + + +def _coord_fields(c: Coordinates | None) -> list[str]: + if c is None: + return [""] * 4 + result = [] + for value, width, hemispheres in ( + (c.latitude_deg, 2, "NS"), + (c.longitude_deg, 3, "EW"), + ): + # Seven decimal minutes preserve sub-millimeter precision without + # borrowing lexical fields from the original sentence. + total = round(abs(value) * 60, 7) + degrees = int(total // 60) + minutes = total - degrees * 60 + result.extend( + [ + f"{degrees:0{width}d}{minutes:010.7f}".rstrip("0").rstrip("."), + hemispheres[math.copysign(1, value) < 0], + ] + ) + return result + + +def write(p: NMEA) -> bytes: + s = p.sentence + num = lambda v: "" if v is None else f"{v:.12g}" + if isinstance(s, n.GGA): + f = [ + s.time_utc, + *_coord_fields(s.coordinates), + str(s.fix_quality), + num(s.satellites), + num(s.hdop), + num(s.altitude_msl_m), + "M", + num(s.geoid_separation_m), + "M", + s.dgps_age or "", + s.dgps_station or "", + ] + elif isinstance(s, n.GLL): + f = [*_coord_fields(s.coordinates), s.time_utc, s.fix_status] + elif isinstance(s, n.RMC): + f = [ + s.time_utc, + s.fix_status, + *_coord_fields(s.coordinates), + num(s.speed_knots), + num(s.course_deg), + s.date_ddmmyy, + num(s.magnetic_variation), + s.magnetic_variation_direction or "", + ] + elif isinstance(s, n.VTG): + f = [ + num(s.course_true_deg), + "T", + num(s.course_magnetic_deg), + "M", + num(s.speed_knots), + "N", + num(s.speed_kmh_reported), + "K", + ] + else: + f = [*_coord_fields(s.coordinates), s.name] + raw = (p.metadata.talker + type(s).__name__ + "," + ",".join(f)).encode() + if p.metadata.checksum_supplied is not None: + raw += b"*" + f"{functools.reduce(operator.xor,raw,0):02X}".encode() + return b"$" + raw + p.comment.encode() diff --git a/packages/aprs/src/hamkit/aprs/_policy.py b/packages/aprs/src/hamkit/aprs/_policy.py new file mode 100644 index 0000000..88ecfdf --- /dev/null +++ b/packages/aprs/src/hamkit/aprs/_policy.py @@ -0,0 +1,75 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Declarative constraints for the outer TNC2 packet envelope.""" + +import re +from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class EnvelopePolicy: + """Address fullmatch patterns and optional, nonnegative envelope limits. + + Path addresses exclude their trailing repeated marker (``*``). Information + length includes third-party encapsulation. TNC2 line length includes a + canonical CRLF, even for unframed input. None means no limit. + + These constraints apply to the outer envelope, not encapsulated headers. + Basic TNC2 token syntax and payload conformance still apply independently. + """ + + source_pattern: str + destination_pattern: str + path_address_pattern: str + max_path_entries: int | None = None + max_information_bytes: int | None = None + max_tnc2_line_bytes: int | None = None + + def __post_init__(self) -> None: + for name in ( + "source_pattern", + "destination_pattern", + "path_address_pattern", + ): + pattern = getattr(self, name) + if not isinstance(pattern, str): + raise TypeError(f"{name} must be a string") + try: + re.compile(pattern) + except re.error as exc: + raise ValueError( + f"{name} is not a valid regular expression: {exc}" + ) from exc + for name in ( + "max_path_entries", + "max_information_bytes", + "max_tnc2_line_bytes", + ): + limit = getattr(self, name) + if limit is not None: + if type(limit) is not int: + raise TypeError(f"{name} must be an integer or None") + if limit < 0: + raise ValueError(f"{name} must be nonnegative") + + +_AX25_ADDRESS = r"[A-Z0-9]{1,6}(?:-(?:[0-9]|1[0-5]))?" +# APRS-IS drops SSID -0 because it conflicts with an absent SSID. +_APRS_IS_SSID = r"(?:-(?!0\Z)[A-Za-z0-9]{1,2})?" +_APRS_IS_SOURCE = r"(?=.{1,9}\Z)[A-Za-z0-9]{3,9}" + _APRS_IS_SSID +_APRS_IS_ADDRESS = r"(?=.{1,9}\Z)[A-Za-z0-9]{1,9}" + _APRS_IS_SSID + +RF = EnvelopePolicy( + source_pattern=_AX25_ADDRESS, + destination_pattern=_AX25_ADDRESS, + path_address_pattern=_AX25_ADDRESS, + max_path_entries=8, + max_information_bytes=256, +) + +APRS_IS = EnvelopePolicy( + source_pattern=_APRS_IS_SOURCE, + destination_pattern=_APRS_IS_ADDRESS, + path_address_pattern=_APRS_IS_ADDRESS, + max_tnc2_line_bytes=512, +) diff --git a/packages/aprs/src/hamkit/aprs/_position_codec.py b/packages/aprs/src/hamkit/aprs/_position_codec.py new file mode 100644 index 0000000..5b610cf --- /dev/null +++ b/packages/aprs/src/hamkit/aprs/_position_codec.py @@ -0,0 +1,174 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Position wire primitives, including ambiguity and base-91 compression.""" + +from __future__ import annotations + +import math +from dataclasses import replace + +from ._data import Altitude, Compression, Extensions, Measurement, Motion, Range, Symbol +from ._errors import FieldError +from ._fields.position import CoordinateAxis, decode_coordinate, encode_coordinate + + +def base91(raw: bytes) -> int: + if not raw or any(not 33 <= c <= 123 for c in raw): + raise FieldError("invalid base-91 field") + value = 0 + for c in raw: + value = value * 91 + c - 33 + return value + + +def pack91(value: int, width: int) -> bytes: + if not 0 <= value < 91**width: + raise FieldError("value outside base-91 field range") + result = bytearray(width) + for i in range(width - 1, -1, -1): + value, digit = divmod(value, 91) + result[i] = digit + 33 + return bytes(result) + + +def ambiguity(raw: bytes) -> int: + digits = raw[:-1].replace(b".", b"") + n = len(digits) - len(digits.rstrip(b" ")) + if n > 4 or b" " in digits[: -n or None]: + raise FieldError("ambiguity must hide trailing minute digits") + return n + + +def center(value: float, n: int) -> float: + if not n: + return value + cell = (0.1, 1, 10, 60)[n - 1] + return math.copysign( + (math.floor(abs(value) * 60 / cell + 1e-9) + 0.5) * cell / 60, value + ) + + +def coordinates(lat: bytes, lon: bytes) -> tuple[float, float, int]: + n, m = ambiguity(lat), ambiguity(lon) + if m > n: + raise FieldError("longitude cannot be more ambiguous than latitude") + return ( + center(decode_coordinate(lat.replace(b" ", b"0"), "latitude"), n), + center(decode_coordinate(lon.replace(b" ", b"0"), "longitude"), n), + n, + ) + + +def coordinate_bytes(value: float, axis: CoordinateAxis, n: int) -> bytes: + raw = bytearray(encode_coordinate(value, axis)) + for i in (len(raw) - 2, len(raw) - 3, len(raw) - 5, len(raw) - 6)[:n]: + raw[i] = 32 + return bytes(raw) + + +def compressed( + raw: bytes, +) -> tuple[float, float, Symbol, Compression, Extensions, bytes]: + if len(raw) < 13: + raise FieldError("truncated compressed position") + if raw[0] not in b"/\\ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij": + raise FieldError("invalid compressed symbol table") + lat, lon = 90 - base91(raw[1:5]) / 380926, -180 + base91(raw[5:9]) / 190463 + symbol = Symbol(chr(raw[0]), chr(raw[9])) + cs = raw[10:13] + e = Extensions() + if cs[0] == 32: + compression = Compression(ignored=True, raw=cs) + else: + c, s, t = (base91(bytes([b])) for b in cs) + t &= 63 + compression = Compression( + fix="current" if t & 32 else "old", + nmea_source=("other", "GLL", "GGA", "RMC")[(t >> 3) & 3], + origin_code=t & 7, + raw=cs, + ) + if t & 24 == 16: + e = Extensions( + altitude=Altitude( + Measurement(1.002 ** (c * 91 + s), "feet"), "compressed" + ) + ) + elif c == 90: + e = Extensions(range=Range(2 * 1.08**s)) + else: + e = Extensions(motion=Motion(c * 4, 1.08**s - 1)) + return lat, lon, symbol, compression, e, raw[13:] + + +def compressed_bytes(p) -> tuple[bytes, Extensions]: + c = p.compression + e = p.extensions + if c.ignored: + cs = b" " + elif e.altitude is not None and e.altitude.encoding == "compressed": + if e.altitude.reference != "unspecified": + raise FieldError( + "compressed altitude reference is not an independent wire field" + ) + a = e.altitude.measurement + if ( + a.unit != "feet" + or a.value is None + or a.value <= 0 + or c.nmea_source != "GGA" + ): + raise FieldError( + "compressed altitude requires positive feet and GGA source" + ) + cs = pack91(round(math.log(a.value, 1.002)), 2) + pack91(c.type_value, 1) + e = replace(e, altitude=None) + elif e.range is not None: + if e.range.miles < 2: + raise FieldError("compressed range must be at least two miles") + cs = ( + b"{" + + pack91(round(math.log(e.range.miles / 2, 1.08)), 1) + + pack91(c.type_value, 1) + ) + e = replace(e, range=None) + else: + m = e.motion + if e.weather is not None: + from ._weather import _value + + w = e.weather + m = Motion( + w.wind_direction.value if w.wind_direction else None, + _value(w.wind_speed, "knots") if w.wind_speed else None, + ) + e = replace(e, weather=replace(w, wind_direction=None, wind_speed=None)) + if m is None or m.course_deg is None or m.speed_knots is None: + raise FieldError("active compression requires motion, range, or altitude") + if c.nmea_source == "GGA": + raise FieldError("GGA compression encodes altitude, not motion") + course = round(m.course_deg / 4) + if course == 90: + course = 0 + cs = ( + pack91(course, 1) + + pack91(round(math.log(m.speed_knots + 1, 1.08)), 1) + + pack91(c.type_value, 1) + ) + e = replace(e, motion=None) + raw = ( + p.symbol.table_id.encode() + + pack91(round((90 - p.latitude_deg) * 380926), 4) + + pack91(round((180 + p.longitude_deg) * 190463), 4) + + p.symbol.code.encode() + + cs + ) + return raw, e + + +def dao_offset(value: float, dao, axis: str, direction=1) -> float: + if dao is None or dao.encoding is None: + return value + precision = getattr(dao, axis + "_precision") + increment = precision / (60000 if dao.encoding == "decimal" else 91 * 6000) + return math.copysign(abs(value) + direction * increment, value) diff --git a/packages/aprs/src/hamkit/aprs/_recovery.py b/packages/aprs/src/hamkit/aprs/_recovery.py index d175bf3..6a3eb99 100644 --- a/packages/aprs/src/hamkit/aprs/_recovery.py +++ b/packages/aprs/src/hamkit/aprs/_recovery.py @@ -3,6 +3,7 @@ """Best-effort extraction into ordinary JSON data, never partially valid models.""" from __future__ import annotations +import re from collections.abc import Callable from typing import Any @@ -43,12 +44,7 @@ def keep(key: str, operation: Callable[[], Any]) -> None: message = getattr(exc, "message", str(exc)) diagnostics.append(Diagnostic("malformed", message, "$." + key)) - dti, body = raw[:1], raw[1:] - if dti in (b"!", b"=", b"/", b"@"): - data = {"type": "position", "messaging": dti in (b"=", b"@")} - if dti in (b"/", b"@"): - data["timestamp"] = _timestamp(body[:7]) - body = body[7:] + def located(body: bytes) -> None: for field, needed in ( ("latitude_deg", 8), ("longitude_deg", 18), @@ -71,6 +67,27 @@ def keep(key: str, operation: Callable[[], Any]) -> None: data["comment"] = free_text(body[19:], "$.comment", ignored) if symbol: data["symbol"] = symbol + + dti, body = raw[:1], raw[1:] + if dti in (b"!", b"=", b"/", b"@"): + data = {"type": "position", "messaging": dti in (b"=", b"@")} + if dti in (b"/", b"@"): + data["timestamp"] = _timestamp(body[:7]) + body = body[7:] + located(body) + elif ( + dti == b";" + and body[9:10] in (b"*", b"_") + and re.fullmatch(rb"\d{6}[zh/]", body[10:17]) + ): + # Name and live/killed flag are fixed-width; the rest follows a timestamp. + data = { + "type": "object", + "name": body[:9].decode("latin-1").rstrip(" "), + "alive": body[9:10] == b"*", + "timestamp": _timestamp(body[10:17]), + } + located(body[17:]) elif dti == b">": data["type"] = "status" if len(body) >= 7 and body[:6].isdigit() and body[6:7] == b"z": diff --git a/packages/aprs/src/hamkit/aprs/_rules.py b/packages/aprs/src/hamkit/aprs/_rules.py index ad0fdf1..a26dc30 100644 --- a/packages/aprs/src/hamkit/aprs/_rules.py +++ b/packages/aprs/src/hamkit/aprs/_rules.py @@ -321,6 +321,8 @@ def _height(v: Any) -> None: "snow_24h": ("inches", "mm"), "luminosity": ("W/m2",), "rain_counter": ("count", "raw"), + "radiation": ("nSv/h",), + "battery_voltage": ("volts",), } diff --git a/packages/aprs/src/hamkit/aprs/_transport.py b/packages/aprs/src/hamkit/aprs/_transport.py index 26dc8c6..dd1a7c4 100644 --- a/packages/aprs/src/hamkit/aprs/_transport.py +++ b/packages/aprs/src/hamkit/aprs/_transport.py @@ -7,21 +7,22 @@ from ._codec import parse_packet, serialize_packet from ._errors import EnvelopeError from ._models import ( - EnvelopeProfile, Malformed, MalformedPolicy, Packet, UnsupportedPolicy, ) +from ._policy import APRS_IS, EnvelopePolicy def parse_tnc2_line( line: bytes, *, - profile: EnvelopeProfile = "monitor", + policy: EnvelopePolicy = APRS_IS, unsupported: UnsupportedPolicy = "opaque", malformed: MalformedPolicy = "return", max_third_party_depth: int = 4, + legacy_positions: bool = False, ) -> Packet | Malformed: """Parse one LF- or CRLF-terminated line, as read from APRS-IS or a TNC. @@ -41,22 +42,23 @@ def parse_tnc2_line( ) return parse_packet( raw, - profile=profile, + policy=policy, unsupported=unsupported, malformed=malformed, max_third_party_depth=max_third_party_depth, + legacy_positions=legacy_positions, ) def serialize_tnc2_line( packet: Packet, *, - profile: EnvelopeProfile = "monitor", + policy: EnvelopePolicy = APRS_IS, max_third_party_depth: int = 4, ) -> bytes: """Encode one CRLF-terminated line, rejecting non-line-safe payloads.""" raw = serialize_packet( - packet, profile=profile, max_third_party_depth=max_third_party_depth + packet, policy=policy, max_third_party_depth=max_third_party_depth ) if b"\r" in raw or b"\n" in raw: raise EnvelopeError("payload cannot be represented in line-oriented TNC2") diff --git a/packages/aprs/src/hamkit/aprs/_weather.py b/packages/aprs/src/hamkit/aprs/_weather.py new file mode 100644 index 0000000..8b357ee --- /dev/null +++ b/packages/aprs/src/hamkit/aprs/_weather.py @@ -0,0 +1,307 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Weather token grammar; absent and unavailable observations remain distinct. + +Beyond APRS101 and the APRS 1.1 clarification (spec-wx.txt), the APRS 1.2 +weather proposal (aprs.org/aprs12/weather-new.txt) adds Xnnn radiation, +Vnnn battery volts and a fixed four-byte Fnnnn water level in tenths of a foot. +""" + +from __future__ import annotations + +import re +from decimal import Decimal +from typing import Any, Literal + +from ._data import Measurement, WaterHeight, Weather +from ._errors import FieldError +from ._fields import decode_timestamp, encode_timestamp +from ._text import free_text + +_FIELDS: dict[str, tuple[str, Any, int, float]] = { + "c": ("wind_direction", "degrees", 3, 1), + "s": ("wind_speed", "mph", 3, 1), + "g": ("gust", "mph", 3, 1), + "t": ("temperature", "fahrenheit", 3, 1), + "r": ("rain_1h", "inches", 3, 0.01), + "p": ("rain_24h", "inches", 3, 0.01), + "P": ("rain_since_midnight", "inches", 3, 0.01), + "h": ("humidity", "percent", 2, 1), + "b": ("pressure", "hPa", 5, 0.1), + "L": ("luminosity", "W/m2", 3, 1), + "l": ("luminosity", "W/m2", 3, 1), + "#": ("rain_counter", "count", 3, 1), +} + + +def read( + raw: bytes, *, positioned=False, compressed=False, diagnostics=None +) -> tuple[Weather, bytes]: + original = raw + values: dict[str, Any] = {} + timestamp = None + if not positioned: + if len(raw) < 8: + raise FieldError("truncated weather timestamp") + timestamp = decode_timestamp(raw[:8]) + raw = raw[8:] + elif not compressed: + match = re.match(rb"([0-9. ]{3})/([0-9. ]{3})", raw) + if match: + c, s = match[1], match[2] + unavailable = c == s == b"000" + values["wind_direction"] = Measurement( + int(c) if c.isdigit() and not unavailable else None, "degrees", raw=c + ) + values["wind_speed"] = Measurement( + int(s) if s.isdigit() and not unavailable else None, + "disputed_knots_or_mph", + raw=s, + ) + raw = raw[7:] + while raw: + tag = chr(raw[0]) + if tag in "Ff": + height = _water_height(raw) + if height: + values["water_height"], raw = height + continue + if tag in "XV": + match = re.match(rb"[XV](\d{3}|\.{3})", raw) + if match: + field = match[1] + if tag == "X": + # Resistor-code style: two digits times ten to the third. + value = ( + None + if field == b"..." + else int(field[:2]) * 10 ** int(field[2:]) + ) + values["radiation"] = Measurement(value, "nSv/h", raw=field) + else: + value = None if field == b"..." else int(field) / 10 + values["battery_voltage"] = Measurement(value, "volts", raw=field) + raw = raw[match.end() :] + continue + if tag not in _FIELDS: + break + name, unit, width, scale = _FIELDS[tag] + if tag == "s" and (positioned or "wind_speed" in values): + name, unit = "snow_24h", "inches" + field = raw[1 : width + 1] + if len(field) != width or not ( + field in (b"." * width, b" " * width) + or re.fullmatch(rb"-?\d+(?:\.\d+)?", field) + ): + if diagnostics is not None: + from ._models import Diagnostic + + diagnostics.append( + Diagnostic( + "nonconforming", + "invalid weather field width or value", + "$.comment", + ) + ) + break + value = None if field in (b"." * width, b" " * width) else float(field) * scale + if value is not None: + if tag == "h" and value == 0: + value = 100 + if tag == "l": + value += 1000 + values[name] = Measurement(value, unit, raw=field) + raw = raw[width + 1 :] + # APRS software + two/three-character weather device code is a suffix. + if CODES.fullmatch(raw): + values["software_code"] = chr(raw[0]) + values["device_code"] = raw[1:].decode() + raw = b"" + if not positioned: + values["comment"] = free_text( + raw, "$.comment", diagnostics if diagnostics is not None else [] + ) + raw = b"" + return Weather(**values, timestamp=timestamp, raw=original), raw + + +def _water_height(raw: bytes) -> tuple[WaterHeight, bytes] | None: + """F/f water level: decimal feet/meters (APRS 1.1) or Fnnnn tenths (1.2).""" + unit: Literal["feet", "meters"] = "feet" if raw[:1] == b"F" else "meters" + decimal = re.match(rb"[Ff](-?\d+\.\d+)", raw) + if decimal: + return WaterHeight(Measurement(float(decimal[1]), unit)), raw[decimal.end() :] + if unit == "feet": + tenths = re.match(rb"F(\d{4}|-\d{3}|\.{4})", raw) + if tenths: + field = tenths[1] + value = None if field == b"...." else int(field) / 10 + measurement = Measurement(value, "feet", raw=field) + return WaterHeight(measurement), raw[tenths.end() :] + whole = re.match(rb"[Ff](-?\d+)", raw) + if whole: + return WaterHeight(Measurement(float(whole[1]), unit)), raw[whole.end() :] + return None + + +def radiation_code(value: float | None) -> bytes: + if value is None: + return b"..." + for exponent in range(10): + mantissa = value / 10**exponent + if mantissa <= 99 and mantissa == int(mantissa): + return f"{int(mantissa):02d}{exponent}".encode() + raise FieldError("radiation is not two digits times a power of ten") + + +def _value(m: Measurement, unit: str) -> float | None: + v = m.value + if v is None or m.unit == unit: + return v + if unit == "fahrenheit" and m.unit == "celsius": + return v * 1.8 + 32 + if unit == "inches" and m.unit == "mm": + return v / 25.4 + if unit == "knots": + if m.unit == "m/s": + return v * 3600 / 1852 + if m.unit == "mph": + return v * 1.609344 / 1.852 + if m.unit == "km/h": + return v / 1.852 + if unit == "mph": + if m.unit == "m/s": + return v / 0.44704 + if m.unit == "knots": + return v * 1.852 / 1.609344 + if m.unit == "km/h": + return v / 1.609344 + raise FieldError("weather measurement unit cannot be encoded in this field") + + +def _number(value: float | None, width: int, scale: float = 1) -> bytes: + if value is None: + return b"." * width + number = round(value / scale) + raw = f"{number:0{width}d}".encode() + if len(raw) != width: + raise FieldError("weather value exceeds field width") + return raw + + +# Software S plus unit uuuu (APRS101 p.63) when they are all that remains. +CODES = re.compile(rb"[A-Za-z][A-Za-z0-9]{2,4}") + + +def write(w: Weather, *, positioned=False, compressed=False) -> bytes: + raw = b"" + if not positioned: + if w.timestamp is None: + raise FieldError("positionless weather requires timestamp") + raw = b"_" + encode_timestamp(w.timestamp) + if positioned and not compressed: + if w.wind_direction is None or w.wind_speed is None: + raise FieldError("positioned weather requires wind fields") + speed = w.wind_speed + value = ( + speed.value + if speed.unit == "disputed_knots_or_mph" + else _value(speed, "mph") + ) + raw += _number(w.wind_direction.value, 3) + b"/" + _number(value, 3) + for tag, (name, unit, width, scale) in _FIELDS.items(): + if tag == "l" or positioned and tag in "cs": + continue + reading = getattr(w, name) + if reading is None: + continue + v = _value(reading, unit) + if tag == "h" and v == 100: + v = 0 + if tag == "L" and v is not None and v >= 1000: + tag = "l" + v -= 1000 + raw += tag.encode() + _number(v, width, scale) + if w.snow_24h: + v = _value(w.snow_24h, "inches") + if v is not None and v != int(v): + field = f"{v:.1f}".encode() + if len(field) != 3: + raise FieldError("snow value exceeds field width") + else: + field = _number(v, 3) + raw += b"s" + field + if w.water_height: + if w.water_height.reference_datum is not None: + raise FieldError("water-height datum has no wire field") + m = w.water_height.measurement + if m.value is None: + if m.unit != "feet": + raise FieldError("only feet water height can be marked unavailable") + raw += b"F...." + else: + # A decimal point distinguishes feet from APRS 1.2's Fnnnn tenths. + # Expand exponents without rounding away small or precise readings; + # the water-height grammar accepts only ordinary decimal numbers. + height_text = format(Decimal(str(m.value)), "f") + if "." not in height_text: + height_text += ".0" + raw += (b"F" if m.unit == "feet" else b"f") + height_text.encode() + if w.radiation: + raw += b"X" + radiation_code(w.radiation.value) + if w.battery_voltage: + raw += b"V" + _number(w.battery_voltage.value, 3, 0.1) + raw += ( + (w.software_code or "").encode() + + (w.device_code or "").encode() + + w.comment.encode() + ) + return raw + + +def vendor(raw: bytes) -> Weather | None: + """Decode the documented Ultimeter 2000 numeric fields; keep raw separately.""" + if not raw.startswith((b"$ULTW", b"!!")): + return None + logging = raw.startswith(b"!!") + data = raw[2:] if logging else raw[5:] + values: list[int | None] = [] + for i in range(0, len(data) - 3, 4): + token = data[i : i + 4] + if token == b"----": + values.append(None) + continue + if not re.fullmatch(rb"[0-9A-Fa-f]{4}", token): + break + value = int(token, 16) + values.append(value - 65536 if value >= 32768 else value) + if not values: + return None + + def get(i): + return values[i] if i < len(values) else None + + found = {} + + def add(name, index, unit, convert): + value = get(index) + if value is not None: + found[name] = Measurement(convert(value), unit) + + add("wind_speed" if logging else "gust", 0, "m/s", lambda x: round(x / 36, 1)) + add("wind_direction", 1, "degrees", lambda x: round((x & 255) * 1.41176)) + add("temperature", 2, "celsius", lambda x: round((x / 10 - 32) / 1.8, 1)) + add("rain_since_midnight", 3, "mm", lambda x: round(x * 0.254, 1)) + if get(4) is not None and get(4) >= 10: + add("pressure", 4, "hPa", lambda x: x / 10) + humidity = 6 if logging else 8 + if get(humidity) is not None and 1 <= get(humidity) // 10 <= 100: + add("humidity", humidity, "percent", lambda x: x // 10) + add( + "rain_since_midnight", + 10 if logging else 11, + "mm", + lambda x: round(x * 0.254, 1), + ) + add("wind_speed", 11 if logging else 12, "m/s", lambda x: round(x / 36, 1)) + return Weather(**found, raw=raw) diff --git a/packages/aprs/tests/fap_divergences.json b/packages/aprs/tests/fap_divergences.json new file mode 100644 index 0000000..a1d6ae6 --- /dev/null +++ b/packages/aprs/tests/fap_divergences.json @@ -0,0 +1,410 @@ +{ + "reasons": { + "whitespace": "Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them.", + "case": "Callsigns keep the case transmitted; FAP uppercases them.", + "course_zero": "A compressed course byte of 0 is reported as 0 degrees, as transmitted; FAP rewrites it to 360.", + "mic_e_sequence": "Mic-E hex telemetry carries no sequence number, so none is reported; FAP reports 0.", + "nmea_precision": "NMEA course keeps the transmitted precision; FAP rounds to whole degrees.", + "nmea_symbol": "APRS101 assigns a default symbol from the source SSID when NMEA has no symbol destination (SSID 11 is the balloon, /O); FAP reports no symbol.", + "parm_case": "APRS101 defines the telemetry keywords in upper case, so 'parm.' is ordinary message text; FAP matches them case-insensitively.", + "wx_symbol": "A weather-station symbol with no weather fields is a position with a comment; FAP reports an empty weather report and discards the comment.", + "disputed_wind": "The uncompressed wind-speed unit is disputed between the specifications and stays marked as disputed; FAP assumes mph.", + "user_defined": "'{' is APRS101's user-defined data type, so this decodes as user-defined data; FAP rejects experimental formats.", + "unknown_nmea": "Unknown NMEA sentences are kept as opaque data with an 'unsupported' diagnostic, not rejected.", + "vtg": "$GPVTG is a supported NMEA sentence (course and speed only, so no usable position); FAP rejects it.", + "beacon": "Text with no position in the first 40 bytes is a non-APRS beacon, kept as text; FAP rejects it.", + "mic_e_type_suffix": "APRS 1.2 Mic-E type codes end the status text with a declared version suffix (\"=\" after \"]\" is the TM-D710); it is part of device_code, not comment text.", + "mic_e_type_byte": "APRS 1.2 redefines a leading ` or ' as a Mic-E type byte; APRS101 hex telemetry needs the complete form (10 hex digits after '), so this is a type code followed by comment text. FAP reads two channels.", + "mic_e_manufacturer": "APRS 1.2 Mic-E type code ' with the Byonics TinyTrack3 suffix |3 is stored in device_code; FAP keeps both in the comment.", + "mic_e_corrupt": "A byte was lost in transit, so the symbol table is invalid; FAP's accept_broken_mice option guesses the repair, while the public parser reports the packet as Malformed.", + "timestamp_day_zero": "Day 00 is not a valid timestamp, so the packet is Malformed and Malformed.recovered keeps the other fields; FAP decodes them with a warning. TIM-011 allows either.", + "gll_minimal": "This GLL sentence has no time or fix status, which the GLL model requires and the parser does not invent, so it is Malformed; FAP accepts the coordinates alone.", + "telemetry_short": "A short telemetry report decodes with only the channels transmitted and is marked nonconforming; FAP pads it to five channels.", + "telemetry_invalid": "A non-numeric telemetry channel cannot be decoded, so the report is Malformed; FAP keeps the channels before it.", + "telemetry_comment": "Text after the telemetry digital bits is kept as the comment; FAP discards it.", + "weather_unknown_field": "'O' is not a weather field in APRS101, the APRS 1.1 clarification or the APRS 1.2 proposal, so the report ends there and the rest stays in the comment; FAP skips it." + }, + "rows": { + "FAP-005": { + "reasons": ["mic_e_type_suffix"], + "set": { + "$.payload.comment": "", + "$.payload.device_code": "]=" + } + }, + "FAP-013": { + "reasons": ["case"], + "set": { + "$.header.source": "oh7lzb" + } + }, + "FAP-016": { + "reasons": ["case"], + "set": { + "$.header.destination": "aprs" + } + }, + "FAP-022": { + "reasons": ["user_defined"], + "accept": { + "payload": { + "type": "user_defined", + "user_id": "{", + "user_type": " ", + "data": "unsupported experimental format" + } + } + }, + "FAP-030": { + "reasons": ["course_zero", "whitespace"], + "set": { + "$.payload.comment": " Tero, Green Volvo 960, GGL-880", + "$.payload.extensions.motion.course_deg": 0 + } + }, + "FAP-034": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " 12.3V 21C" + } + }, + "FAP-035": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " http://aprs.fi/" + } + }, + "FAP-346": { + "reasons": ["mic_e_type_suffix"], + "set": { + "$.payload.comment": "", + "$.payload.device_code": "]=" + } + }, + "FAP-347": { + "reasons": ["mic_e_sequence", "whitespace"], + "set": { + "$.payload.comment": " commeeeent", + "$.payload.extensions.telemetry.sequence": null + } + }, + "FAP-348": { + "reasons": ["mic_e_type_byte"], + "set": { + "$.payload.comment": "1020 commeeeent", + "$.payload.device_code": "'" + }, + "remove": ["$.payload.extensions.telemetry"] + }, + "FAP-349": { + "reasons": ["mic_e_corrupt"], + "replace": { + "type": "malformed" + }, + "drop_unmapped": ["$."] + }, + "FAP-357": { + "reasons": ["nmea_precision", "nmea_symbol"], + "set": { + "$.payload.sentence.course_deg": 27.9, + "$.payload.symbol": { + "table_id": "/", + "code": "O" + } + } + }, + "FAP-359": { + "reasons": ["nmea_symbol"], + "set": { + "$.payload.symbol": { + "table_id": "/", + "code": "O" + } + } + }, + "FAP-361": { + "reasons": ["nmea_symbol"], + "set": { + "$.payload.symbol": { + "table_id": "/", + "code": "O" + } + } + }, + "FAP-362": { + "reasons": ["gll_minimal"], + "replace": { + "type": "malformed" + }, + "drop_unmapped": ["$."] + }, + "FAP-363": { + "reasons": ["unknown_nmea"], + "accept": { + "payload": { + "type": "opaque", + "information": "$XXXXX,A,B,C", + "diagnostic": { + "code": "unsupported", + "path": "$" + } + } + } + }, + "FAP-366": { + "reasons": ["vtg"], + "accept": { + "payload": { + "type": "nmea", + "sentence": { + "type": "vtg", + "course_true_deg": 0.0, + "course_magnetic_deg": 0.0, + "speed_knots": 0.0, + "speed_kmh_reported": 0.0 + }, + "metadata": { + "talker": "GP", + "checksum_supplied": null, + "checksum_valid": null, + "fields_raw": ["0", "T", "0", "M", "0", "N", "0", "K"] + }, + "position_usable": false, + "symbol": null, + "comment": "" + } + } + }, + "FAP-408": { + "reasons": ["beacon"], + "accept": { + "payload": { + "type": "beacon", + "text": "0123456789012345678901234567890123456789!6028.51N/02505.68E#" + } + } + }, + "FAP-409": { + "reasons": ["beacon"], + "accept": { + "payload": { + "type": "beacon", + "text": "Tno position here at all" + } + } + }, + "FAP-417": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": "test " + } + }, + "FAP-418": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " " + } + }, + "FAP-419": { + "reasons": ["course_zero", "whitespace"], + "set": { + "$.payload.comment": " Tero, Green Volvo 960, GGL-880", + "$.payload.extensions.motion.course_deg": 0 + } + }, + "FAP-421": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": "a|b " + } + }, + "FAP-428": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " comment " + } + }, + "FAP-429": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " comment " + } + }, + "FAP-430": { + "reasons": ["mic_e_manufacturer"], + "set": { + "$.payload.comment": "|", + "$.payload.device_code": "'|3" + } + }, + "FAP-431": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " comment " + } + }, + "FAP-433": { + "reasons": ["telemetry_comment"], + "set": { + "$.payload.comment": " comment" + } + }, + "FAP-434": { + "reasons": ["telemetry_short"], + "set": { + "$.payload.analog": [42.0] + } + }, + "FAP-436": { + "reasons": ["telemetry_invalid"], + "replace": { + "type": "malformed" + }, + "drop_unmapped": ["$."] + }, + "FAP-444": { + "reasons": ["parm_case"], + "set": { + "$.payload": { + "type": "message", + "addressee": "N0CALL", + "text": "parm.Vin,Rx1h", + "message_id": null, + "reply_ack": null + } + } + }, + "FAP-446": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " {UIV32N}" + } + }, + "FAP-447": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " {UIV32N}" + } + }, + "FAP-448": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " 14.3V 27C HDOP01.0 SATS09" + } + }, + "FAP-449": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " 14.3V 27C HDOP01.0 SATS09" + } + }, + "FAP-450": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " 14.3V 27C HDOP01.0 SATS09" + } + }, + "FAP-451": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " 14.3V 27C HDOP01.0 SATS09" + } + }, + "FAP-452": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " {UIV32N}" + } + }, + "FAP-453": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " 14.3V 27C HDOP01.0 SATS09" + } + }, + "FAP-454": { + "reasons": ["timestamp_day_zero"], + "replace": { + "type": "malformed" + }, + "drop_unmapped": ["$."] + }, + "FAP-455": { + "reasons": ["timestamp_day_zero"], + "replace": { + "type": "malformed" + }, + "drop_unmapped": ["$."] + }, + "FAP-456": { + "reasons": ["timestamp_day_zero"], + "replace": { + "type": "malformed" + }, + "drop_unmapped": ["$."] + }, + "FAP-457": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " " + } + }, + "FAP-465": { + "reasons": ["wx_symbol"], + "set": { + "$.payload.comment": "Home of KA0RID" + }, + "remove": ["$.payload.extensions.weather"], + "drop_unmapped": ["$.fap_fields.Wx."] + }, + "FAP-471": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " 13.8V 15CYB1RUS-9 Mobile Tracker" + } + }, + "FAP-472": { + "reasons": ["whitespace"], + "set": { + "$.payload.comment": " 13.8V 15CYB1RUS-9 Mobile Tracker" + } + }, + "FAP-474": { + "reasons": ["disputed_wind"], + "set": { + "$.payload.extensions.weather.wind_speed.unit": "disputed_knots_or_mph" + } + }, + "FAP-475": { + "reasons": ["disputed_wind"], + "set": { + "$.payload.extensions.weather.wind_speed.unit": "disputed_knots_or_mph" + } + }, + "FAP-476": { + "reasons": ["disputed_wind"], + "set": { + "$.payload.extensions.weather.wind_speed.unit": "disputed_knots_or_mph" + } + }, + "FAP-489": { + "reasons": ["weather_unknown_field"], + "set": { + "$.payload.comment": "Os...L...F....X...V..." + } + }, + "FAP-490": { + "reasons": ["weather_unknown_field"], + "set": { + "$.payload.comment": "Os010L500" + }, + "remove": ["$.payload.snow_24h", "$.payload.luminosity"] + }, + "FAP-497": { + "reasons": ["disputed_wind"], + "set": { + "$.payload.extensions.weather.wind_speed.unit": "disputed_knots_or_mph" + } + } + } +} diff --git a/packages/aprs/tests/generate_vectors.py b/packages/aprs/tests/generate_vectors.py new file mode 100644 index 0000000..81a087a --- /dev/null +++ b/packages/aprs/tests/generate_vectors.py @@ -0,0 +1,906 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Translate documented assertions, never parser output, into JSON projections. + +Run from any directory. Unmapped assertions remain verbatim beside the projection; +they are deliberately not claimed as tested public-model fields. +""" + +from __future__ import annotations + +import copy +import json +import re +from collections import Counter +from pathlib import Path +from typing import Any + +ROOT = Path(__file__).parents[1] +SOURCE = ROOT / "docs/APRS_COMPLIANCE_VECTORS.md" +DEST = ROOT / "tests/vectors" +DIVERGENCES = ROOT / "tests/fap_divergences.json" +JSON = dict[str, Any] + + +def leaf_paths(value: Any, path: str = "$") -> set[str]: + if isinstance(value, dict) and value: + return { + leaf + for key, child in value.items() + for leaf in leaf_paths(child, f"{path}.{key}") + } + return {path} + + +class Tracked(dict[str, Any]): + """Record source fields consulted by the explicit projection mapping.""" + + def __init__(self, value: JSON, used: set[str], path: str = "$"): + super().__init__(value) + self.used, self.path = used, path + + def __getitem__(self, key: str) -> Any: + value = super().__getitem__(key) + path = f"{self.path}.{key}" + if isinstance(value, dict): + return Tracked(value, self.used, path) + self.used.add(path) + return value + + def get(self, key: str, default: Any = None) -> Any: + try: + return self[key] + except KeyError: + return default + + +def select(data: JSON, names: str) -> JSON: + return {k: data[k] for k in names.split() if k in data} + + +def header(data: JSON) -> JSON: + return { + "source": data["source"], + "destination": data["destination"], + "path": [ + {"address": h["address"], "repeated": h["repeated_marker"]} + for h in data["path"] + ], + } + + +def stamp(data: JSON) -> JSON: + kind = { + "DHM": ( + "dhm_local" + if str(data.get("zone")).lower() in ("local", "sender-local") + else "dhm_utc" + ), + "HMS": "hms_utc", + "MDHM": "mdhm_utc", + }[data["format"]] + return {"kind": kind, **select(data, "day month hour minute second")} + + +def symbol(data: JSON) -> JSON: + return {"table_id": data["table_id_raw"], "code": data["code"]} + + +def telemetry(data: JSON) -> JSON: + result = select(data, "sequence sequence_raw") + if "analog_raw" in data: + result["analog"] = data["analog_raw"] + if "digital_bits" in data: + result["digital"] = [c == "1" for c in data["digital_bits"]] + result["encoding"] = data.get("encoding", "classic").replace("-", "_") + if result.get("sequence_raw") == "MIC": + result["sequence"] = "MIC" + return result + + +def weather(data: JSON) -> JSON: + result = select(data, "software_code device_code") + units = { + "wind_direction_deg": ("wind_direction", "degrees"), + "wind_speed_mph": ("wind_speed", "mph"), + "wind_speed_knots": ("wind_speed", "knots"), + "gust_mph": ("gust", "mph"), + "temperature_f": ("temperature", "fahrenheit"), + "humidity_percent": ("humidity", "percent"), + "pressure_hpa": ("pressure", "hPa"), + "snow_24h_inches": ("snow_24h", "inches"), + "luminosity_w_m2": ("luminosity", "W/m2"), + "rain_counter_raw": ("rain_counter", "count"), + } + for key, (name, unit) in units.items(): + if key in data: + result[name] = {"value": data[key], "unit": unit} + if "water_height" in data: + w = data["water_height"] + result["water_height"] = { + "measurement": { + "value": w["value"], + "unit": {"ft": "feet", "m": "meters"}[w["unit"]], + }, + "reference_datum": w["reference_datum"], + } + # Rain is sent in hundredths of an inch. Project that wire unit, like every + # other reading; the source's millimetre conversions stay unmapped. + for name in ("rain_1h", "rain_24h", "rain_since_midnight"): + if f"{name}_hundredth_in" in data: + hundredths = data[f"{name}_hundredth_in"] + value = None if hundredths is None else hundredths / 100 + result[name] = {"value": value, "unit": "inches"} + if "wind_speed_raw" in data: + result["wind_speed"] = { + "value": data["wind_speed_raw"], + "unit": "disputed_knots_or_mph", + } + return result + + +def translate(e: JSON) -> JSON: + """A subset in to_json_dict(include_defaults=True) shape; no model/parser calls.""" + result: JSON = {"type": "packet"} + if "header" in e: + result["header"] = header(e["header"]) + kind = e.get("kind") + aliases = { + "third-party": "third_party", + "telemetry-definition": "telemetry_definition", + "user-defined": "user_defined", + "invalid-or-test": "invalid", + "raw-weather": "raw_weather", + "legacy-grid-beacon": "maidenhead", + "non-aprs-beacon": "beacon", + "unsupported-or-reserved": "opaque", + "announcement": "bulletin", + "group-bulletin": "bulletin", + "nws-bulletin": "nws_bulletin", + } + if kind is None: + return result + p: JSON = {"type": aliases.get(kind, kind)} + if kind == "weather" and "position" in e: + p["type"] = "position" + if e.get("format") == "mic-e": + p["type"] = "mic_e" + for name in ("comment", "messaging", "name", "alive"): + if name in e: + p[name] = e[name] + if "position" in e and kind != "nmea": + pos = e["position"] + p.update(select(pos, "latitude_deg longitude_deg")) + if "ambiguity_digits" in pos: + p["ambiguity"] = pos["ambiguity_digits"] + if "symbol" in e: + p["symbol"] = symbol(e["symbol"]) + if "timestamp" in e: + p["timestamp"] = stamp(e["timestamp"]) + if "compression" in e: + c = e["compression"] + p["compression"] = select(c, "fix nmea_source origin_code") + if "csT_raw" in c: + p["compression"]["raw"] = c["csT_raw"] + if "ignored" in c: + p["compression"]["ignored"] = c["ignored"] + if "mic_e" in e: + m = e["mic_e"] + names = { + "Off Duty": "off_duty", + "En Route": "en_route", + "In Service": "in_service", + "Returning": "returning", + "Committed": "committed", + "Special": "special", + "Priority": "priority", + "Emergency": "emergency", + } + if m.get("position_comment") in names: + p["message"] = names[m["position_comment"]] + if str(m.get("position_comment", "")).startswith("Custom-"): + p["message"] = m["position_comment"].lower().replace("-", "_") + if str(m.get("position_comment")).lower() == "unknown": + p["message"] = "unknown" + if m.get("dti_fix") in ("current", "old"): + p["fix"] = m["dti_fix"] + if "grid_locator" in e: + # The public model retains the optional grid as status text, not + # inside the device identifier. Preserve the captured trailing text. + grid_symbol = e["grid_symbol"] + p["comment"] = ( + e["grid_locator"] + + grid_symbol["table_id_raw"] + + grid_symbol["code"] + + p.get("comment", "") + ) + p["device_code"] = m["type_marker"] + ext: JSON = {} + for old, new, fields in ( + ("motion", "motion", "course_deg speed_knots course_code speed_code zero_pair"), + ( + "phg", + "phg", + "power_w height_haat_ft gain_dbi directivity_deg raw rate_per_hour", + ), + ("radio_range", "range", "miles"), + ("df_signal", "signal", "s_units height_haat_ft gain_db directivity_deg"), + ( + "df_bearing", + "bearing", + # usable/accuracy derive from a disputed Q mapping; see UNRESOLVED_SPEC.md. + "bearing_deg hits_code range_code quality_code", + ), + ( + "area", + "area", + "shape_code color_code latitude_offset_code longitude_offset_code corridor_half_width_miles", + ), + ("signpost", "signpost", "label"), + ): + if old in e: + ext[new] = select(e[old], fields) + if "altitude" in e and kind != "nmea": + alt = e["altitude"] + unit = "feet" if "feet" in alt else "meters" + enc = { + "comment": "feet_extension", + "compressed": "compressed", + "mic-e": "mic_e", + "mic-e-base91": "mic_e", + }[alt.get("encoding", "comment")] + ext["altitude"] = { + "measurement": {"value": alt[unit], "unit": unit}, + "encoding": enc, + } + if "weather" in e: + if kind == "weather" and "position" not in e: + p.update(weather(e["weather"])) + else: + if kind == "weather": + p["type"] = "position" + ext["weather"] = weather(e["weather"]) + if "telemetry" in e: + if kind == "telemetry": + p.update(telemetry(e["telemetry"])) + else: + ext["telemetry"] = telemetry(e["telemetry"]) + if ext: + p["extensions"] = ext + if kind == "status": + p["text"] = e["status_text"] + if "grid" in e: + p["grid"] = {"locator": e["grid"]["locator"]} + if "beam_heading_deg" in e: + p["beam"] = {"heading_deg": e["beam_heading_deg"], "erp_w": e["erp_w"]} + if "message" in e and kind not in ("query", "telemetry-definition"): + m = e["message"] + p.update(select(m, "addressee text message_id")) + if m.get("subtype") in ("ack", "rej"): + p = { + "type": "acknowledgment", + "addressee": m["addressee"], + "message_id": m.get("ack_id", m.get("reject_id")), + "rejected": m["subtype"] == "rej", + } + if m.get("reply_ack_capable"): + p["reply_ack"] = m.get("reply_ack_id") or "" + if m.get("auto_answer"): + p = { + "type": "auto_answer", + "addressee": m["addressee"], + "text": m["text"][3:], + "previous_ack": m.get("reply_ack_id"), + } + if p["type"] == "nws_bulletin": + p["reference_id"] = p.pop("message_id", None) + if p["type"] == "bulletin": + p = { + "type": "bulletin", + "identifier": m["bulletin_id"], + "text": m["text"], + "group": m.get("group"), + } + if kind == "query": + q = e["query"] + p["name"] = q["type"] + if "heard_station" in q: + p["heard_station"] = q["heard_station"] + if "message" in e: + p["addressee"] = e["message"]["addressee"] + if "radius_miles" in q: + p["footprint"] = { + "center": select(q, "latitude_deg longitude_deg"), + "radius_miles": q["radius_miles"], + } + if kind == "capabilities": + p["tokens"] = e["capabilities"] + if kind == "telemetry-definition": + d = e["telemetry_definition"] + p["addressee"] = d["target"] + tags = { + "PARM": "telemetry_parameters", + "UNIT": "telemetry_units", + "EQNS": "telemetry_equations", + "BITS": "telemetry_bits", + } + definition: JSON = {"type": tags[d["type"]]} + if "channels" in d: + channels = d["channels"] + definition["channels"] = channels + [None] * (13 - len(channels)) + if "coefficients_abc" in d: + definition["coefficients"] = [ + dict(zip(("a", "b", "c"), x)) for x in d["coefficients_abc"] + ] + if "sense_bits" in d: + definition.update( + sense=[x == "1" for x in d["sense_bits"]], + project_title=d["project_title"], + ) + p["definition"] = definition + if kind == "third-party": + p["packet"] = translate(e["inner"]) + p["packet"].pop("type", None) + if kind in ("user-defined", "invalid-or-test"): + p.update(select(e, "user_id user_type data")) + if kind == "unsupported-or-reserved": + p["information"] = e.get("dti", "") + e.get("raw_data", "") + if "storm" in e: + storm = e["storm"] + p.setdefault("extensions", {})["storm"] = { + # APRS101 storm codes; unknown source names fail generation. + "kind": { + "hurricane": "HC", + "tropical-storm": "TS", + "tropical-depression": "TD", + }[storm["type"]], + **select( + storm, + "predicted sustained_wind_knots peak_gust_knots central_pressure_hpa hurricane_radius_nm tropical_storm_radius_nm whole_gale_radius_nm", + ), + } + if kind == "nmea" and "nmea" in e: + n = e["nmea"] + sentence: JSON = {"type": n["sentence"][2:].lower()} + renames = { + "time_utc_raw": "time_utc", + "date_ddmmyy_raw": "date_ddmmyy", + "dgps_age_raw": "dgps_age", + "dgps_station_raw": "dgps_station", + } + sentence.update( + { + v: (n[k] or None) if k.startswith("dgps_") else n[k] + for k, v in renames.items() + if k in n + } + ) + sentence.update( + select( + n, + "fix_quality fix_status satellites hdop geoid_separation_m magnetic_variation_direction", + ) + ) + if n.get("magnetic_variation_raw"): + sentence["magnetic_variation"] = float(n["magnetic_variation_raw"]) + if "position" in e: + sentence["coordinates"] = select( + e["position"], "latitude_deg longitude_deg" + ) + if "waypoint" in e: + sentence.update( + name=e["waypoint"]["name"], + coordinates=select(e["waypoint"], "latitude_deg longitude_deg"), + ) + if "altitude" in e: + sentence["altitude_msl_m"] = e["altitude"]["meters"] + if "motion" in e: + sentence.update( + select( + e["motion"], + "speed_knots course_deg course_true_deg course_magnetic_deg speed_kmh_reported", + ) + ) + p.pop("extensions", None) + p.update( + sentence=sentence, + metadata={ + "talker": n["sentence"][:2], + **select(n, "checksum_supplied checksum_valid fields_raw"), + }, + ) + if "position_usable" in e: + p["position_usable"] = e["position_usable"] + if kind == "raw-weather": + formats = {"Ultimeter 2000": "ultimeter_2000", "Ultimeter II": "ultimeter_ii"} + p.update(information=e["raw_payload"]) + if e["vendor"] in formats: + p["format"] = formats[e["vendor"]] + if kind == "legacy-grid-beacon": + p["grid"] = {"locator": e["grid"]["locator"]} + if kind == "non-aprs-beacon" and "raw_text" in e: + p["text"] = e["raw_text"] + if "nts" in e: + # The source explicitly identifies the NTS record and its positional fields. + n = e["nts"] + fields = n["fields"] + schemas = { + "N#": ( + "nts_header", + "number precedence handling originator check place time date", + ), + "NA": ("nts_address", ""), + "NP": ("nts_phone", "number"), + "NT": ("nts_text", "text"), + "NS": ("nts_signature", "text"), + "NR": ("nts_routing", "received_from received_at sent_to sent_at"), + } + if n["record_type"] in {"N1", "N2", "N3", "N4", "N5", "N6"}: + schemas[n["record_type"]] = ("nts_text", "text") + if n["record_type"] in schemas: + tag, field_names = schemas[n["record_type"]] + record = {"type": tag, **dict(zip(field_names.split(), fields))} + if tag == "nts_address": + record["lines"] = fields + if tag == "nts_text": + record["line"] = int(n["record_type"][1]) + p = { + "type": "radiogram", + "addressee": e["message"]["addressee"], + "record": record, + "message_id": e["message"].get("message_id"), + } + if p.get("type") == "message" and p.get("message_id") is None: + text = p.get("text", "") + response = None + if text.startswith("Directs= "): + response = {"type": "direct_stations", "stations": text[9:].split()} + elif match := re.fullmatch( + r"([A-Za-z0-9-]+) HEARD: ((?:[0-9]+|\.)(?: (?:[0-9]+|\.)){7})", text + ): + response = { + "type": "heard_station", + "station": match[1], + "counts": [None if c == "." else int(c) for c in match[2].split()], + } + elif re.fullmatch(r"[A-Za-z0-9-]+>[A-Za-z0-9,*-]+:", text): + source, route = text[:-1].split(">") + dest, *hops = route.split(",") + response = { + "type": "trace", + "header": { + "source": source, + "destination": dest, + "path": [ + {"address": h.rstrip("*"), "repeated": h.endswith("*")} + for h in hops + ], + }, + } + if response is not None: + p = {"type": "response", "addressee": p["addressee"], "response": response} + result["payload"] = p + return result + + +def fap_projection(e: JSON, packet: str) -> JSON: + """Map only explicit captured FAP values; no implicit defaults or guessed units.""" + f, h = e["fap_fields"], e["fap_header"] + normal: JSON = { + "header": { + "source": h["source"], + "destination": h["destination"], + "path": [ + {"address": x["Call"], "repeated_marker": x["WasDigied"]} + for x in (h.get("digipeaters") or []) + ], + } + } + normal["kind"] = { + "location": "position", + "wx": "weather", + "beacon": "non-aprs-beacon", + "telemetry-message": "telemetry-definition", + }.get(f.get("Type"), f.get("Type")) + + renames = { + "Format": "format", + "Comment": "comment", + "Messaging": "messaging", + "Alive": "alive", + "Status": "status_text", + } + normal.update({v: f[k] for k, v in renames.items() if f.get(k) is not None}) + if normal.get("format") == "mice": + normal["format"] = "mic-e" + name_key = "ObjectName" if normal["kind"] == "object" else "ItemName" + if f.get(name_key): + normal["name"] = f[name_key].rstrip(" ") + if f.get("Latitude") is not None or f.get("Longitude") is not None: + normal["position"] = { + v: f[k] + for k, v in { + "Latitude": "latitude_deg", + "Longitude": "longitude_deg", + "PosAmbiguity": "ambiguity_digits", + }.items() + if f.get(k) is not None + } + if f.get("SymbolTable") is not None and f.get("SymbolCode") is not None: + normal["symbol"] = {"table_id_raw": f["SymbolTable"], "code": f["SymbolCode"]} + if f.get("Message") is not None: + m = f["Message"] + normal["message"] = { + "addressee": m["Destination"], + "text": m["Text"], + "message_id": m.get("ID") or None, + } + if (m.get("AckID") or m.get("RejID")) and not m.get("Text"): + normal["message"].update( + subtype="rej" if m.get("RejID") else "ack", + ack_id=m.get("AckID") or m.get("RejID"), + ) + elif m.get("AckID"): + normal["message"].update(reply_ack_capable=True, reply_ack_id=m["AckID"]) + # FAP has distinct units/options; unsupported fields stay in source_expected. + if normal.get("kind") == "query": + normal.pop("kind") + if normal.get("kind") == "status" and "status_text" not in normal: + normal.pop("kind") + if normal.get("kind") == "capabilities": + # The source packet supplies token order; the captured map supplies values. + capabilities = f["Capabilities"] + names = [ + token.split("=", 1)[0] for token in packet.partition(":")[2][1:].split(",") + ] + normal["capabilities"] = [ + {"name": name, "value": capabilities[name] or None} for name in names + ] + if normal.get("kind") == "telemetry-definition": + text = normal["message"]["text"] + name, _, rest = text.partition(".") + name = name.upper() + values = rest.split(",") + definition: JSON = {"target": normal["message"]["addressee"], "type": name} + if name in ("PARM", "UNIT"): + definition["channels"] = [v or None for v in values] + elif name == "EQNS" and len(values) % 3 == 0: + definition["coefficients_abc"] = [ + [float(x) for x in values[i : i + 3]] for i in range(0, len(values), 3) + ] + elif name == "BITS": + definition.update(sense_bits=values[0], project_title=",".join(values[1:])) + normal["telemetry_definition"] = definition + result = translate(normal) + payload = result.get("payload", {}) + comment = payload.get("comment", "") + if ( + payload.get("type") == "mic_e" + and comment[:1] in ("]", ">") + and packet.partition(":")[2][9:10] == comment[:1] + ): + # Split the captured marker into its public field without losing text. + # A broken fixed-width body must not be reinterpreted by this migration. + payload["device_code"], payload["comment"] = comment[0], comment[1:] + if payload.get("type") not in ( + "position", + "mic_e", + "object", + "item", + "weather", + "telemetry", + "nmea", + ): + payload.pop("comment", None) + payload.pop("messaging", None) + payload.pop("alive", None) + for source, target, factor in ( + ("Speed", "speed_knots", 1 / 1.852), + ("Course", "course_deg", 1), + ): + if f.get(source) is not None: + payload.setdefault("extensions", {}).setdefault("motion", {})[target] = ( + f[source] * factor + ) + if f.get("RadioRange") is not None: + payload.setdefault("extensions", {})["range"] = { + "miles": f["RadioRange"] / 1.609344 + } + if f.get("TelemetryData") is not None: + t = f["TelemetryData"] + analog = list(t["Vals"]) + if payload.get("type") != "telemetry" and re.search( + r"\|(?:[\x21-\x7b]{2}){2,7}\|", packet.partition(":")[2] + ): + # FAP pads omitted base91 channels to five null-capable slots; + # the public schema stores only the transmitted analog channels. + while analog and analog[-1] is None: + analog.pop() + mapped = {"sequence": t["Seq"], "analog": analog} + if t["Bits"]: + mapped["digital"] = [x == "1" for x in t["Bits"]] + if payload.get("type") == "telemetry": + payload.update(mapped) + else: + payload.setdefault("extensions", {})["telemetry"] = mapped + if f.get("PHG") and re.fullmatch(r"[0-9][0-9:;][0-9][0-8][0-9A-Z]?", f["PHG"]): + code = f["PHG"] + phg: JSON = { + "power_w": int(code[0]) ** 2, + "height_haat_ft": 10 * 2 ** (ord(code[1]) - 48), + "gain_dbi": int(code[2]), + "directivity_deg": int(code[3]) * 45 if code[3] != "0" else None, + } + if len(code) == 5: + phg["rate_per_hour"] = int(code[4], 36) + payload.setdefault("extensions", {})["phg"] = phg + if f.get("Altitude") is not None and f.get("Format") in ( + "uncompressed", + "compressed", + "mic-e", + "mice", + ): + encoding = { + "uncompressed": "feet_extension", + "compressed": "compressed", + "mic-e": "mic_e", + "mice": "mic_e", + }[f["Format"]] + unit = "meters" if encoding == "mic_e" else "feet" + altitude = f["Altitude"] if unit == "meters" else f["Altitude"] / 0.3048 + payload.setdefault("extensions", {})["altitude"] = { + "encoding": encoding, + "measurement": {"unit": unit, "value": altitude}, + } + if f.get("Wx") is not None: + wx = f["Wx"] + mapped_wx = {} + vendor = packet.partition(":")[2].startswith(("$ULTW", "!!")) + for key, target, unit, scale, offset in ( + ("WindDirection", "wind_direction", "degrees", 1, 0), + ( + "WindSpeed", + "wind_speed", + "m/s" if vendor else "mph", + 1 if vendor else 1 / 0.44704, + 0, + ), + ( + "WindGust", + "gust", + "m/s" if vendor else "mph", + 1 if vendor else 1 / 0.44704, + 0, + ), + ( + "Temp", + "temperature", + "celsius" if vendor else "fahrenheit", + 1 if vendor else 1.8, + 0 if vendor else 32, + ), + ("Humidity", "humidity", "percent", 1, 0), + ("Pressure", "pressure", "hPa", 1, 0), + ( + "Rain1h", + "rain_1h", + "mm" if vendor else "inches", + 1 if vendor else 1 / 25.4, + 0, + ), + ( + "Rain24h", + "rain_24h", + "mm" if vendor else "inches", + 1 if vendor else 1 / 25.4, + 0, + ), + ( + "RainMidnight", + "rain_since_midnight", + "mm" if vendor else "inches", + 1 if vendor else 1 / 25.4, + 0, + ), + ( + "Snow24h", + "snow_24h", + "mm" if vendor else "inches", + 1 if vendor else 1 / 25.4, + 0, + ), + ("Luminosity", "luminosity", "W/m2", 1, 0), + ("Radiation", "radiation", "nSv/h", 1, 0), + ("BatteryVoltage", "battery_voltage", "volts", 1, 0), + ): + if wx.get(key) is not None: + # Convert captured expectations, never values from the decoder. + # No rounding: the original physical measurement is preserved. + mapped_wx[target] = {"value": wx[key] * scale + offset, "unit": unit} + if wx.get("WaterLevel") is not None: + # FAP reports metres; the APRS wire field is feet. + mapped_wx["water_height"] = { + "measurement": {"value": wx["WaterLevel"] / 0.3048, "unit": "feet"} + } + if normal.get("format") == "compressed": + # FAP flattens the compressed weather wind pair into Course/Speed. + # Our schema places that same pair inside extensions.weather. + motion = payload.get("extensions", {}).pop("motion", {}) + for key, target, unit in ( + ("course_deg", "wind_direction", "degrees"), + ("speed_knots", "wind_speed", "knots"), + ): + if key in motion: + mapped_wx[target] = {"value": motion[key], "unit": unit} + if payload.get("type") == "weather": + payload.update(mapped_wx) + else: + payload.setdefault("extensions", {})["weather"] = mapped_wx + if vendor: + payload.pop("type") + result["payload"] = { + "type": "raw_weather", + "format": "ultimeter_2000", + "information": packet.partition(":")[2], + "weather": payload, + } + if f.get("Format") == "nmea": + # Keep the snapshot's values (including rounded course and absent symbol) + # in typed NMEA fields. Missing time/fix fields are not invented. + sentence: JSON = {"type": packet.partition(":")[2][3:6].lower()} + if normal.get("position"): + sentence["coordinates"] = select( + normal["position"], "latitude_deg longitude_deg" + ) + for key, target, scale in ( + ("Altitude", "altitude_msl_m", 1), + ("Speed", "speed_knots", 1 / 1.852), + ("Course", "course_deg", 1), + ): + if f.get(key) is not None: + sentence[target] = f[key] * scale + table, code = f.get("SymbolTable"), f.get("SymbolCode") + result["payload"] = { + "type": "nmea", + "sentence": sentence, + "symbol": ( + {"table_id": table, "code": code} + if table is not None and code is not None + else None + ), + "metadata": {"checksum_valid": f["ChecksumOK"]}, + } + return result + + +def diverge(row: JSON, divergences: JSON) -> None: + """Replace FAP-specific interpretations with the reviewed public expectation. + + Each override names its reasons; source_expected keeps FAP's own values. + """ + assert row["profile"] == "compatibility-fap", row["id"] + entry = divergences["rows"][row["id"]] + row["divergence"] = [divergences["reasons"][key] for key in entry["reasons"]] + if "replace" in entry: + row["expected"] = {"original_wire": row["packet"], **entry["replace"]} + if "accept" in entry: + assert row.pop("rejection"), row["id"] + row["expected"] = { + "type": "packet", + "original_wire": row["packet"], + **entry["accept"], + } + return + for path, value in entry.get("set", {}).items(): + *parents, key = path.removeprefix("$.").split(".") + target = row["expected"] + for name in parents: + target = target[name] + target[key] = value + for prefix in entry.get("drop_unmapped", []): + # Facts from FAP's interpretation that the public expectation rejects. + row["unmapped"] = [p for p in row["unmapped"] if not p.startswith(prefix)] + for path in entry.get("remove", []): + *parents, key = path.removeprefix("$.").split(".") + target = row["expected"] + for name in parents: + target = target[name] + del target[key] + + +def nest_legacy_position(result: JSON, packet: str) -> None: + """Use the existing wrapper for source assertions identifying a position.""" + payload = result.get("payload", {}) + if payload.get("type") == "position": + body = packet.partition(":")[2] + prefix, marker, _ = body.partition("!") + if marker and prefix and not body.startswith(("!", "=", "/", "@")): + # The source supplies all position values. The wire supplies only + # the literal prefix, which the finalized public schema preserves. + payload.pop("type") + result["payload"] = { + "type": "legacy_position", + "prefix": prefix, + "position": payload, + } + + +def records() -> list[JSON]: + result = [] + defaults: JSON = {} + divergences = json.loads(DIVERGENCES.read_text()) + for block in re.findall(r"```json\n(.*?)\n```", SOURCE.read_text(), re.DOTALL): + case = json.loads(block) + if "fap_field_defaults" in case: + defaults = case["fap_field_defaults"] + if "id" not in case: + continue + if case["profile"] == "compatibility-fap": + case["expected"]["fap_fields"] = { + **defaults, + **case["expected"]["fap_fields"], + } + steps = case.get("steps", [case]) + for step in steps: + row = {k: case[k] for k in ("id", "title", "profile", "source")} + if "steps" in case: + row["id"] += f".{step['step']}" + row["sequence"] = case["id"] + row["packet"] = step["packet"] + raw = row["packet"].encode("latin-1") + assert len(raw) == step["packet_length_bytes"], row["id"] + if "packet_hex" in step: + assert raw == bytes.fromhex(step["packet_hex"]) + row["outcome"] = case.get("outcome", "stateful") + row["source_expected"] = copy.deepcopy(step["expected"]) + if "options" in case: + row["options"] = case["options"] + if case.get("note"): + row["note"] = case["note"] + for key in ("scope_note", "extension_tags"): + if key in case: + row[key] = case[key] + if "steps" in case: + row["expected"] = {"type": "packet"} + row["state_expected"] = copy.deepcopy(step["expected"]) + elif row["outcome"].startswith("reject"): + row["expected"] = {"original_wire": row["packet"]} + row[ + "rejection" + ] = "Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source." + else: + used: set[str] = set() + tracked = Tracked(step["expected"], used) + row["expected"] = ( + fap_projection(tracked, row["packet"]) + if row["profile"] == "compatibility-fap" + else translate(tracked) + ) + nest_legacy_position(row["expected"], row["packet"]) + row["unmapped"] = sorted(leaf_paths(step["expected"]) - used) + if "payload" not in row["expected"]: + row[ + "unresolved" + ] = "Source has no mapped payload expectation; retain the original assertions for adapter completion." + if row["id"] in divergences["rows"]: + diverge(row, divergences) + result.append(row) + assert set(divergences["rows"]) <= {row["id"] for row in result} + return result + + +def main() -> None: + rows = records() + for family in sorted({r["id"].split("-")[0] for r in rows}): + selected = [r for r in rows if r["id"].startswith(family + "-")] + (DEST / (family.lower() + ".jsonl")).write_text( + "".join( + json.dumps(r, ensure_ascii=True, separators=(",", ":")) + "\n" + for r in selected + ) + ) + print(dict(Counter(r["id"].split("-")[0] for r in rows))) + + +if __name__ == "__main__": + main() diff --git a/packages/aprs/tests/packets/test_codec.py b/packages/aprs/tests/packets/test_codec.py index 5376c59..372b556 100644 --- a/packages/aprs/tests/packets/test_codec.py +++ b/packages/aprs/tests/packets/test_codec.py @@ -6,10 +6,12 @@ from dataclasses import replace from hamkit.aprs import ( + RF, Acknowledgment, Altitude, CodecNotImplementedError, EnvelopeError, + EnvelopePolicy, Extensions, FieldError, Header, @@ -43,7 +45,7 @@ def test_build_position(self) -> None: wire = b"N0CALL>APRS,WIDE1-1:!4903.50N/07201.75W-Test" self.assertEqual(serialize_packet(packet), wire) self.assertEqual(parse_packet(wire), packet) - validate_packet(packet, profile="rf") + validate_packet(packet, policy=RF) def test_null_position_convention(self) -> None: value = parse_payload(b"!0000.00N\\00000.00W.") @@ -93,14 +95,17 @@ def test_data_extensions_round_trip(self) -> None: self.assertEqual(serialize_packet(packet), wire) def test_original_wire_is_archival(self) -> None: + # Unusual tokens (lowercase, SSID -0) show nothing is normalized; the + # permissive policy keeps envelope rules out of this archival check. + loose = EnvelopePolicy(".*", ".*", ".*") raw = b"n0call-0>APRS,qAR,igate:>radio: ready > listening" packet = parse_packet(raw) assert isinstance(packet, Packet) self.assertEqual(packet.original_wire, raw) - self.assertEqual(serialize_packet(packet), raw) + self.assertEqual(serialize_packet(packet, policy=loose), raw) changed = replace(packet, payload=Status("Changed")) self.assertEqual(changed.original_wire, raw) - self.assertTrue(serialize_packet(changed).endswith(b":>Changed")) + self.assertTrue(serialize_packet(changed, policy=loose).endswith(b":>Changed")) def test_path_markers(self) -> None: packet = parse_packet(b"N0CALL>APRS,D1,D2*,WIDE2-1:>Ready") @@ -141,13 +146,9 @@ def test_status_round_trip(self) -> None: def test_unsupported_preserved(self) -> None: for information in ( - b"`\x1c\x7f\xff", - b";object", - b"T#001,1,2,3,4,5,00000000", - b"!4903.5 N/07201.7 W-", - b"!/5L!!<*e7>7P[", - b":BLN0 :Notice", - b":NWS-WARN :Warning{123", + b"~unknown", + b"&reserved", + b"$GPXYZ,unknown", ): with self.subTest(information=information): packet = parse_packet(b"N0CALL>APRS:" + information) @@ -163,7 +164,7 @@ def test_bad_envelopes(self) -> None: b">APRS:>x", b"N0CALL>APRS,:>x", b"N0CALL>APRS,D1**:>x", - b"N0CALL>APRS>BAD:>x", + b"N0CALL>APRS>>BAD:>x", b"N0CALL >APRS:>x", ): with self.subTest(wire=wire): diff --git a/packages/aprs/tests/packets/test_codec_regressions.py b/packages/aprs/tests/packets/test_codec_regressions.py new file mode 100644 index 0000000..cfd51bb --- /dev/null +++ b/packages/aprs/tests/packets/test_codec_regressions.py @@ -0,0 +1,659 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Composition and malformed-input regressions beyond fixture projections.""" +from __future__ import annotations + +import dataclasses +import random + +import pytest +from packets.test_corpus import rows +from packets.test_roundtrip_corpus import same_semantics, without_evidence +from receiver import Receiver + +from hamkit import aprs as a + + +def packet(raw): + value = a.parse_packet(raw) + assert isinstance(value, a.Packet) + return value + + +def test_editing_nmea_recomputes_checksum_and_ignores_lexical_evidence(): + original = packet(b"N0CALL>APRS:$GPGLL,4916.45,N,12311.12,W,225444,A*31") + n = original.payload + assert isinstance(n, a.NMEA) and isinstance(n.sentence, a.GLL) + changed = dataclasses.replace( + original, + payload=dataclasses.replace( + n, + sentence=dataclasses.replace(n.sentence, coordinates=a.Coordinates(51, -1)), + ), + ) + wire = a.serialize_packet(changed) + assert b"5100,N,00100,W" in wire and wire != original.original_wire + decoded = packet(wire).payload + assert isinstance(decoded, a.NMEA) + assert decoded.sentence.coordinates == a.Coordinates(51, -1) + assert decoded.metadata.checksum_valid is True + + +def test_dao_is_not_applied_twice_when_composing(): + original = packet(b"N0CALL>APRS:!4903.50N/07201.75W>!W12!") + clean = without_evidence(original) + for _ in range(5): + clean = packet(a.serialize_packet(clean)) + same_semantics(original, clean) + p = original.payload + changed = dataclasses.replace( + original, payload=dataclasses.replace(p, latitude_deg=p.latitude_deg + 1) + ) + assert b"5003.50N" in a.serialize_packet(changed) + + +def test_mic_e_uses_edited_semantics_and_checks_destination(): + original = packet(b"N0CALL>490S5P:`123456>/") + p = original.payload + assert isinstance(p, a.MicE) + modified = dataclasses.replace( + original, + payload=dataclasses.replace( + p, extensions=dataclasses.replace(p.extensions, motion=a.Motion(270, 42)) + ), + ) + decoded = packet(a.serialize_packet(modified)) + assert decoded.payload.extensions.motion == a.Motion(270, 42) + invalid = dataclasses.replace(modified, header=a.Header("N0CALL", "APRS")) + with pytest.raises(a.FieldError, match="destination"): + a.serialize_packet(invalid) + + +@pytest.mark.parametrize( + "response", + [ + a.DirectStations(("W1AW", "W2ABC")), + a.HeardStation("W1AW", (1, None, 3, 0, 0, 0, 0, 0)), + a.Trace(a.Header("N0CALL", "APRS", (a.Hop("WIDE1-1", True),))), + ], +) +def test_structured_query_response_roundtrip(response): + p = a.Response("W1AW", response) + assert a.parse_payload(a.serialize_payload(p)) == p + + +def test_station_weather_association_survives_interleaved_station(): + receiver = Receiver() + receiver.receive(packet(b"N0CALL>APRS:!4903.50N/07201.75W_")) + receiver.receive(packet(b"W1AW>APRS:!5100.00N/00100.00W_")) + state = receiver.receive(packet(b"N0CALL>APRS:_10151800c220s004g005t077")) + assert state["weather_latitude_deg"] == pytest.approx(49.058333333333) + assert state["weather_longitude_deg"] == pytest.approx(-72.029166666667) + + +def test_truncation_and_mutation_do_not_escape_recovery(): + rng = random.Random(4) + for raw in sorted({r["packet"].encode("latin1") for r in rows()}): + candidates = [raw[:i] for i in range(len(raw))] + for _ in range(8): + if raw: + i = rng.randrange(len(raw)) + candidates.append(raw[:i] + bytes([rng.randrange(256)]) + raw[i + 1 :]) + for candidate in candidates: + try: + result = a.parse_packet(candidate) + except (a.ContextRequiredError, a.ResourceLimitError): + continue + assert isinstance(result, (a.Packet, a.Malformed)), repr(candidate) + assert result.original_wire == candidate + + +def test_weather_metric_units_are_converted_before_compression(): + weather = a.Weather( + wind_direction=a.Measurement(180, "degrees"), + wind_speed=a.Measurement(10, "m/s"), + gust=a.Measurement(12, "m/s"), + temperature=a.Measurement(20, "celsius"), + ) + p = a.Position( + 49, + -72, + a.Symbol("/", "_"), + compression=a.Compression(fix="current", nmea_source="RMC", origin_code=0), + extensions=a.Extensions(weather=weather), + ) + decoded = a.parse_payload(a.serialize_payload(p)) + assert isinstance(decoded, a.Position) and decoded.extensions.weather is not None + w = decoded.extensions.weather + assert w.wind_speed.unit == "knots" + assert w.wind_speed.value == pytest.approx(10 * 3600 / 1852, rel=0.05) + assert w.temperature == a.Measurement(68, "fahrenheit") + + +def test_unrepresentable_annotations_and_field_overflow_are_not_dropped(): + storm = a.Storm( + "HC", + predicted=False, + sustained_wind_knots=1000, + peak_gust_knots=100, + central_pressure_hpa=990, + hurricane_radius_nm=20, + tropical_storm_radius_nm=50, + ) + p = a.Position( + 49, + -72, + a.Symbol("\\", "@"), + extensions=a.Extensions(motion=a.Motion(90, 10), storm=storm), + ) + with pytest.raises(a.ConformanceError, match="sustained_wind"): + a.serialize_payload(p) + with pytest.raises(a.FieldError, match="structured fields"): + a.serialize_payload(a.Status("IO91/- House")) + with pytest.raises(a.FieldError, match="query response"): + a.serialize_payload(a.Message("W1AW", "Directs= N0CALL")) + report = a.NMEA( + a.GLL(a.Coordinates(49, -72), "120000", "A"), + a.NMEAMetadata("GP"), + symbol=a.Symbol("/", "-"), + ) + with pytest.raises(a.FieldError, match="symbol"): + a.serialize_packet(a.Packet(a.Header("N0CALL", "APRS"), report)) + + +def test_invalid_signpost_token_and_oversized_sequence_are_malformed(): + for wire in ( + b"N0CALL>APRS:!4903.50N\\07201.75Wm{\xff}", + b"N0CALL>APRS:T#" + b"1" * 5000 + b",1,2,3,4,5,00000000", + ): + assert isinstance(a.parse_packet(wire), a.Malformed) + + +def test_mic_e_longitude_100_to_109_degrees_uses_specified_bytes(): + # APRS101 p.48 encodes 100-109 degrees as 'l'-'u'; bytes 28-37 decode to the + # same values but include FS-US control characters. + cases = [r for r in rows() if r["id"] in {f"MIC-{n}" for n in range(116, 126)}] + assert len(cases) == 10 + for row in cases: + raw = row["packet"].encode("latin-1") + wire = a.serialize_packet(without_evidence(packet(raw))) + assert wire == raw, row["id"] + assert 108 <= wire[wire.index(b":") + 2] <= 117 + + +def test_known_bad_nmea_checksum_requires_explicit_repair(): + received = packet(b"N0CALL>APRS:$GPGLL,4916.45,N,12311.12,W,225444,A*00") + n = received.payload + assert isinstance(n, a.NMEA) and n.metadata.checksum_valid is False + finding = "$.payload.metadata.checksum_valid" + assert [d.path for d in received.diagnostics] == [finding] # Reported once. + assert [d.path for d in a.check_packet(received)] == [finding] + for send in (a.serialize_packet, a.validate_packet, a.serialize_tnc2_line): + with pytest.raises(a.ConformanceError) as caught: + send(received) + assert [d.path for d in caught.value.diagnostics] == [finding] + # Explicit repair: clear the verdict, and a fresh checksum is computed. + trusted = dataclasses.replace(n.metadata, checksum_valid=None) + repaired = dataclasses.replace( + received, payload=dataclasses.replace(n, metadata=trusted) + ) + resent = packet(a.serialize_packet(repaired)).payload + assert isinstance(resent, a.NMEA) and resent.metadata.checksum_valid is True + # Or omit the checksum entirely. + unsigned = dataclasses.replace( + received, + payload=dataclasses.replace(n, metadata=a.NMEAMetadata(n.metadata.talker)), + ) + assert b"*" not in a.serialize_packet(unsigned) + + +@pytest.mark.parametrize( + "text", + [ + "Directs= are fine, see you at 7", + "Directs=", + "N0CALL HEARD: 1 2 3", + "N0CALL HEARD: 1 2 3 4 5 6 7 8 9", + ], +) +def test_text_resembling_a_response_stays_a_message(text): + raw = b"N0CALL>APRS::W1AW :" + text.encode() + value = packet(raw).payload + assert value == a.Message("W1AW", text) + assert a.serialize_packet(packet(raw)) == raw + + +def test_complete_response_grammar_is_still_structured(): + value = packet(b"N0CALL>APRS::W1AW :Directs= W1AW W2ABC").payload + assert value == a.Response("W1AW", a.DirectStations(("W1AW", "W2ABC"))) + + +def test_structured_weather_is_exempt_from_the_position_comment_budget(): + weather = ( + b"N0CALL>APRS:@092345z4903.50N/07201.75W_220/004g005t077r000p000P000h50b09900" + ) + # 44 bytes of structured weather data: an ordinary report is sendable. + assert a.check_packet(packet(weather + b"L123wRSW")) == () + # Wind occupies the 7-byte data-extension slot; the comment keeps 36 bytes. + assert a.check_packet(packet(weather + b" " + b"x" * 35)) == () + assert [d.path for d in a.check_packet(packet(weather + b" " + b"x" * 36))] == [ + "$.payload.comment" + ] + # With wind in compressed csT, all weather data is exempt. + compressed = b"N0CALL>APRS:=/5L!!<*e7_7P[g005t077r000p000P000h50b09900L123" + assert a.check_packet(packet(compressed + b" " + b"x" * 42)) == () + assert [d.path for d in a.check_packet(packet(compressed + b" " + b"x" * 43))] == [ + "$.payload.comment" + ] + # Envelope limits still count every weather byte. + tight = dataclasses.replace(a.RF, max_information_bytes=60) + findings = a.check_packet(packet(weather + b"L123wRSW"), policy=tight) + assert [d.path for d in findings] == ["$.payload"] + + +@pytest.mark.parametrize( + "raw", + [ + b"N0CALL>APRS:_10090556c220s004g005t077r000p000P000h50b09900wRSW", + b"N0CALL>APRS:!4903.50N/07201.75W_220/004g005t077r000p000P000h50b09900wRSW", + ], +) +def test_weather_codes_must_end_the_report(raw): + # APRS101 pp.63-66 end every weather report with the S/uuuu codes and define + # no comment after them, so a comment would hide the codes on read-back. + received = packet(raw) + assert a.check_packet(received) == () + payload = dataclasses.replace(received.payload, comment="home") + both = dataclasses.replace(received, payload=payload) + findings = a.check_packet(both) + assert [(d.path, d.message) for d in findings] == [ + ( + "$.payload.comment", + ( + "weather software/unit codes must end the report; " + "a comment cannot follow them" + ), + ) + ] + with pytest.raises(a.ConformanceError): + a.serialize_packet(both) + # Without codes, the comment is sent and read back unchanged. + if isinstance(payload, a.Weather): + uncoded = dataclasses.replace(payload, software_code=None, device_code=None) + else: + assert payload.extensions.weather is not None + weather = dataclasses.replace( + payload.extensions.weather, software_code=None, device_code=None + ) + uncoded = dataclasses.replace( + payload, + extensions=dataclasses.replace(payload.extensions, weather=weather), + ) + # Without codes, a comment shaped like codes would be read back as codes. + lookalike = dataclasses.replace(both, payload=uncoded) + assert [(d.path, d.message) for d in a.check_packet(lookalike)] == [ + ( + "$.payload.comment", + "comment would be read back as weather software/unit codes", + ) + ] + # Any other comment is sent and read back unchanged. + for comment in ("home station", "73!"): + plain = dataclasses.replace( + lookalike, payload=dataclasses.replace(uncoded, comment=comment) + ) + resent = packet(a.serialize_packet(plain)) + assert resent.payload.comment == comment + + +MIC_E = b"N0CALL>S32UVT:`(_f\x1e\x1eOj/" + + +@pytest.mark.parametrize( + ("status", "device", "comment", "telemetry"), + [ + (b'`"4T}Hi_%', "`_%", "Hi", None), # Yaesu FTM-400DR with altitude + (b"'Hello|3", "'|3", "Hello", None), # Byonics TinyTrack3 + (b"'1020 x", "'", "1020 x", None), # incomplete hex: a type byte + (b"`plain", "`", "plain", None), # undeclared suffix stays in the comment + (b']"3x}=', "]=", "", None), # Kenwood TM-D710 + (b">Ready^", ">^", "Ready", None), # Kenwood TH-D74 + (b"`1020", None, "", "mic_e_hex"), # APRS101 two-channel telemetry + (b"'102030FFff text", None, " text", "mic_e_hex"), + (b"'102030FFff|3", "'|3", "102030FFff", None), # a declared suffix wins + ], +) +def test_mic_e_type_codes(status, device, comment, telemetry): + # APRS 1.2 (aprs.org/aprs12/mic-e-types.txt) redefines ` and ' as type bytes; + # no type byte or suffix can make the packet Malformed. + decoded = packet(MIC_E + status) + assert decoded.payload.device_code == device + assert decoded.payload.comment == comment + t = decoded.payload.extensions.telemetry + assert (t and t.encoding) == telemetry + resent = packet(a.serialize_packet(decoded)) + assert (resent.payload.device_code, resent.payload.comment) == (device, comment) + + +def test_mic_e_type_codes_are_checked_before_sending(): + def mic_e(**fields): + motion = a.Extensions(motion=a.Motion(90, 10)) + fields.setdefault("extensions", motion) + payload = packet(MIC_E).payload + return a.Packet( + a.Header("N0CALL", "S32UVT"), dataclasses.replace(payload, **fields) + ) + + def findings(**fields): + return [(d.path, d.message) for d in a.check_packet(mic_e(**fields))] + + assert findings(device_code="`_%", comment="Hi") == [] + readback = ( + "$.payload.comment", + "would be read back as a different Mic-E type code", + ) + assert findings(device_code="`", comment="Hi_%") == [readback] + assert findings(comment="]hello") == [readback] + assert findings(comment="'1020") == [readback] + assert findings(device_code=">", comment="ok=") == [readback] + assert findings(device_code="]x") == [ + ("$.payload.device_code", "not a declared Mic-E type code") + ] + telemetry = a.Telemetry((1, 2, 3, 4, 5), encoding="mic_e_hex") + shared = a.Extensions(motion=a.Motion(90, 10), telemetry=telemetry) + assert findings(device_code="'", extensions=shared) == [ + ( + "$.payload.device_code", + "Mic-E telemetry and a type code share the first byte", + ) + ] + with pytest.raises(a.ConformanceError): + a.serialize_packet(mic_e(device_code="`", comment="Hi_%")) + + +@pytest.mark.parametrize("device", [">", "]", ">^", "]="]) +@pytest.mark.parametrize("altitude", [b"", b'"4T}']) +def test_mic_e_grid_stays_in_comment_and_roundtrips(device, altitude): + comment = b"IO91SX/G Ready" + raw = MIC_E + device[:1].encode() + altitude + comment + device[1:].encode() + decoded = without_evidence(packet(raw)) + assert decoded.payload.device_code == device + assert decoded.payload.comment == comment.decode() + assert decoded.payload.latitude_deg == pytest.approx(33.427333333333) + assert decoded.payload.longitude_deg == pytest.approx(-112.129) + assert a.check_packet(decoded) == () + assert a.serialize_packet(decoded) == raw + assert without_evidence(packet(a.serialize_packet(decoded))) == decoded + + +def test_mic_e_grid_vector_preserves_all_captured_text(): + row = next(row for row in rows() if row["id"] == "MIC-265") + source = row["source_expected"] + original = packet(row["packet"].encode("latin1")) + assert original.payload.device_code == source["mic_e"]["type_marker"] + assert original.payload.comment == ( + source["grid_locator"] + + source["grid_symbol"]["table_id_raw"] + + source["grid_symbol"]["code"] + + source["comment"] + ) + assert row["expected"]["payload"]["device_code"] == original.payload.device_code + assert row["expected"]["payload"]["comment"] == original.payload.comment + assert a.serialize_packet(without_evidence(original)) == row["packet"].encode( + "latin1" + ) + + +def test_mic_e_device_code_cannot_contain_a_grid(): + original = packet(MIC_E + b">IO91SX/G Ready") + invalid = dataclasses.replace( + original, + payload=dataclasses.replace( + original.payload, device_code=">IO91SX/G", comment=" Ready" + ), + ) + assert [d.path for d in a.check_packet(invalid)] == ["$.payload.device_code"] + with pytest.raises(a.ConformanceError): + a.serialize_packet(invalid) + + +def test_embedded_position_search_is_opt_in(): + # APRS101 p.18 (X1J) allowed a "!" position in the first 40 bytes of other + # text; the APRS 1.1 addendum deprecates the search. + raw = b"N0CALL>BEACON:X!4903.50N/07201.75W-" + assert packet(raw).payload == a.Beacon("X!4903.50N/07201.75W-") + legacy = a.parse_packet(raw, legacy_positions=True) + assert isinstance(legacy.payload, a.LegacyPosition) + assert legacy.payload.prefix == b"X" + framed = a.parse_tnc2_line(raw + b"\r\n", legacy_positions=True) + assert framed.payload == legacy.payload + payload = a.parse_payload(raw.partition(b":")[2], legacy_positions=True) + assert payload == legacy.payload + beyond = b"N0CALL>BEACON:" + b"X" * 40 + b"!4903.50N/07201.75W-" + assert isinstance(a.parse_packet(beyond, legacy_positions=True).payload, a.Beacon) + with pytest.raises(TypeError): + a.parse_packet(raw, legacy_positions="yes") + + +WX = b"N0CALL>APRS:_12032359c000s000g000t033" + + +@pytest.mark.parametrize( + ("tail", "field", "value", "unit"), + [ + (b"X123", "radiation", 12000, "nSv/h"), # 12 x 10^3 nanosieverts/hour + (b"X100", "radiation", 10, "nSv/h"), + (b"X...", "radiation", None, "nSv/h"), + (b"V128", "battery_voltage", 12.8, "volts"), + (b"V...", "battery_voltage", None, "volts"), + (b"F0123", "water_height", 12.3, "feet"), # APRS 1.2: tenths of a foot + (b"F-042", "water_height", -4.2, "feet"), + (b"F....", "water_height", None, "feet"), + (b"F20.1", "water_height", 20.1, "feet"), # APRS 1.1: decimal feet + (b"f-1.2", "water_height", -1.2, "meters"), + ], +) +def test_aprs_1_2_weather_fields(tail, field, value, unit): + # aprs.org/aprs12/weather-new.txt; X and V are no longer read as codes. + decoded = packet(WX + tail) + reading = getattr(decoded.payload, field) + if field == "water_height": + reading = reading.measurement + assert (reading.value, reading.unit) == (value, unit) + assert decoded.payload.software_code is None + assert decoded.diagnostics == () + assert packet(a.serialize_packet(without_evidence(decoded))) == without_evidence( + decoded + ) + + +def test_weather_codes_still_follow_new_fields(): + decoded = packet(WX + b"X123V128XRSW") + w = decoded.payload + assert (w.radiation.value, w.battery_voltage.value) == (12000, 12.8) + assert (w.software_code, w.device_code) == ("X", "RSW") + + +@pytest.mark.parametrize( + "prefix", [WX, b"N0CALL>APRS:!4903.50N/07201.75W_220/004g005t077"] +) +@pytest.mark.parametrize("tag", [b"F", b"f"]) +@pytest.mark.parametrize( + "number", + [ + b"0.0", + b"999.0", + b"1000.0", + b"10000.0", + b"-100.0", + b"-1000.0", + b"0.0000001", + b"1234.56789", + b"1000000.0", + ], +) +def test_water_height_encoding_preserves_decimal_measurements(prefix, tag, number): + original = without_evidence(packet(prefix + tag + number)) + assert a.check_packet(original) == () + wire = a.serialize_packet(original) + assert wire == prefix + tag + number + decoded = without_evidence(packet(wire)) + assert decoded == original + assert a.serialize_packet(decoded) == wire + + +def test_new_weather_fields_are_checked_before_sending(): + w = packet(WX).payload + odd = dataclasses.replace(w, radiation=a.Measurement(123, "nSv/h")) + with pytest.raises(a.ConformanceError): + a.serialize_packet(a.Packet(a.Header("N0CALL", "APRS"), odd)) + hidden = dataclasses.replace(w, comment="X123 hot") + assert [ + d.message for d in a.check_packet(a.Packet(a.Header("N0CALL", "APRS"), hidden)) + ] == ["comment would be read back as weather fields"] + + +@pytest.mark.parametrize( + ("information", "analog", "digital"), + [ + (b"T#001,42", (42.0,), ()), + (b"T#1,1,,3,,5", (1.0, None, 3.0, None, 5.0), ()), + (b"T#005,001,002,003,004,00000000", (1.0, 2.0, 3.0, 4.0), (False,) * 8), + ], +) +def test_short_telemetry_is_a_nonconforming_packet(information, analog, digital): + decoded = packet(b"N0CALL>APRS:" + information) + assert (decoded.payload.analog, decoded.payload.digital) == (analog, digital) + assert any(d.code == "nonconforming" for d in decoded.diagnostics) + with pytest.raises(a.ConformanceError): + a.serialize_packet(decoded) + + +@pytest.mark.parametrize("value", [b"f", b"-", b"-1.", b"inf", b"nan", b"1e5"]) +def test_telemetry_channels_are_plain_decimals(value): + raw = b"N0CALL>APRS:T#001,1," + value + b",3,4,5,00000000" + assert isinstance(a.parse_packet(raw), a.Malformed) + + +def test_invalid_object_timestamp_keeps_recovered_fields(): + result = a.parse_packet(b"N0CALL>APRS:;TestObj *000000z4903.50N/07201.75W-Test") + assert isinstance(result, a.Malformed) + recovered = result.recovered["payload"] + assert recovered["type"] == "object" + assert (recovered["name"], recovered["alive"], recovered["comment"]) == ( + "TestObj", + True, + "Test", + ) + assert recovered["latitude_deg"] == pytest.approx(49.058333333) + + +@pytest.mark.parametrize("digit", "0123456789") +def test_compressed_numeric_overlay_is_refused_before_sending(digit): + p = a.Packet( + a.Header("N0CALL", "APRS"), + a.Position( + 49, -72, a.Symbol(digit, ">"), compression=a.Compression(ignored=True) + ), + ) + assert [d.path for d in a.check_packet(p)] == ["$.payload.symbol.table_id"] + for send, value in ( + (a.serialize_packet, p), + (a.validate_packet, p), + (a.serialize_payload, p.payload), + ): + with pytest.raises(a.ConformanceError, match="compressed numeric overlays"): + send(value) + # Explicit compressed overlays retain their wire spelling and round-trip. + compressed = dataclasses.replace( + p.payload, symbol=a.Symbol(chr(ord("a") + int(digit)), ">") + ) + assert a.parse_payload(a.serialize_payload(compressed)) == compressed + uncompressed = dataclasses.replace(p.payload, compression=None) + assert a.parse_payload(a.serialize_payload(uncompressed)) == uncompressed + + +@pytest.mark.parametrize("encoding", ["mic_e_hex", "mic_e_binary"]) +@pytest.mark.parametrize( + "channels", + [(999, 2, 3, 4, 5), (-1, 2, 3, 4, 5), (1.5, 2, 3, 4, 5), (1, None, 3, 4, 5)], +) +def test_invalid_mic_e_channels_produce_findings(encoding, channels): + original = packet(MIC_E) + payload = dataclasses.replace( + original.payload, + extensions=dataclasses.replace( + original.payload.extensions, + telemetry=a.Telemetry(channels, encoding=encoding), + ), + ) + p = dataclasses.replace(original, payload=payload) + index = 1 if channels[1] is None else 0 + findings = a.check_packet(p) + assert [d.path for d in findings] == [ + f"$.payload.extensions.telemetry.analog[{index}]" + ] + for send in (a.serialize_packet, a.validate_packet, a.serialize_tnc2_line): + with pytest.raises(a.ConformanceError) as caught: + send(p) + assert caught.value.diagnostics == findings + assert a.from_json(a.to_json(p)) == p + + +@pytest.mark.parametrize( + "tail,paths", + [ + (b"c090s010", ["gust", "temperature"]), + (b"c090s010g020t077s001", ["snow_24h"]), + ], +) +def test_standalone_weather_has_packet_report_checks(tail, paths): + p = packet(b"N0CALL>APRS:_10171200" + tail) + assert [d.path for d in a.check_packet(p)] == [ + "$.payload." + name for name in paths + ] + with pytest.raises(a.ConformanceError) as caught: + a.serialize_payload(p.payload) + assert [d.path for d in caught.value.diagnostics] == ["$." + name for name in paths] + with pytest.raises(a.ConformanceError): + a.serialize_packet(p) + complete = a.parse_payload(b"_10171200c...s...g...t...") + assert a.parse_payload(a.serialize_payload(complete)) == complete + + +@pytest.mark.parametrize("destination", ["APRS", "T32UVT", "S32U5T", "S32UV4"]) +@pytest.mark.parametrize("nested", [False, True]) +def test_mic_e_header_conflicts_are_checked_without_envelope_limits( + destination, nested +): + p = dataclasses.replace(packet(MIC_E), header=a.Header("N0CALL", destination)) + if nested: + p = a.Packet(a.Header("N0GATE", "APRS"), a.ThirdParty(p)) + prefix = "$.payload.packet" if nested else "$" + for policy in (a.APRS_IS, a.EnvelopePolicy(".*", ".*", ".*")): + findings = a.check_packet(p, policy=policy) + assert [d.path for d in findings] == [prefix + ".header.destination"] + for send in (a.serialize_packet, a.validate_packet): + with pytest.raises(a.ConformanceError) as caught: + send(p, policy=policy) + assert caught.value.diagnostics == findings + + +def test_nmea_symbol_requires_matching_header_context(): + p = packet(b"N0CALL-11>APRS:$GPGLL,4916.45,N,12311.12,W,225444,A") + assert p.payload.symbol == a.Symbol("/", "O") + assert a.check_packet(p) == () + assert packet(a.serialize_packet(p)).payload == p.payload + with pytest.raises(a.ContextRequiredError, match="NMEA symbol"): + a.serialize_payload(p.payload) + changed = dataclasses.replace(p, header=a.Header("N0CALL-9", "APRS")) + for policy in (a.APRS_IS, a.EnvelopePolicy(".*", ".*", ".*")): + findings = a.check_packet(changed, policy=policy) + assert [d.path for d in findings] == ["$.payload.symbol"] + with pytest.raises(a.ConformanceError) as caught: + a.serialize_packet(changed, policy=policy) + assert caught.value.diagnostics == findings + # Decoding with the new header is still permissive and derives its symbol. + assert packet( + a.serialize_packet(p).replace(b"N0CALL-11", b"N0CALL-9") + ).payload.symbol == a.Symbol("/", ">") diff --git a/packages/aprs/tests/packets/test_corpus.py b/packages/aprs/tests/packets/test_corpus.py new file mode 100644 index 0000000..c96f21e --- /dev/null +++ b/packages/aprs/tests/packets/test_corpus.py @@ -0,0 +1,129 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Every JSONL row is independently collected, without expected-failure escapes.""" + +from __future__ import annotations + +import json +import math +from pathlib import Path +from typing import Any + +import pytest + +from hamkit import aprs + +DIRECTORY = Path(__file__).parents[1] / "vectors" + + +def differences(actual: Any, expected: Any, path: str = "$") -> list[str]: + if isinstance(expected, dict): + if not isinstance(actual, dict): + return [f"{path}: expected object, got {actual!r}"] + return [ + error + for key, value in expected.items() + for error in ( + [f"{path}.{key}: missing"] + if key not in actual + else differences(actual[key], value, f"{path}.{key}") + ) + ] + if isinstance(expected, list): + if not isinstance(actual, list) or len(actual) != len(expected): + return [f"{path}: expected {expected!r}, got {actual!r}"] + return [ + error + for i, value in enumerate(expected) + for error in differences(actual[i], value, f"{path}[{i}]") + ] + if isinstance(expected, float) and isinstance(actual, (float, int)): + tolerance = 1e-8 if path.endswith(("latitude_deg", "longitude_deg")) else 1e-6 + if math.isclose(actual, expected, rel_tol=1e-9, abs_tol=tolerance): + return [] + if type(actual) is not type(expected) and isinstance(actual, bool) != isinstance( + expected, bool + ): + return [f"{path}: expected {expected!r}, got {actual!r}"] + return ( + [] if actual == expected else [f"{path}: expected {expected!r}, got {actual!r}"] + ) + + +# Receivers in these profiles search other text for an embedded "!" position. +LEGACY_POSITION_PROFILES = {"historical-1.0", "compatibility-fap"} + + +def parse_row(row: dict[str, Any], raw: bytes) -> aprs.Packet | aprs.Malformed: + options = row.get("options") or {} + strict = row["profile"] == "strict-envelope" or options.get("ax25") + return aprs.parse_packet( + raw, + policy=aprs.RF if strict else aprs.APRS_IS, + legacy_positions=row["profile"] in LEGACY_POSITION_PROFILES, + ) + + +def rows(): + return [ + json.loads(line) + for file in sorted(DIRECTORY.glob("*.jsonl")) + for line in file.read_text().splitlines() + ] + + +def load() -> list[Any]: + return [pytest.param(row, id=row["id"]) for row in rows()] + + +def public_phg_row(row: dict[str, Any]) -> bool: + """PHG/PHGR expectations must be met by the public API without rewrites.""" + payload = row.get("expected", {}).get("payload", {}) + if payload.get("type") == "legacy_position": + payload = payload["position"] + return bool(payload.get("extensions", {}).get("phg")) + + +def check(row: dict[str, Any]) -> None: + raw = row["packet"].encode("latin-1") + packet = parse_row(row, raw) + actual = aprs.to_json_dict(packet, include_defaults=True) + rejected = isinstance(packet, aprs.Malformed) or any( + d.code == "nonconforming" for d in packet.diagnostics + ) + assert actual["original_wire"] == row["packet"], "original bytes changed" + assert not row.get("gap") and not row.get("unresolved") + errors = differences(actual, row["expected"]) + if row.get("rejection") and not rejected: + errors.append("$: expected malformed/nonconforming input") + if row.get("rejection"): + from source_details import check_rejection + + errors.extend(check_rejection(row)) + # FAP's own extra fields (resolution, raw timestamp, warnings and so on) + # describe that library's output, not this schema, so they stay provenance. + if row.get("unmapped"): + from source_details import check_core, check_public_phg + + if row["profile"] != "compatibility-fap": + errors.extend(check_core(row)) + elif public_phg_row(row): + errors.extend(check_public_phg(row, packet)) + if row.get("sequence"): + from receiver import Receiver + + receiver = Receiver() + for step in rows(): + if step.get("sequence") == row["sequence"]: + state = receiver.receive( + aprs.parse_packet(step["packet"].encode("latin1")) + ) + if step["id"] == row["id"]: + errors.extend(differences(state, row["state_expected"])) + break + assert not errors, "\n".join(errors) + + +@pytest.mark.parametrize("row", load()) +def test_documented_vector(row: dict[str, Any]) -> None: + check(row) diff --git a/packages/aprs/tests/packets/test_envelope_policy.py b/packages/aprs/tests/packets/test_envelope_policy.py new file mode 100644 index 0000000..d7fbbb5 --- /dev/null +++ b/packages/aprs/tests/packets/test_envelope_policy.py @@ -0,0 +1,266 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Public policy behavior across decoding, validation and both wire formats.""" + +import json +from dataclasses import FrozenInstanceError, asdict, replace +from typing import Any, cast + +import pytest + +from hamkit import aprs as a + + +def parse(raw: bytes, policy: a.EnvelopePolicy) -> a.Packet: + packet = a.parse_packet(raw, policy=policy) + assert isinstance(packet, a.Packet) + assert packet.original_wire == raw + return packet + + +def assert_conformance( + raw: bytes, policy: a.EnvelopePolicy, paths: set[str] +) -> a.Packet: + packet = parse(raw, policy) + assert {d.path for d in packet.diagnostics} == paths + assert all(d.code == "nonconforming" for d in packet.diagnostics) + findings = a.check_packet(packet, policy=policy) + assert {d.path for d in findings} == paths + for operation in (a.serialize_packet, a.serialize_tnc2_line, a.validate_packet): + if paths: + with pytest.raises(a.ConformanceError) as caught: + operation(packet, policy=policy) + assert caught.value.diagnostics == findings + else: + result = operation(packet, policy=policy) + if operation is a.serialize_packet: + assert result == raw + elif operation is a.serialize_tnc2_line: + assert result == raw + b"\r\n" + else: + assert result is None + for terminator in (b"\n", b"\r\n"): + framed = a.parse_tnc2_line(raw + terminator, policy=policy) + assert isinstance(framed, a.Packet) + assert framed.original_wire == raw + assert framed.diagnostics == packet.diagnostics + return packet + + +@pytest.mark.parametrize( + "address,rf_ok,internet_ok", + [ + ("N0CALL", True, True), + ("n0call", False, True), + ("N0CALL-0", True, False), # APRS-IS drops SSID -0. + ("N0CALL-15", True, True), + ("N0CALL-16", False, True), + ("N0CALL-JS", False, True), + ("N0CALL-123", False, False), + ("ABCDEFGHI", False, True), + ("ABCDEFGHIJ", False, False), + ("ABCDEFG-A", False, True), + ("ABCDEFG-AB", False, False), + ("N0!CALL", False, False), + ("N0_CALL", False, False), + ("N0CALL-", False, False), + ("N0CALL-A-B", False, False), + ("A", True, False), + ("AB", True, False), + ("AB-12", True, False), + ], +) +def test_source_formats(address: str, rf_ok: bool, internet_ok: bool) -> None: + raw = address.encode() + b">APRS:>Ready" + for policy, valid in ((a.RF, rf_ok), (a.APRS_IS, internet_ok)): + assert_conformance(raw, policy, set() if valid else {"$.header.source"}) + + +def test_internet_rejects_ssid_zero_everywhere() -> None: + # aprs-is.net: "SSID -0 is dropped as conflicts with not present SSID". + for raw, path in ( + (b"N0CALL>APRS-0:>Ready", "$.header.destination"), + (b"N0CALL>APRS,WIDE1-0:>Ready", "$.header.path[0].address"), + ): + assert_conformance(raw, a.APRS_IS, {path}) + assert_conformance(raw, a.RF, set()) + + +@pytest.mark.parametrize("address", ["A", "AB", "A-1", "qAR", "AE5PL-JS"]) +def test_internet_destination_and_path_allow_short_addresses(address: str) -> None: + assert_conformance(f"N0CALL>{address},{address}*:>Ready".encode(), a.APRS_IS, set()) + + +def test_path_entries_preserve_q_and_repeated_marker() -> None: + raw = b"N0CALL>APRS,WIDE1-1,W1AW*,qAR,AE5PL-JS:>Ready" + internet = assert_conformance(raw, a.APRS_IS, set()) + rf = assert_conformance( + raw, a.RF, {"$.header.path[2].address", "$.header.path[3].address"} + ) + assert internet.header == rf.header + assert internet.payload == rf.payload + assert internet.header.path == ( + a.Hop("WIDE1-1"), + a.Hop("W1AW", True), + a.Hop("qAR"), + a.Hop("AE5PL-JS"), + ) + + +def test_custom_patterns_are_independent_and_use_fullmatch() -> None: + policy = a.EnvelopePolicy("src_[0-9]+", "dst_[A-Z]+", "via_[a-z]+") + assert_conformance(b"src_12>dst_AB,via_home*:>Ready", policy, set()) + assert_conformance( + b"xsrc_12>dst_ABx,via_home1*:>Ready", + policy, + {"$.header.source", "$.header.destination", "$.header.path[0].address"}, + ) + + +def test_path_entry_limit_is_optional_and_counts_entries_not_hops() -> None: + eight = b"N0CALL>APRS" + b",WIDE2-2" * 8 + b":>Ready" + nine = b"N0CALL>APRS" + b",WIDE2-2" * 9 + b":>Ready" + assert_conformance(eight, a.RF, set()) + assert_conformance(nine, a.RF, {"$.header.path"}) + assert_conformance(nine, replace(a.RF, max_path_entries=None), set()) + # More than eight entries are also valid under the default internet policy. + assert_conformance(nine, a.APRS_IS, set()) + no_path = replace(a.APRS_IS, max_path_entries=0) + assert_conformance(b"N0CALL>APRS:>Ready", no_path, set()) + assert_conformance(b"N0CALL>APRS,WIDE2-2:>Ready", no_path, {"$.header.path"}) + + +@pytest.mark.parametrize("length", [255, 256, 257]) +def test_rf_information_boundary(length: int) -> None: + raw = b"N0CALL>APRS:~" + b"x" * (length - 1) + paths = {"$.payload"} if length > 256 else set() + assert_conformance(raw, a.RF, paths) + assert_conformance(raw, a.APRS_IS, set()) + assert_conformance(raw, replace(a.RF, max_information_bytes=None), set()) + + +@pytest.mark.parametrize("length", [511, 512, 513]) +def test_internet_line_boundary_includes_header_and_crlf(length: int) -> None: + prefix = b"N0CALL>APRS,TCPIP*,qAC,AE5PL-JS:~" + raw = prefix + b"x" * (length - len(prefix) - 2) + assert_conformance(raw, a.APRS_IS, {"$"} if length > 512 else set()) + assert_conformance(raw, replace(a.APRS_IS, max_tnc2_line_bytes=None), set()) + + +def test_sizes_count_encoded_bytes_and_recompute_after_edits() -> None: + raw = "N0CALL>APRS:>é".encode() + policy = replace(a.RF, max_information_bytes=2, max_tnc2_line_bytes=len(raw) + 1) + packet = assert_conformance(raw, policy, {"$.payload", "$"}) + # Stored diagnostics and original_wire do not control serialization. + changed = replace(packet, payload=a.Status("e")) + assert changed.diagnostics + assert a.check_packet(changed, policy=policy) == () + assert a.serialize_packet(changed, policy=policy) == b"N0CALL>APRS:>e" + cleared = replace(packet, diagnostics=()) + with pytest.raises(a.ConformanceError): + a.serialize_packet(cleared, policy=policy) + + +def test_parse_measures_received_bytes_check_measures_encoded_bytes() -> None: + raw = b"N0CALL>APRS:>\xe9" + policy = replace(a.RF, max_information_bytes=2) + packet = parse(raw, policy) + assert [d.path for d in packet.diagnostics] == ["$.payload.text"] + # Latin-1 fallback becomes two UTF-8 bytes plus the status identifier. + assert {d.path for d in a.check_packet(packet, policy=policy)} == {"$.payload"} + + +def test_zero_size_limits_are_limits_not_unlimited() -> None: + policy = replace(a.RF, max_information_bytes=0, max_tnc2_line_bytes=0) + assert_conformance(b"N0CALL>APRS:>Ready", policy, {"$.payload", "$"}) + + +def test_envelope_limits_do_not_replace_payload_rules() -> None: + unlimited = a.EnvelopePolicy(".*", ".*", ".*") + assert_conformance(b"N0CALL>APRS:>" + b"x" * 63, unlimited, {"$.payload.text"}) + assert isinstance( + a.parse_packet(b"N0 CALL>APRS:>Ready", policy=unlimited), a.Malformed + ) + + +@pytest.mark.parametrize("policy", [a.RF, a.APRS_IS]) +def test_third_party_envelope_policy_applies_only_to_outer_packet( + policy: a.EnvelopePolicy, +) -> None: + # Inner identifiers are text, not outer AX.25 or APRS-IS addresses. + inner = b"n0call-JS>APRS,TCPIP,W1AW*:>Ready" + raw = b"W1AW>APRS,WIDE1-1:}" + inner + packet = assert_conformance(raw, policy, set()) + assert isinstance(packet.payload, a.ThirdParty) + assert packet.payload.packet.diagnostics == () + nested = b"W1AW>APRS:}" + raw + assert_conformance(nested, policy, set()) + # A custom outer pattern must not silently become an inner pattern either. + custom = replace(policy, source_pattern="W1AW", max_path_entries=1) + assert_conformance(raw, custom, set()) + assert_conformance( + raw, replace(custom, max_information_bytes=len(inner)), {"$.payload"} + ) + + +def test_third_party_payload_diagnostics_keep_nested_paths() -> None: + raw = b"W1AW>APRS:}n0call-JS>APRS,TCPIP,W1AW*:>bad|text" + packet = assert_conformance(raw, a.RF, {"$.payload.packet.payload.text"}) + assert isinstance(packet.payload, a.ThirdParty) + assert {d.path for d in packet.payload.packet.diagnostics} == {"$.payload.text"} + + +def test_aprs_is_is_the_default_everywhere() -> None: + raw = b"N0!CALL>APRS:~" + b"x" * 510 + packet = a.parse_packet(raw) + assert isinstance(packet, a.Packet) + assert {d.path for d in packet.diagnostics} == {"$.header.source", "$"} + assert a.parse_tnc2_line(raw + b"\r\n").diagnostics == packet.diagnostics + assert a.check_packet(packet) == a.check_packet(packet, policy=a.APRS_IS) + for operation in (a.serialize_packet, a.serialize_tnc2_line, a.validate_packet): + with pytest.raises(a.ConformanceError): + operation(packet) + + +@pytest.mark.parametrize( + "field", ["source_pattern", "destination_pattern", "path_address_pattern"] +) +def test_invalid_patterns_fail_when_policy_is_constructed(field: str) -> None: + with pytest.raises(ValueError, match=field): + replace(a.RF, **cast(Any, {field: "["})) + with pytest.raises(TypeError, match=field): + replace(a.RF, **cast(Any, {field: b".*"})) + + +@pytest.mark.parametrize( + "field", ["max_path_entries", "max_information_bytes", "max_tnc2_line_bytes"] +) +def test_invalid_limits_fail_when_policy_is_constructed(field: str) -> None: + with pytest.raises(ValueError, match=field): + replace(a.RF, **cast(Any, {field: -1})) + for value in (True, 1.5, "8"): + with pytest.raises(TypeError, match=field): + replace(a.RF, **cast(Any, {field: value})) + + +def test_policies_are_immutable_data() -> None: + with pytest.raises(FrozenInstanceError): + cast(Any, a.RF).max_path_entries = 9 + assert a.EnvelopePolicy(**json.loads(json.dumps(asdict(a.APRS_IS)))) == a.APRS_IS + assert replace(a.RF, max_path_entries=None).max_path_entries is None + assert a.RF.max_path_entries == 8 + + +@pytest.mark.parametrize("bad", [None, "rf", "monitor", "aprs_is", {}, 42]) +def test_entry_points_require_policy_objects(bad: Any) -> None: + packet = a.Packet(a.Header("N0CALL", "APRS"), a.Status("Ready")) + for operation, argument in ( + (a.parse_packet, b"N0CALL>APRS:>Ready"), + (a.parse_tnc2_line, b"N0CALL>APRS:>Ready\r\n"), + (a.serialize_packet, packet), + (a.serialize_tnc2_line, packet), + (a.check_packet, packet), + (a.validate_packet, packet), + ): + with pytest.raises(TypeError, match="policy must be an EnvelopePolicy"): + operation(cast(Any, argument), policy=bad) diff --git a/packages/aprs/tests/packets/test_phg.py b/packages/aprs/tests/packets/test_phg.py new file mode 100644 index 0000000..01b7be4 --- /dev/null +++ b/packages/aprs/tests/packets/test_phg.py @@ -0,0 +1,181 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""PHG and PHGR use the public codec, including their comment boundaries.""" + +from dataclasses import replace + +import pytest +from packets.test_corpus import check, public_phg_row, rows +from packets.test_roundtrip_corpus import without_evidence + +from hamkit import aprs as a + +PREFIX = b"!4903.50N/07201.75W#" +PHG_ROWS = [row for row in rows() if public_phg_row(row)] + + +@pytest.mark.parametrize("row", PHG_ROWS, ids=lambda row: row["id"]) +def test_phg_vectors(row): + check(row) + + +def test_related_phg_vectors_are_covered(): + assert {row["id"] for row in PHG_ROWS if row["id"].startswith("FAP-")} == { + "FAP-001", + "FAP-006", + "FAP-028", + "FAP-405", + "FAP-415", + "FAP-458", + "FAP-459", + "FAP-460", + "FAP-461", + "FAP-464", + "FAP-466", + "FAP-467", + "FAP-468", + "FAP-499", + "FAP-501", + } + + +@pytest.mark.parametrize("rate", range(36)) +def test_phgr_rate_alphabet_and_required_separator(rate): + code = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[rate : rate + 1] + wire = PREFIX + b"PHG2130" + code + b"/Radio" + value = a.parse_payload(wire) + assert isinstance(value, a.Position) + assert value.extensions.phg.rate_per_hour == rate + assert value.comment == "Radio" + assert a.serialize_payload(without_evidence(value)) == wire + + +@pytest.mark.parametrize( + "comment", [b"6", b"6Radio", b"A", b"ZRadio", b"146.520MHz", b"a/hello"] +) +def test_rate_without_required_slash_is_comment(comment): + value = a.parse_payload(PREFIX + b"PHG2130" + comment) + assert isinstance(value, a.Position) + assert value.extensions.phg.rate_per_hour is None + assert value.comment == comment.decode() + canonical = a.serialize_payload(without_evidence(value)) + assert canonical == PREFIX + b"PHG2130" + comment + assert a.parse_payload(canonical) == value + + +@pytest.mark.parametrize("rate", [None, 6, 35]) +@pytest.mark.parametrize( + "comment", + [ + "", + "/hello", + "//hello", + "6/hello", + "Z/hello", + "hello/world", + "A=001234", + "A=-00123", + ], +) +def test_composed_comments_preserve_slashes(rate, comment): + value = a.Position( + 1, + 2, + a.Symbol("/", "#"), + comment=comment, + extensions=a.Extensions(phg=a.PHG(4, 20, 3, rate_per_hour=rate)), + ) + wire = a.serialize_payload(value) + assert a.parse_payload(wire) == value + + +@pytest.mark.parametrize( + "tail,rate,comment", + [ + (b"PHG2130/hello", None, "hello"), + (b"PHG2130//hello", None, "/hello"), + (b"PHG21306//hello", 6, "/hello"), + (b"PHG2130 hello \t ", None, "hello"), + (b"PHG21306/ hello ", 6, "hello"), + (b"PHG2130 /hello", None, "/hello"), + ], +) +def test_phg_comment_delimiters(tail, rate, comment): + raw = b"N0CALL>APRS:" + PREFIX + tail + packet = a.parse_packet(raw) + assert isinstance(packet, a.Packet) + assert packet.original_wire == raw + assert packet.payload.extensions.phg.rate_per_hour == rate + assert packet.payload.comment == comment + assert a.parse_packet(a.serialize_packet(without_evidence(packet))) == packet + + +@pytest.mark.parametrize("rate", [None, 6, 35]) +def test_phg_rate_precedes_altitude_dao_and_telemetry(rate): + value = a.Position( + 1, + 2, + a.Symbol("/", "#"), + comment="Radio", + extensions=a.Extensions( + phg=a.PHG(4, 20, 3, rate_per_hour=rate), + altitude=a.Altitude(a.Measurement(1234, "feet"), "feet_extension"), + dao=a.DAO( + "W", latitude_precision=0, longitude_precision=0, encoding="decimal" + ), + telemetry=a.Telemetry((1, 2), sequence=3, encoding="base91_comment"), + ), + ) + wire = a.serialize_payload(value) + rate_code = ( + b"" + if rate is None + else b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[rate : rate + 1] + ) + separator = b"" if rate is None else b"/" + assert b"PHG2130" + rate_code + separator + b"/A=001234" in wire + assert a.parse_payload(wire) == value + + +def test_phg_does_not_consume_altitude_as_comment_delimiter(): + value = a.parse_payload(PREFIX + b"PHG2130/A=001234Radio") + assert isinstance(value, a.Position) + assert value.extensions.phg.rate_per_hour is None + assert value.extensions.altitude.measurement.value == 1234 + assert value.comment == "Radio" + assert a.parse_payload(a.serialize_payload(without_evidence(value))) == value + + +@pytest.mark.parametrize( + "payload,field,expected", + [ + (b":DEST :/Meet at A/B", "text", "/Meet at A/B"), + (b":DEST :PHG21306/hello", "text", "PHG21306/hello"), + (b">/hello", "text", "/hello"), + (PREFIX + b"/hello", "comment", "/hello"), + (PREFIX + b" /hello ", "comment", " /hello "), + (PREFIX + b"088/036/hello", "comment", "/hello"), + ], +) +def test_other_text_does_not_lose_slashes(payload, field, expected): + value = a.parse_payload(payload) + assert getattr(value, field) == expected + assert a.parse_payload(a.serialize_payload(without_evidence(value))) == value + + +@pytest.mark.parametrize("rate", [36, 100]) +def test_unencodable_rate_is_reported_without_changing_public_model(rate): + value = a.Position( + 1, + 2, + a.Symbol("/", "#"), + extensions=a.Extensions(phg=a.PHG(4, 20, 3, rate_per_hour=rate)), + ) + with pytest.raises(a.ConformanceError, match="rate_per_hour"): + a.serialize_payload(value) + + +def test_phg_comment_normalization_is_not_silent_on_transmit(): + value = a.parse_payload(PREFIX + b"PHG2130/Radio") + with pytest.raises(a.ConformanceError, match="comment"): + a.serialize_payload(replace(value, comment=" Radio ")) diff --git a/packages/aprs/tests/packets/test_policies.py b/packages/aprs/tests/packets/test_policies.py index 37dcd1b..d6bb6bb 100644 --- a/packages/aprs/tests/packets/test_policies.py +++ b/packages/aprs/tests/packets/test_policies.py @@ -8,32 +8,25 @@ class PolicyTests(unittest.TestCase): - def test_unimplemented_families_have_explicit_failure(self) -> None: - for information in ( - b"!/5L!!<*e7>7P[", - b";OBJECT *", - b")ITEM!", - b"_10171230", - b"T#001,1,2,3,4,5,00000000", - b":BLN0 :Notice", - b":N0CALL :PARM.Temp", - b"?APRS?", - b" None: + for information, cls in ( + (b"!/5L!!<*e7>7P[", a.Position), + (b"T#001,1,2,3,4,5,00000000", a.Telemetry), + (b":BLN0 :Notice", a.Bulletin), + (b":N0CALL :PARM.Temp", a.TelemetryDefinition), + (b"?APRS?", a.Query), + (b" None: raw = b"N0CALL>APRS:!9000.01N/07201.75W-" @@ -59,7 +52,7 @@ def test_every_byte_in_user_data_survives(self) -> None: a.Packet( a.Header("N0CALL", "APRS"), a.UserDefined(b"Q", b"1", b"x" * 300) ), - profile="rf", + policy=a.RF, ) def test_line_framing_is_explicit(self) -> None: @@ -99,11 +92,11 @@ def test_third_party_boundary_and_inner_context(self) -> None: a.parse_packet(wire, max_third_party_depth=1) with self.assertRaises(a.ResourceLimitError): a.parse_payload(b"}W1AW>APRS:>Ready", max_third_party_depth=0) - parsed = a.parse_packet(b"N0CALL>APRS:}W1AW>490S5P:`12345678") + parsed = a.parse_packet(b"N0CALL>APRS:}W1AW>490S5P:`123456>/") assert isinstance(parsed, a.Packet) assert isinstance(parsed.payload, a.ThirdParty) self.assertEqual(parsed.payload.packet.header.destination, "490S5P") - self.assertIsInstance(parsed.payload.packet.payload, a.Opaque) + self.assertIsInstance(parsed.payload.packet.payload, a.MicE) def test_third_party_findings_carry_their_path(self) -> None: parsed = a.parse_packet(b"N0CALL>APRS:}W1AW>APRS:>Caf\xe9|") @@ -135,19 +128,13 @@ def test_status_non_utc_timestamp_looking_text(self) -> None: self.assertEqual(a.parse_payload(b">" + text.encode()), a.Status(text)) self.assertEqual(a.serialize_payload(a.Status(text)), b">" + text.encode()) - def test_new_fields_never_imply_working_codecs(self) -> None: + def test_mdhm_and_dao_codecs(self) -> None: from hamkit.aprs._fields import decode_timestamp, encode_timestamp - with self.assertRaises(a.CodecNotImplementedError): - encode_timestamp(a.Timestamp.mdhm(10, 17, 12, 30)) - with self.assertRaises(a.CodecNotImplementedError): - decode_timestamp(b"10171230") - with self.assertRaises(a.CodecNotImplementedError): - a.serialize_payload( - a.Position( - 49, - -72, - a.Symbol("/", "-"), - extensions=a.Extensions(dao=a.DAO("W")), - ) - ) + stamp = a.Timestamp.mdhm(10, 17, 12, 30) + self.assertEqual(encode_timestamp(stamp), b"10171230") + self.assertEqual(decode_timestamp(b"10171230"), stamp) + p = a.Position( + 49, -72, a.Symbol("/", "-"), extensions=a.Extensions(dao=a.DAO("W")) + ) + self.assertEqual(a.parse_payload(a.serialize_payload(p)), p) diff --git a/packages/aprs/tests/packets/test_roundtrip_corpus.py b/packages/aprs/tests/packets/test_roundtrip_corpus.py new file mode 100644 index 0000000..fba3c7f --- /dev/null +++ b/packages/aprs/tests/packets/test_roundtrip_corpus.py @@ -0,0 +1,175 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Every vector is encoded from semantic fields or has a reviewed refusal reason.""" +from __future__ import annotations + +import dataclasses +import json +import math +from pathlib import Path +from typing import Any + +import pytest +from packets.test_corpus import LEGACY_POSITION_PROFILES, load, rows + +from hamkit import aprs as a + +EXCEPTIONS = json.loads( + (Path(__file__).parents[1] / "roundtrip_exceptions.json").read_text() +) + +# This suite tests representation, including deliberately invalid addresses. +# Transport conformance is covered separately; this explicit policy preserves +# the former monitor envelope behavior without changing any vector content. +CORPUS_POLICY = a.EnvelopePolicy(".*", ".*", ".*") +APRS_IS_ADDRESS_REFUSALS = { + "BAD-013", + "FAP-001", + "FAP-002", + "FAP-008", + "FAP-010", + "FAP-014", + "FAP-017", + "FAP-020", + "FAP-044", + "FAP-045", + "FAP-047", + "FAP-051", + "FAP-052", + # APRS-IS drops SSID -0; RF and the permissive corpus policy accept it. + "HDR-002", + "HDR-036", +} +CHECKSUM_FINDING = "$.payload.metadata.checksum_valid" + + +def repair_checksum(packet: a.Packet) -> a.Packet: + """The explicit repair a caller makes before resending a bad checksum.""" + n = packet.payload + assert isinstance(n, a.NMEA) + metadata = dataclasses.replace(n.metadata, checksum_valid=None) + return dataclasses.replace( + packet, payload=dataclasses.replace(n, metadata=metadata) + ) + + +def without_evidence(value: Any) -> Any: + if dataclasses.is_dataclass(value) and not isinstance(value, type): + return dataclasses.replace( + value, + **{ + f.name: without_evidence(getattr(value, f.name)) + if f.compare + else f.default + for f in dataclasses.fields(value) + }, + ) + if isinstance(value, tuple): + return tuple(without_evidence(v) for v in value) + return value + + +def same_semantics(x: Any, y: Any, path="$") -> None: + assert ( + type(x) is type(y) + or isinstance(x, (int, float)) + and isinstance(y, (int, float)) + ), path + if dataclasses.is_dataclass(x): + for f in dataclasses.fields(x): + # Checksum characters describe the original lexemes, which the + # encoder can normalize. Their validity is checked separately. + if f.compare and not ( + isinstance(x, a.NMEAMetadata) and f.name == "checksum_supplied" + ): + same_semantics( + getattr(x, f.name), getattr(y, f.name), path + "." + f.name + ) + elif isinstance(x, tuple): + assert len(x) == len(y), path + for i, (v, w) in enumerate(zip(x, y)): + same_semantics(v, w, f"{path}[{i}]") + elif isinstance(x, (float, int)) and not isinstance(x, bool): + assert math.isclose(x, y, abs_tol=1e-8, rel_tol=1e-9), (path, x, y) + if x == y == 0: + assert math.copysign(1, x) == math.copysign(1, y), ( + path, + "hemisphere changed", + ) + else: + assert x == y, (path, x, y) + + +@pytest.mark.parametrize("row", load()) +def test_vector_roundtrip(row): + legacy = row["profile"] in LEGACY_POSITION_PROFILES + packet = a.parse_packet(row["packet"].encode("latin1"), legacy_positions=legacy) + # JSON is lossless even for malformed or nonconforming received packets. + assert a.to_json_dict(a.from_json(a.to_json(packet))) == a.to_json_dict(packet) + exception = EXCEPTIONS.get(row["id"]) + if isinstance(packet, a.Malformed): + assert exception is not None and exception["kind"] == "malformed" + assert [d.message for d in packet.diagnostics] == exception["reasons"] + return + clean = without_evidence(packet) + repaired = False + if ( + isinstance(clean.payload, a.NMEA) + and clean.payload.metadata.checksum_valid is False + ): + # A known-bad checksum is never re-signed implicitly: sending refuses + # until the caller clears checksum_valid as an explicit repair. + for send in (a.serialize_packet, a.validate_packet, a.serialize_tnc2_line): + with pytest.raises(a.ConformanceError) as caught: + send(clean, policy=CORPUS_POLICY) + assert [d.path for d in caught.value.diagnostics] == [CHECKSUM_FINDING] + clean, repaired = repair_checksum(clean), True + if exception: + assert exception["kind"] == "conformance" + with pytest.raises(a.ConformanceError) as caught: + a.serialize_packet(clean, policy=CORPUS_POLICY) + assert [d.message for d in caught.value.diagnostics] == exception["reasons"] + return + # Verify the stricter default independently of representational round trips. + if row["id"] in APRS_IS_ADDRESS_REFUSALS: + with pytest.raises(a.ConformanceError) as caught: + a.serialize_packet(clean) + assert all(d.path.startswith("$.header.") for d in caught.value.diagnostics) + else: + a.validate_packet(clean) + wire = a.serialize_packet(clean, policy=CORPUS_POLICY) + decoded = a.parse_packet(wire, legacy_positions=legacy) + assert isinstance(decoded, a.Packet) + if isinstance(clean.payload, a.NMEA): + n = clean.payload + if n.metadata.checksum_supplied is not None: + assert isinstance(decoded.payload, a.NMEA) + assert decoded.payload.metadata.checksum_valid is True + if repaired: + # After explicit repair the encoder signs the trusted fields, + # and the receiver re-evaluates fix usability. + s = n.sentence + usable = ( + s.fix_quality > 0 + if isinstance(s, a.GGA) + else s.fix_status == "A" + if isinstance(s, (a.GLL, a.RMC)) + else isinstance(s, a.WPL) + ) + clean = dataclasses.replace( + clean, + payload=dataclasses.replace( + n, + metadata=dataclasses.replace(n.metadata, checksum_valid=True), + position_usable=usable, + ), + ) + same_semantics(clean, decoded) + # Canonical bytes stabilize after one pass, including checksum and rounding. + assert a.serialize_packet(without_evidence(decoded), policy=CORPUS_POLICY) == wire + + +def test_no_stale_exception_ids(): + assert EXCEPTIONS.keys() <= {r["id"] for r in rows()} + assert APRS_IS_ADDRESS_REFUSALS <= {r["id"] for r in rows()} + assert not APRS_IS_ADDRESS_REFUSALS.intersection(EXCEPTIONS) diff --git a/packages/aprs/tests/receiver.py b/packages/aprs/tests/receiver.py new file mode 100644 index 0000000..dea65ed --- /dev/null +++ b/packages/aprs/tests/receiver.py @@ -0,0 +1,140 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Small application receiver exercising sequence semantics through public models. + +State belongs to the consuming application; the codec API remains stateless. +""" + +from hamkit import aprs as a + + +class Receiver: + def __init__(self, local="N0CALL"): + self.local = local + self.entities = {} + self.delivered = set() + self.bulletins = {} + self.status = {} + self.fallback = {} + self.positions = {} + self.definitions = {} + + def receive(self, packet): + assert isinstance(packet, a.Packet) + p, source = packet.payload, packet.header.source + if isinstance(p, (a.Object, a.Item)): + name = p.name.rstrip(" ") + self.entities[name] = p + return dict( + name=name, + owner=source, + alive=p.alive, + visible=p.alive, + latitude_deg=p.latitude_deg, + record_retained=name in self.entities, + entity_key=name, + entity_count=len(self.entities), + **{ + "type_of_" + key: "item" if isinstance(v, a.Item) else "object" + for key, v in self.entities.items() + }, + ) + if isinstance(p, a.Message): + if p.addressee != self.local: + return {"message_id": p.message_id, "piggyback_ack": p.reply_ack} + self.delivered.add((source, p.message_id, p.text)) + ack = a.Acknowledgment(source, p.message_id, reply_ack=p.reply_ack) + return dict( + deliveries=len(self.delivered), + ack_to=source, + ack_payload=a.serialize_payload(ack).decode(), + pending_reply_ack=p.message_id, + **( + {"outbound_message_" + p.reply_ack + "_acked": True} + if p.reply_ack + else {} + ), + ) + if isinstance(p, a.TelemetryDefinition): + definitions = self.definitions.setdefault(p.addressee, {}) + d = p.definition + definitions[type(d)] = d + if isinstance(d, (a.TelemetryParameters, a.TelemetryUnits)): + names = [f"A{i+1}" for i in range(5)] + [f"B{i+1}" for i in range(8)] + return { + name + + ( + "" + if isinstance(d, a.TelemetryParameters) + else "_unit" + if i < 5 + else "_label" + ): v + for i, (name, v) in enumerate(zip(names, d.channels)) + } + if isinstance(d, a.TelemetryEquations): + return { + f"A{i+1}_coefficients": [v.a, v.b, v.c] + for i, v in enumerate(d.coefficients) + if v is not None + } + return { + "sense_bits": "".join("1" if b else "0" for b in d.sense), + "project": d.project_title, + } + if isinstance(p, a.Telemetry): + definitions = self.definitions.get(source, {}) + result = {"raw_analog": list(p.analog)} + eq = definitions.get(a.TelemetryEquations) + units = definitions.get(a.TelemetryUnits) + bits = definitions.get(a.TelemetryBits) + if eq: + for i, (v, c) in enumerate(zip(p.analog, eq.coefficients)): + if v is None or c is None: + continue + value = c.a * v * v + c.b * v + c.c + result[f"A{i+1}_calibrated"] = value + if units and units.channels[i] == "v/100": + result[f"A{i+1}_volts"] = value / 100 + if units and units.channels[i] == "deg.F": + result[f"A{i+1}_fahrenheit"] = value + if bits: + result.update( + { + f"B{i+1}_label_active": b == sense + for i, (b, sense) in enumerate(zip(p.digital, bits.sense)) + if b is not None + } + ) + return result + if isinstance(p, a.Bulletin): + self.bulletins[source + "/" + p.identifier] = p.text + return {"bulletins": dict(self.bulletins)} + if isinstance(p, a.Status): + self.status[source] = p.text + return {"status": p.text} + if isinstance(p, a.Beacon): + self.fallback[source] = p.text + return { + "fallback_status": p.text, + "status": self.status.get(source, p.text), + "fallback_status_does_not_replace_explicit": source in self.status, + } + if isinstance(p, a.Position): + self.positions[source] = p.coordinates + return { + "station_latitude_deg": p.latitude_deg, + "station_longitude_deg": p.longitude_deg, + } + if isinstance(p, a.Weather): + c = self.positions.get(source) + t = p.temperature + return { + "weather_latitude_deg": c.latitude_deg if c else None, + "weather_longitude_deg": c.longitude_deg if c else None, + "temperature_c": ( + (t.value - 32) / 1.8 if t.unit == "fahrenheit" else t.value + ), + "position_inherited_not_transmitted": True, + } + raise AssertionError(type(p)) diff --git a/packages/aprs/tests/roundtrip_exceptions.json b/packages/aprs/tests/roundtrip_exceptions.json new file mode 100644 index 0000000..0c3950f --- /dev/null +++ b/packages/aprs/tests/roundtrip_exceptions.json @@ -0,0 +1,1241 @@ +{ + "BAD-001": { + "kind": "malformed", + "reasons": [ + "missing information separator", + "missing source separator", + "empty or invalid address token" + ] + }, + "BAD-002": { + "kind": "malformed", + "reasons": ["missing information separator"] + }, + "BAD-003": { + "kind": "malformed", + "reasons": ["missing source separator"] + }, + "BAD-004": { + "kind": "malformed", + "reasons": ["empty or invalid address token"] + }, + "BAD-005": { + "kind": "malformed", + "reasons": ["empty or invalid address token"] + }, + "BAD-006": { + "kind": "malformed", + "reasons": ["information field is empty"] + }, + "BAD-007": { + "kind": "malformed", + "reasons": ["empty or invalid address token"] + }, + "BAD-008": { + "kind": "malformed", + "reasons": ["empty or invalid address token"] + }, + "BAD-014": { + "kind": "malformed", + "reasons": ["empty or invalid address token"] + }, + "BAD-015": { + "kind": "malformed", + "reasons": ["coordinate out of range", "coordinate out of range"] + }, + "BAD-016": { + "kind": "malformed", + "reasons": ["coordinate out of range", "coordinate out of range"] + }, + "BAD-017": { + "kind": "malformed", + "reasons": ["coordinate out of range", "coordinate out of range"] + }, + "BAD-018": { + "kind": "malformed", + "reasons": ["coordinate out of range", "coordinate out of range"] + }, + "BAD-019": { + "kind": "malformed", + "reasons": ["coordinate out of range", "coordinate out of range"] + }, + "BAD-020": { + "kind": "malformed", + "reasons": ["coordinate out of range", "coordinate out of range"] + }, + "BAD-021": { + "kind": "malformed", + "reasons": ["invalid coordinate syntax", "invalid coordinate syntax"] + }, + "BAD-022": { + "kind": "malformed", + "reasons": ["invalid coordinate syntax", "invalid coordinate syntax"] + }, + "BAD-023": { + "kind": "malformed", + "reasons": ["invalid coordinate syntax", "invalid coordinate syntax"] + }, + "BAD-024": { + "kind": "malformed", + "reasons": [ + "ambiguity must hide trailing minute digits", + "position ambiguity is not implemented" + ] + }, + "BAD-025": { + "kind": "malformed", + "reasons": [ + "longitude cannot be more ambiguous than latitude", + "position ambiguity is not implemented" + ] + }, + "BAD-026": { + "kind": "malformed", + "reasons": [ + "truncated uncompressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-027": { + "kind": "malformed", + "reasons": [ + "truncated uncompressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-028": { + "kind": "malformed", + "reasons": [ + "truncated uncompressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-029": { + "kind": "malformed", + "reasons": [ + "truncated uncompressed position", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-030": { + "kind": "malformed", + "reasons": [ + "truncated uncompressed position", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-031": { + "kind": "malformed", + "reasons": [ + "truncated uncompressed position", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-032": { + "kind": "malformed", + "reasons": ["truncated uncompressed position", "missing or truncated field"] + }, + "BAD-033": { + "kind": "conformance", + "reasons": ["begins with an invalid data extension"] + }, + "BAD-036": { + "kind": "conformance", + "reasons": ["begins with an invalid data extension"] + }, + "BAD-037": { + "kind": "conformance", + "reasons": ["begins with an invalid data extension"] + }, + "BAD-038": { + "kind": "conformance", + "reasons": ["begins with an invalid data extension"] + }, + "BAD-039": { + "kind": "conformance", + "reasons": ["contains an invalid /A= altitude"] + }, + "BAD-040": { + "kind": "conformance", + "reasons": ["contains an invalid /A= altitude"] + }, + "BAD-041": { + "kind": "malformed", + "reasons": [ + "truncated uncompressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-042": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-043": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-044": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-045": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-046": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-047": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-048": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "missing or truncated field" + ] + }, + "BAD-049": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-050": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-051": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-052": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-053": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-054": { + "kind": "malformed", + "reasons": [ + "invalid base-91 field", + "missing or truncated field", + "missing or truncated field", + "position ambiguity is not implemented" + ] + }, + "BAD-055": { + "kind": "malformed", + "reasons": [ + "invalid base-91 field", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-056": { + "kind": "malformed", + "reasons": [ + "invalid base-91 field", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-057": { + "kind": "malformed", + "reasons": [ + "invalid base-91 field", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-058": { + "kind": "malformed", + "reasons": [ + "invalid base-91 field", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-059": { + "kind": "malformed", + "reasons": [ + "invalid base-91 field", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-060": { + "kind": "malformed", + "reasons": [ + "invalid compressed symbol table", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-061": { + "kind": "malformed", + "reasons": [ + "invalid compressed symbol table", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-062": { + "kind": "malformed", + "reasons": [ + "invalid compressed symbol table", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-063": { + "kind": "malformed", + "reasons": [ + "invalid compressed symbol table", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-064": { + "kind": "malformed", + "reasons": [ + "invalid compressed symbol table", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-065": { + "kind": "malformed", + "reasons": [ + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-066": { + "kind": "malformed", + "reasons": [ + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "BAD-067": { + "kind": "malformed", + "reasons": ["invalid Mic-E destination"] + }, + "BAD-068": { + "kind": "malformed", + "reasons": ["invalid Mic-E destination"] + }, + "BAD-069": { + "kind": "malformed", + "reasons": ["invalid Mic-E destination"] + }, + "BAD-070": { + "kind": "malformed", + "reasons": ["invalid Mic-E destination"] + }, + "BAD-071": { + "kind": "malformed", + "reasons": ["invalid Mic-E destination"] + }, + "BAD-072": { + "kind": "malformed", + "reasons": ["invalid Mic-E destination"] + }, + "BAD-073": { + "kind": "malformed", + "reasons": ["information field is empty"] + }, + "BAD-074": { + "kind": "malformed", + "reasons": ["truncated or invalid Mic-E information"] + }, + "BAD-075": { + "kind": "malformed", + "reasons": ["truncated or invalid Mic-E information"] + }, + "BAD-076": { + "kind": "malformed", + "reasons": ["truncated or invalid Mic-E information"] + }, + "BAD-077": { + "kind": "malformed", + "reasons": ["truncated or invalid Mic-E information"] + }, + "BAD-078": { + "kind": "malformed", + "reasons": ["truncated or invalid Mic-E information"] + }, + "BAD-079": { + "kind": "malformed", + "reasons": ["truncated or invalid Mic-E information"] + }, + "BAD-080": { + "kind": "malformed", + "reasons": ["truncated or invalid Mic-E information"] + }, + "BAD-081": { + "kind": "malformed", + "reasons": ["truncated or invalid Mic-E information"] + }, + "BAD-082": { + "kind": "malformed", + "reasons": ["invalid object name or alive marker"] + }, + "BAD-083": { + "kind": "malformed", + "reasons": ["invalid object name or alive marker"] + }, + "BAD-084": { + "kind": "malformed", + "reasons": ["invalid object name or alive marker"] + }, + "BAD-085": { + "kind": "malformed", + "reasons": ["timestamp must contain six digits and a suffix"] + }, + "BAD-086": { + "kind": "conformance", + "reasons": ["item names have at least three characters"] + }, + "BAD-087": { + "kind": "malformed", + "reasons": ["invalid item name or marker"] + }, + "BAD-088": { + "kind": "malformed", + "reasons": ["invalid item name or marker"] + }, + "BAD-089": { + "kind": "conformance", + "reasons": ["exceeds 67 bytes"] + }, + "BAD-090": { + "kind": "malformed", + "reasons": ["message requires a nine-byte addressee and colon"] + }, + "BAD-091": { + "kind": "malformed", + "reasons": ["message requires a nine-byte addressee and colon"] + }, + "BAD-092": { + "kind": "malformed", + "reasons": ["requires 1..5 alphanumeric characters"] + }, + "BAD-093": { + "kind": "malformed", + "reasons": ["requires 1..5 alphanumeric characters"] + }, + "BAD-094": { + "kind": "malformed", + "reasons": ["requires 1..5 alphanumeric characters"] + }, + "BAD-095": { + "kind": "malformed", + "reasons": ["requires 1..5 alphanumeric characters"] + }, + "BAD-096": { + "kind": "conformance", + "reasons": ["contains a reserved character (| ~)"] + }, + "BAD-097": { + "kind": "conformance", + "reasons": ["contains a reserved character (| ~)"] + }, + "BAD-098": { + "kind": "conformance", + "reasons": ["classic telemetry requires 0..999 or MIC"] + }, + "BAD-099": { + "kind": "conformance", + "reasons": ["requires an integer in 0..255"] + }, + "BAD-100": { + "kind": "conformance", + "reasons": ["requires an integer in 0..255"] + }, + "BAD-101": { + "kind": "conformance", + "reasons": ["requires an integer in 0..255"] + }, + "BAD-102": { + "kind": "conformance", + "reasons": ["classic telemetry has five analog channels"] + }, + "BAD-103": { + "kind": "malformed", + "reasons": ["telemetry requires eight binary digits"] + }, + "BAD-104": { + "kind": "malformed", + "reasons": ["telemetry requires eight binary digits"] + }, + "BAD-105": { + "kind": "conformance", + "reasons": [ + "required report slot; use Measurement(None, unit) if unavailable" + ] + }, + "BAD-106": { + "kind": "malformed", + "reasons": ["must be in 1..12"] + }, + "BAD-107": { + "kind": "conformance", + "reasons": ["reading outside the quantity's range"] + }, + "BAD-109": { + "kind": "malformed", + "reasons": [ + "missing information separator", + "missing source separator", + "empty or invalid address token" + ] + }, + "BAD-110": { + "kind": "malformed", + "reasons": ["missing information separator"] + }, + "BAD-111": { + "kind": "malformed", + "reasons": ["information field is empty"] + }, + "BAD-112": { + "kind": "malformed", + "reasons": ["missing information separator", "missing source separator"] + }, + "BAD-113": { + "kind": "malformed", + "reasons": ["user-defined payload needs user ID and type"] + }, + "BAD-114": { + "kind": "malformed", + "reasons": ["user-defined payload needs user ID and type"] + }, + "BAD-115": { + "kind": "conformance", + "reasons": ["status exceeds 62 bytes"] + }, + "BAD-116": { + "kind": "conformance", + "reasons": ["status exceeds 62 bytes"] + }, + "BAD-117": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "BAD-121": { + "kind": "malformed", + "reasons": ["invalid symbol table or overlay"] + }, + "BAD-122": { + "kind": "malformed", + "reasons": ["numeric overlays a-j exist only in compressed form"] + }, + "BAD-123": { + "kind": "malformed", + "reasons": ["invalid symbol table or overlay"] + }, + "BAD-124": { + "kind": "malformed", + "reasons": ["protocol token must be printable ASCII"] + }, + "BAD-125": { + "kind": "malformed", + "reasons": ["protocol token must be printable ASCII"] + }, + "FAP-018": { + "kind": "malformed", + "reasons": [ + "invalid coordinate syntax", + "invalid coordinate syntax", + "invalid coordinate syntax" + ] + }, + "FAP-019": { + "kind": "malformed", + "reasons": ["invalid object name or alive marker"] + }, + "FAP-021": { + "kind": "malformed", + "reasons": ["invalid symbol table or overlay"] + }, + "FAP-030": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-031": { + "kind": "malformed", + "reasons": [ + "truncated compressed position", + "missing or truncated field", + "missing or truncated field", + "invalid coordinate syntax" + ] + }, + "FAP-038": { + "kind": "malformed", + "reasons": ["missing information separator"] + }, + "FAP-039": { + "kind": "malformed", + "reasons": ["missing source separator"] + }, + "FAP-040": { + "kind": "malformed", + "reasons": ["missing information separator"] + }, + "FAP-041": { + "kind": "malformed", + "reasons": ["information field is empty"] + }, + "FAP-042": { + "kind": "malformed", + "reasons": ["missing source separator"] + }, + "FAP-043": { + "kind": "malformed", + "reasons": ["empty or invalid address token"] + }, + "FAP-046": { + "kind": "malformed", + "reasons": ["empty or invalid address token"] + }, + "FAP-049": { + "kind": "malformed", + "reasons": ["empty or invalid address token"] + }, + "FAP-050": { + "kind": "malformed", + "reasons": ["empty or invalid address token"] + }, + "FAP-057": { + "kind": "malformed", + "reasons": ["invalid item name or marker"] + }, + "FAP-060": { + "kind": "malformed", + "reasons": ["truncated uncompressed position"] + }, + "FAP-061": { + "kind": "malformed", + "reasons": ["invalid item name or marker"] + }, + "FAP-062": { + "kind": "conformance", + "reasons": ["exceeds 67 bytes"] + }, + "FAP-064": { + "kind": "conformance", + "reasons": ["text contains control characters", "exceeds 67 bytes"] + }, + "FAP-065": { + "kind": "conformance", + "reasons": ["exceeds 67 bytes"] + }, + "FAP-162": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-163": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-164": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-165": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-166": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-167": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-168": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-169": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-170": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-171": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-172": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-173": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-174": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-175": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-176": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-177": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-178": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-179": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-180": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-181": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-182": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-183": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-184": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-185": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-186": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-187": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-188": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-189": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-190": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-191": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-192": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-193": { + "kind": "conformance", + "reasons": ["text contains control characters"] + }, + "FAP-297": { + "kind": "conformance", + "reasons": ["reply-ack ID and ack exceed five characters"] + }, + "FAP-299": { + "kind": "conformance", + "reasons": ["reply-ack ID and ack exceed five characters"] + }, + "FAP-300": { + "kind": "conformance", + "reasons": ["reply-ack ID and ack exceed five characters"] + }, + "FAP-301": { + "kind": "conformance", + "reasons": ["reply-ack ID and ack exceed five characters"] + }, + "FAP-302": { + "kind": "conformance", + "reasons": ["reply-ack ID and ack exceed five characters"] + }, + "FAP-303": { + "kind": "conformance", + "reasons": ["reply-ack ID and ack exceed five characters"] + }, + "FAP-304": { + "kind": "conformance", + "reasons": ["reply-ack ID and ack exceed five characters"] + }, + "FAP-305": { + "kind": "conformance", + "reasons": ["reply-ack ID and ack exceed five characters"] + }, + "FAP-306": { + "kind": "conformance", + "reasons": ["reply-ack ID and ack exceed five characters"] + }, + "FAP-343": { + "kind": "malformed", + "reasons": ["message requires a nine-byte addressee and colon"] + }, + "FAP-344": { + "kind": "malformed", + "reasons": ["message requires a nine-byte addressee and colon"] + }, + "FAP-349": { + "kind": "malformed", + "reasons": ["invalid symbol table or overlay"] + }, + "FAP-350": { + "kind": "malformed", + "reasons": ["invalid Mic-E destination"] + }, + "FAP-351": { + "kind": "malformed", + "reasons": ["truncated or invalid Mic-E information"] + }, + "FAP-352": { + "kind": "malformed", + "reasons": ["invalid Mic-E destination"] + }, + "FAP-353": { + "kind": "malformed", + "reasons": ["invalid symbol table or overlay"] + }, + "FAP-354": { + "kind": "malformed", + "reasons": ["invalid Mic-E destination"] + }, + "FAP-355": { + "kind": "malformed", + "reasons": ["protocol token must be printable ASCII"] + }, + "FAP-356": { + "kind": "malformed", + "reasons": ["invalid Mic-E destination"] + }, + "FAP-362": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-365": { + "kind": "malformed", + "reasons": ["invalid NMEA sentence identifier"] + }, + "FAP-367": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-369": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-370": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-371": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-372": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-373": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-375": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-376": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-377": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-378": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-379": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-380": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-381": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-382": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-383": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-384": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-385": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-386": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-387": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-388": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-389": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-390": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-391": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-392": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-393": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-394": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-395": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-396": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-397": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-398": { + "kind": "malformed", + "reasons": ["invalid NMEA field"] + }, + "FAP-399": { + "kind": "malformed", + "reasons": ["invalid object name or alive marker"] + }, + "FAP-403": { + "kind": "malformed", + "reasons": ["invalid object name or alive marker"] + }, + "FAP-404": { + "kind": "malformed", + "reasons": ["invalid object name or alive marker"] + }, + "FAP-410": { + "kind": "malformed", + "reasons": ["truncated uncompressed position"] + }, + "FAP-411": { + "kind": "malformed", + "reasons": ["truncated compressed position"] + }, + "FAP-412": { + "kind": "malformed", + "reasons": ["invalid compressed symbol table"] + }, + "FAP-419": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-432": { + "kind": "conformance", + "reasons": [ + "requires an integer in 0..255", + "requires an integer in 0..255" + ] + }, + "FAP-433": { + "kind": "conformance", + "reasons": [ + "requires an integer in 0..255", + "requires an integer in 0..255", + "requires an integer in 0..255", + "requires an integer in 0..255", + "requires an integer in 0..255" + ] + }, + "FAP-434": { + "kind": "conformance", + "reasons": [ + "classic telemetry has five analog channels", + "classic telemetry has eight binary channels" + ] + }, + "FAP-435": { + "kind": "conformance", + "reasons": [ + "classic telemetry has eight binary channels", + "requires an integer in 0..255", + "requires an integer in 0..255" + ] + }, + "FAP-436": { + "kind": "malformed", + "reasons": ["invalid telemetry channel"] + }, + "FAP-437": { + "kind": "malformed", + "reasons": ["invalid telemetry channel"] + }, + "FAP-438": { + "kind": "malformed", + "reasons": ["invalid telemetry channel"] + }, + "FAP-439": { + "kind": "conformance", + "reasons": ["exceeds 4 bytes"] + }, + "FAP-448": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-449": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-450": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-451": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-453": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-454": { + "kind": "malformed", + "reasons": ["must be in 1..31"] + }, + "FAP-455": { + "kind": "malformed", + "reasons": ["must be in 1..31"] + }, + "FAP-456": { + "kind": "malformed", + "reasons": ["must be in 1..31"] + }, + "FAP-462": { + "kind": "malformed", + "reasons": [ + "longitude cannot be more ambiguous than latitude", + "position ambiguity is not implemented", + "position ambiguity is not implemented" + ] + }, + "FAP-469": { + "kind": "conformance", + "reasons": ["begins with an invalid data extension"] + }, + "FAP-471": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-472": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-476": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-477": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-479": { + "kind": "conformance", + "reasons": ["extensions and comment exceed 43 bytes"] + }, + "FAP-496": { + "kind": "conformance", + "reasons": [ + "requires an integer in 0..255", + "requires an integer in 0..255" + ] + }, + "FAP-500": { + "kind": "malformed", + "reasons": ["invalid object name or alive marker"] + }, + "NME-011": { + "kind": "malformed", + "reasons": ["invalid NMEA checksum field"] + }, + "OBJ-053": { + "kind": "malformed", + "reasons": ["names cannot have leading or trailing spaces"] + }, + "TIM-011": { + "kind": "malformed", + "reasons": ["must be in 1..31"] + }, + "TIM-012": { + "kind": "malformed", + "reasons": ["must be in 1..31"] + }, + "TIM-013": { + "kind": "malformed", + "reasons": ["must be in 0..23"] + }, + "TIM-014": { + "kind": "malformed", + "reasons": ["must be in 0..59"] + }, + "TIM-015": { + "kind": "malformed", + "reasons": ["must be in 0..23"] + }, + "TIM-016": { + "kind": "malformed", + "reasons": ["must be in 0..59"] + }, + "TIM-017": { + "kind": "malformed", + "reasons": ["must be in 0..59"] + }, + "TIM-018": { + "kind": "malformed", + "reasons": ["unknown timestamp suffix"] + } +} diff --git a/packages/aprs/tests/source_details.py b/packages/aprs/tests/source_details.py new file mode 100644 index 0000000..8432fee --- /dev/null +++ b/packages/aprs/tests/source_details.py @@ -0,0 +1,476 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Assert source facts outside JSON fields using models, evidence and receiver policy. + +No expected fixture value is used to compute the actual view. These are derived +units, presentation conventions and historical interpretations, not extra API. +""" + +import re + +from hamkit import aprs as a + + +def symbol(s): + return { + "table": s.table, + "overlay": s.overlay, + "code": s.code, + "table_id_raw": s.table_id, + } + + +def grid(g): + return { + "locator": g.locator, + "bounds_deg": { + "latitude": list(g.bounds.latitude), + "longitude": list(g.bounds.longitude), + }, + "center_deg": [g.center.latitude_deg, g.center.longitude_deg], + } + + +def weather(w): + r = {} + + def convert(name, key, factor=1, offset=0): + m = getattr(w, name) + if m is not None: + r[key] = None if m.value is None else m.value * factor + offset + + convert("temperature", "temperature_c", 1 / 1.8, -32 / 1.8) + convert("gust", "gust_mps", 0.44704) + convert("pressure", "pressure_tenth_hpa", 10) + for name in ("rain_1h", "rain_24h", "rain_since_midnight", "snow_24h"): + convert(name, name + "_mm", 25.4) + if w.wind_speed: + if w.wind_speed.unit == "disputed_knots_or_mph": + v = w.wind_speed.value + r["wind_speed_mps_interpretations"] = { + k: None if v is None else v * f + for k, f in [("APRS101_p27_knots", 1852 / 3600), ("FAP_mph", 0.44704)] + } + else: + convert( + "wind_speed", + "wind_speed_mps", + 1852 / 3600 if w.wind_speed.unit == "knots" else 0.44704, + ) + if w.water_height: + m = w.water_height.measurement + r["water_height"] = { + "field": "F" if m.unit == "feet" else "f", + "raw": f"{m.value:g}", + "meters": m.value * (0.3048 if m.unit == "feet" else 1), + } + if w.wind_direction and w.wind_speed and w.wind_direction.raw and w.wind_speed.raw: + r["wind_raw"] = (w.wind_direction.raw + b"/" + w.wind_speed.raw).decode() + return r + + +def core(packet, raw, profile): + assert isinstance(packet, a.Packet) + p = packet.payload + if isinstance(p, a.LegacyPosition): + p = ( + p.position + if profile == "historical-1.0" + else a.Beacon(raw.partition(b":")[2].decode("latin1")) + ) + body = raw.partition(b":")[2] + h = packet.header + r = {} + if hasattr(p, "symbol") and p.symbol is not None: + r["symbol"] = symbol(p.symbol) + if hasattr(p, "extensions"): + e = p.extensions + if e.motion: + v = e.motion + r["motion"] = { + "speed_kmh": None if v.speed_knots is None else v.speed_knots * 1.852, + "raw": v.raw.decode() if v.raw else None, + "station_fixed": v.zero_pair == "fixed", + "zero_pair_meaning": ( + "unknown-or-not-relevant" + if v.zero_pair == "unavailable" + else v.zero_pair + ), + } + if e.altitude: + v = e.altitude + r["altitude"] = { + "meters": v.measurement.value + * (0.3048 if v.measurement.unit == "feet" else 1), + "reference": v.reference, + } + if e.phg: + v = e.phg + r["phg"] = { + "range_miles_1_0": v.range_miles, + "display_radius_miles_1_1": v.display_radius_miles, + "omnidirectional": v.directivity_deg is None, + } + if e.range: + r["radio_range"] = {"km": e.range.miles * 1.609344} + if e.bearing: + v = e.bearing + r["df_bearing"] = { + "manual": v.manual, + "range_miles": v.range_miles, + "usable": v.quality_code > 0, + "accuracy_less_than_deg": (None, 240, 120, 64, 32, 16, 8, 4, 2, 1)[ + v.quality_code + ], + "nrq_raw": f"{v.hits_code}{v.range_code}{v.quality_code}", + "nrq_meaningful": bool(v.hits_code or v.range_code or v.quality_code), + } + if e.area: + v = e.area + r["area"] = { + "shape": ( + "open-circle", + "line-down-right", + "open-ellipse", + "open-triangle", + "open-box", + "filled-circle", + "line-down-left", + "filled-ellipse", + "filled-triangle", + "filled-box", + )[v.shape_code], + "color": ( + "black", + "blue", + "green", + "cyan", + "red", + "violet", + "yellow", + "gray", + )[v.color_code % 8], + "intensity": "low" if v.color_code >= 8 else "high", + "latitude_offset_deg": v.latitude_offset_deg, + "longitude_offset_deg": v.longitude_offset_deg, + "transmitted_anchor": ( + "center" + if v.transmitted_anchor == "circle_center" + else "lower-left" + if v.shape_code == 6 + else "lower-right" + ), + } + if e.weather: + r["weather"] = weather(e.weather) + if e.telemetry: + r["telemetry"] = { + "digital_channels_B1_to_B8": [ + int(b) if b is not None else None for b in e.telemetry.digital + ] + } + if isinstance(p, a.Weather): + r["weather"] = weather(p) + if isinstance(p, a.Telemetry): + r["telemetry"] = { + "digital_channels_B1_to_B8": [ + int(b) if b is not None else None for b in p.digital + ] + } + if hasattr(p, "compression") and p.compression: + r["compression"] = {"type_value": p.compression.type_value} + if hasattr(p, "ambiguity_extent"): + extent = p.ambiguity_extent + r["position"] = { + "is_null_position": getattr(p, "is_null_position", False), + "representative": "cell-center", + } + if extent: + r["position"]["cell_bounds_deg"] = { + "latitude": list(extent.latitude), + "longitude": list(extent.longitude), + } + if isinstance(p, (a.Object, a.Item)): + r["name_raw"] = body[1:10].decode() if isinstance(p, a.Object) else p.name + if hasattr(p, "timestamp") and p.timestamp: + from hamkit.aprs._fields import encode_timestamp + + r["timestamp"] = {"raw": encode_timestamp(p.timestamp).decode()} + if isinstance(p, a.MicE): + dest = h.destination.split("-")[0] + bits = "".join( + "1" if "A" <= c <= "K" or "P" <= c <= "Z" else "0" for c in dest[:3] + ) + custom = any("A" <= c <= "K" for c in dest[:3]) + standard = any("P" <= c <= "Z" for c in dest[:3]) + r["mic_e"] = { + "position_comment_bits": bits, + "position_comment_set": ( + "mixed" if custom and standard else "custom" if custom else "standard" + ), + "longitude_offset": 100 if dest[4] >= "P" else 0, + "type_marker": p.device_code[:1] if p.device_code else None, + } + match = re.match(r"([A-R]{2}[0-9]{2}[A-X]{2})(/)([A-Za-z])", p.comment) + if match: + r["grid_locator"] = match[1] + r["grid_symbol"] = symbol(a.Symbol(match[2], match[3])) + if isinstance(p, a.NMEA): + r["position_usable"] = p.position_usable + if isinstance(p.sentence, a.GGA): + r["altitude"] = {"reference": "mean-sea-level"} + if isinstance(p.sentence, a.RMC): + r["motion"] = { + "speed_kmh": ( + p.sentence.speed_knots * 1.852 + if p.sentence.speed_knots is not None + else None + ) + } + elif isinstance(p, a.RawWeather): + r["decoded_measurements"] = None + r["position_usable"] = False + elif isinstance(p, (a.Maidenhead, a.Beacon)): + r["position_usable"] = False + else: + r["position_usable"] = hasattr(p, "latitude_deg") + if isinstance(p, (a.Status, a.Maidenhead)) and p.grid: + r["grid"] = grid(p.grid) + if re.fullmatch(r"[A-R]{2}\d{2}[A-X]{2}", h.destination): + r["destination_grid"] = grid(a.Grid(h.destination)) + r["status_fallback_permitted"] = isinstance(p, a.Beacon) + paths = [hop.address for hop in h.path] + r["policy"] = { + "forward_to_aprs_is": not any(x in ("RFONLY", "NOGATE") for x in paths), + "archive_allowed": b"!x!" not in body and "NOARCH" not in paths, + } + for i, hop in enumerate(paths): + if re.fullmatch("q[A-Z][A-Za-z]", hop): + r["aprs_is"] = {"q_construct_raw": hop, "following_path": paths[i + 1 :]} + break + r["normalized_tnc2"] = str(h) + ":" + body.decode("latin1") + r["destination_semantics"] = ( + "APRS-address" + if h.destination.startswith(("AP", "GPS", "SPC", "SYM", "AIR", "DF", "ZIP")) + or h.destination + in { + "ALL", + "BEACON", + "CQ", + "DGPS", + "DRILL", + "DX", + "ID", + "JAVA", + "MAIL", + "MICE", + "QST", + "QTH", + "RTCM", + "SKY", + "SPACE", + "TEL", + "TEST", + "TLM", + "WX", + } + else "alternate-net" + ) + ssid = h.destination.rpartition("-")[2] + if ssid.isdigit(): + v = int(ssid) + r["destination_ssid"] = v + r["historical_generic_path"] = ( + "VIA", + *[f"WIDE{i}-{i}" for i in range(1, 8)], + "North", + "South", + "East", + "West", + "North + WIDE", + "South + WIDE", + "East + WIDE", + "West + WIDE", + )[v] + if isinstance(p, a.ThirdParty): + r["inner"] = core(p.packet, body[1:], profile) + r["inner_packet"] = body[1:].decode("latin1") + r["message_origin"] = p.packet.header.source + if body.startswith(b":"): + address = body[1:10].decode() + content = body[11:].decode("latin1") + text, sep, identifier = content.partition("{") + number, _brace, _ack = identifier.partition("}") + m = { + "addressee_raw": address, + "addressee": address.rstrip(), + "message_id": number if sep else None, + "text": text, + "ack_requested": bool(sep) and not isinstance(p, a.NWSBulletin), + "message_id_raw": identifier if sep else None, + "group_address": address.rstrip() in ("CQ", "ALL", "QST"), + } + if content.startswith(("ack", "rej")): + v = content[3:] + m.update(ack_id_raw=v, embedded_reply_ack_id=v.partition("}")[2] or None) + if address.startswith("NWS-"): + m["reference_id"] = identifier or None + r["message"] = m + if isinstance(p, a.TelemetryDefinition): + r["telemetry_definition"] = {"values_raw": content[5:].split(",")} + if isinstance(p, a.Query): + r["query"] = { + "directed": p.addressee is not None, + "recognized": p.name + in { + "APRS", + "IGATE", + "WX", + "APRSD", + "APRSH", + "APRSM", + "APRSO", + "APRSP", + "APRSS", + "APRST", + "PING", + }, + "ack_requested": False, + } + if p.footprint: + r["query"]["radius_km"] = p.footprint.radius_miles * 1.609344 + return r + + +def at(value, path): + for key in path.removeprefix("$.").split("."): + value = value[key] + return value + + +def check_core(row): + from packets.test_corpus import differences + + raw = row["packet"].encode("latin1") + from packets.test_corpus import parse_row + + actual = core(parse_row(row, raw), raw, row["profile"]) + errors = [] + for path in row.get("unmapped", []): + try: + value = at(actual, path) + except (KeyError, TypeError): + errors.append(path + ": no derived assertion") + continue + errors.extend(differences(value, at(row["source_expected"], path), path)) + return errors + + +def check_public_phg(row, packet): + """Express source fields from public models, without a historical decoder.""" + from packets.test_corpus import differences + + p = packet.payload + if isinstance(p, a.LegacyPosition): + p = p.position + assert isinstance(p, a.Position) and p.extensions.phg is not None + phg = p.extensions.phg + assert phg.raw is not None + code = phg.raw.decode("ascii") + if phg.rate_per_hour is not None: + code += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[phg.rate_per_hour] + facts = { + "Capabilities": None, + "ChecksumOK": None, + "DaoDatumByte": None, + "GPSFixStatus": None, + "MBits": "", + "MiceMangled": False, + "ObjectName": "", + "PosResolution": (18.52, 185.2, 1852, 18520, 111120)[p.ambiguity], + "RawTimestamp": "", + "Warnings": None, + "PHG": code, + } + # Fail if future PHG rows need additional source-field derivations. + assert p.extensions.dao is None and p.compression is None and p.timestamp is None + actual = {"fap_fields": facts} + paths = [*row.get("unmapped", []), "$.fap_fields.PHG"] + errors = [] + for path in paths: + errors.extend( + differences(at(actual, path), at(row["source_expected"], path), path) + ) + if p.extensions.telemetry is not None: + # FAP has five slots even when the wire omits trailing channels. Assert + # those source nulls as well as the variable-length public JSON array. + analog = list(p.extensions.telemetry.analog) + analog += [None] * (5 - len(analog)) + errors.extend( + differences( + analog, + row["source_expected"]["fap_fields"]["TelemetryData"]["Vals"], + "$.fap_fields.TelemetryData.Vals", + ) + ) + return errors + + +def check_rejection(row): + from generate_vectors import header, translate + from packets.test_corpus import differences + + raw = row["packet"].encode("latin1") + source = row["source_expected"] + if row["profile"] == "compatibility-fap": + return [] # The rejection itself is asserted; FAP's partial fields are not. + p = a.parse_packet(raw) + errors = [] + if "header" in source: + assert p.header is not None + errors.extend( + differences( + a.to_json_dict(p.header, include_defaults=True), + header(source["header"]), + "$.header", + ) + ) + if "kind" in source: + expected = translate(source) + # Empty NMEA optional variation direction has the existing None form. + n = expected.get("payload", {}).get("sentence", {}) + if n.get("magnetic_variation_direction") == "": + n["magnetic_variation_direction"] = None + errors.extend(differences(a.to_json_dict(p, include_defaults=True), expected)) + if "partial" in source: + assert isinstance(p, a.Malformed) + recovered = p.recovered["payload"] + from hamkit.aprs._position_codec import ambiguity + + partial = { + "position": { + "latitude_deg": recovered.get("latitude_deg"), + "longitude_deg": recovered.get("longitude_deg"), + "ambiguity_digits": ambiguity(raw.partition(b":")[2][8:16]), + } + } + errors.extend(differences(partial, source["partial"], "$.partial")) + if "compression_type_value" in source: + assert isinstance(p, a.Packet) and p.payload.compression is not None + assert p.payload.compression.raw[-1] - 33 == source["compression_type_value"] + # These booleans describe receiver usability, not fabricated measurements. + for flag in ( + "position_usable", + "message_valid", + "telemetry_valid", + "weather_valid", + "inner_packet_valid", + ): + if flag in source: + invalid = isinstance(p, a.Malformed) or any( + d.code == "nonconforming" for d in p.diagnostics + ) + if isinstance(p, a.Packet) and isinstance(p.payload, a.NMEA): + invalid = p.payload.position_usable is False + errors.extend(differences(not invalid, source[flag], "$." + flag)) + return errors diff --git a/packages/aprs/tests/test_api_contract.py b/packages/aprs/tests/test_api_contract.py index 119a752..90a8a29 100644 --- a/packages/aprs/tests/test_api_contract.py +++ b/packages/aprs/tests/test_api_contract.py @@ -20,7 +20,14 @@ def test_every_payload_has_construction_and_codec_example(self) -> None: self.assertEqual({c.model for c in a.codec_support()}, set(get_args(a.Payload))) for payload in examples: with self.subTest(model=type(payload).__name__): - packet = a.Packet(HEADER, payload) + packet = a.Packet( + ( + a.Header("N0CALL", "TY0P0P") + if isinstance(payload, a.MicE) + else HEADER + ), + payload, + ) self.assertIs(packet.payload, payload) self.assertEqual(a.check_packet(packet), ()) if a.codec_support_for(payload).encode == "unimplemented": @@ -37,7 +44,9 @@ def test_every_public_dataclass_has_an_example(self) -> None: and dataclasses.is_dataclass(getattr(a, name)) } self.assertEqual( - {type(v) for v in (*field_examples(), *payload_examples())}, public + # EnvelopePolicy is configuration data, not a packet JSON model. + {type(v) for v in (*field_examples(), *payload_examples(), a.RF)}, + public, ) def test_public_annotations_resolve(self) -> None: @@ -63,6 +72,7 @@ def test_implementation_modules_are_private(self) -> None: "Path", "HeaderSemantics", "EncodedPacketFields", + "EnvelopeProfile", "DecodeOptions", "EncodeOptions", "get_capabilities", @@ -183,22 +193,15 @@ def test_mic_e_requires_context(self) -> None: ) with self.assertRaises(a.ContextRequiredError): a.serialize_payload(mic_e) - with self.assertRaises(a.CodecNotImplementedError): + with self.assertRaises(a.FieldError): a.serialize_packet(a.Packet(HEADER, mic_e)) - with self.assertRaises(a.CodecNotImplementedError): - a.parse_payload( - b"`12345678", - header=a.Header("N0CALL", "490S5P"), - unsupported="raise", - ) - parsed = a.parse_packet(b"N0CALL>490S5P:`12345678") - assert isinstance(parsed, a.Packet) + parsed = a.parse_packet(b"N0CALL>490S5P:`123456>/") + assert isinstance(parsed, a.Packet) and isinstance(parsed.payload, a.MicE) self.assertEqual(parsed.header.destination, "490S5P") - self.assertIsInstance(parsed.payload, a.Opaque) + self.assertEqual(a.parse_packet(a.serialize_packet(parsed)), parsed) def test_option_values_are_checked(self) -> None: for kwargs in ( - {"profile": "radio"}, {"unsupported": "ignore"}, {"malformed": "opaque"}, {"max_third_party_depth": -1}, diff --git a/packages/aprs/tests/test_conformance.py b/packages/aprs/tests/test_conformance.py index 27c57ae..9e873aa 100644 --- a/packages/aprs/tests/test_conformance.py +++ b/packages/aprs/tests/test_conformance.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: 2024-present Adam Fourney # SPDX-License-Identifier: MIT """APRS rules a well-formed model can break: reported, and never sent.""" + from __future__ import annotations import unittest @@ -12,8 +13,8 @@ SYMBOL = a.Symbol("/", "-") -def findings(payload: Any, profile: a.EnvelopeProfile = "monitor") -> set[str]: - return {d.path for d in a.check_packet(a.Packet(HEADER, payload), profile=profile)} +def findings(payload: Any, policy: a.EnvelopePolicy = a.APRS_IS) -> set[str]: + return {d.path for d in a.check_packet(a.Packet(HEADER, payload), policy=policy)} def complete_weather(**changes: Any) -> a.Weather: @@ -48,40 +49,40 @@ def test_all_findings_are_reported_together(self) -> None: a.Status("bad|status" + "x" * 60), ) self.assertEqual( - {d.path for d in a.check_packet(packet, profile="rf")}, + {d.path for d in a.check_packet(packet, policy=a.RF)}, {"$.header.source", "$.header.path", "$.payload.text"}, ) self.assertEqual({d.path for d in a.check_packet(packet)}, {"$.payload.text"}) - def test_rf_profile_limits(self) -> None: + def test_rf_policy_limits(self) -> None: for source in ("N0CALL-16", "TOOLONG", "n0call"): packet = a.Packet(a.Header(source, "APRS"), a.Status("")) self.assertIsInstance(a.serialize_packet(packet), bytes) with self.subTest(source=source), self.assertRaises(a.ConformanceError): - a.serialize_packet(packet, profile="rf") + a.serialize_packet(packet, policy=a.RF) hops = tuple(a.Hop("D1") for _ in range(8)) a.validate_packet( - a.Packet(a.Header("N0CALL", "APRS", hops), a.Status("")), profile="rf" + a.Packet(a.Header("N0CALL", "APRS", hops), a.Status("")), policy=a.RF ) with self.assertRaises(a.ConformanceError): a.validate_packet( a.Packet(a.Header("N0CALL", "APRS", hops * 2), a.Status("")), - profile="rf", + policy=a.RF, ) large = a.Packet(HEADER, a.UserDefined(b"A", b"B", b"x" * 260)) self.assertEqual( - [d.path for d in a.check_packet(large, profile="rf")], ["$.payload"] + [d.path for d in a.check_packet(large, policy=a.RF)], ["$.payload"] ) self.assertEqual(a.check_packet(large), ()) with self.assertRaises(a.ConformanceError): - a.serialize_packet(a.Packet(HEADER, a.Opaque(b"~" * 257)), profile="rf") + a.serialize_packet(a.Packet(HEADER, a.Opaque(b"~" * 257)), policy=a.RF) def test_rf_header_rules_skip_third_party_inner_headers(self) -> None: inner = a.Packet( a.Header("w1aw", "APRS", (a.Hop("TCPIP", True),)), a.Status("") ) packet = a.Packet(HEADER, a.ThirdParty(inner)) - self.assertEqual(a.check_packet(packet, profile="rf"), ()) + self.assertEqual(a.check_packet(packet, policy=a.RF), ()) def test_control_characters_are_never_sent(self) -> None: for payload in (a.Status("bell\x07"), a.Message("W1AW", "line\nbreak")): @@ -269,10 +270,18 @@ def test_motion_encoding_preserves_known_values_and_zero_meaning(self) -> None: value = a.Position(1, 2, symbol, extensions=a.Extensions(motion=motion)) self.assertEqual(a.parse_payload(a.serialize_payload(value)), value) + def test_phg_rate_roundtrip(self) -> None: + for rate in (0, 5): + value = a.Position( + 1, + 2, + SYMBOL, + extensions=a.Extensions(phg=a.PHG(25, 80, 3, rate_per_hour=rate)), + ) + self.assertEqual(a.parse_payload(a.serialize_payload(value)), value) + def test_unencoded_extension_fields_are_explicitly_unsupported(self) -> None: for extensions, symbol in ( - (a.Extensions(phg=a.PHG(25, 80, 3, rate_per_hour=5)), SYMBOL), - (a.Extensions(phg=a.PHG(25, 80, 3, rate_per_hour=0)), SYMBOL), ( a.Extensions( altitude=a.Altitude( @@ -302,7 +311,7 @@ def test_unencoded_extension_fields_are_explicitly_unsupported(self) -> None: with self.assertRaises(a.CodecNotImplementedError): a.serialize_payload(value) with self.assertRaises(a.CodecNotImplementedError): - a.serialize_packet(a.Packet(HEADER, value), profile="rf") + a.serialize_packet(a.Packet(HEADER, value), policy=a.RF) def test_extension_symbols_and_slots(self) -> None: storm = a.Storm( @@ -381,7 +390,7 @@ def test_compressed_layout(self) -> None: def test_mic_e_motion_and_telemetry(self) -> None: self.assertEqual( findings(a.MicE(1, 2, SYMBOL, message="en_route")), - {"$.payload.extensions.motion"}, + {"$.header.destination", "$.payload.extensions.motion"}, ) telemetry = a.Telemetry((1, 2), sequence=1, encoding="base91_comment") self.assertEqual( @@ -394,7 +403,7 @@ def test_mic_e_motion_and_telemetry(self) -> None: extensions=a.Extensions(motion=a.Motion(), telemetry=telemetry), ) ), - {"$.payload.extensions.telemetry.encoding"}, + {"$.header.destination"}, ) diff --git a/packages/aprs/tests/test_json.py b/packages/aprs/tests/test_json.py index 0eeb22e..099cf13 100644 --- a/packages/aprs/tests/test_json.py +++ b/packages/aprs/tests/test_json.py @@ -255,8 +255,8 @@ def test_shared_weather_and_telemetry(self) -> None: self.round_trip(model) self.round_trip(a.Packet(HEADER, model)) self.assertEqual(a.to_json_dict(model)["type"], tag) - with self.assertRaises(a.CodecNotImplementedError): - a.serialize_packet(a.Packet(HEADER, model)) + packet = a.Packet(HEADER, model) + self.assertEqual(a.parse_packet(a.serialize_packet(packet)), packet) extensions = a.Extensions( weather=dataclasses.replace(weather, timestamp=None), telemetry=a.Telemetry((1, 2), sequence=1, encoding="base91_comment"), @@ -267,7 +267,7 @@ def test_shared_weather_and_telemetry(self) -> None: self.assertNotIn("type", cast(dict[str, a.JSONValue], nested[field])) self.round_trip(a.Position(49, -72, a.Symbol("/", "_"), extensions=extensions)) - def test_json_does_not_require_working_wire_codec(self) -> None: + def test_json_does_not_require_encodable_header(self) -> None: mic_e = a.MicE( 49, -72, @@ -276,7 +276,7 @@ def test_json_does_not_require_working_wire_codec(self) -> None: extensions=a.Extensions(motion=a.Motion()), ) self.round_trip(mic_e) - with self.assertRaises(a.CodecNotImplementedError): + with self.assertRaises(a.FieldError): a.serialize_packet(a.Packet(HEADER, mic_e)) diff --git a/packages/aprs/tests/test_message_invariants.py b/packages/aprs/tests/test_message_invariants.py index c5b3179..764f072 100644 --- a/packages/aprs/tests/test_message_invariants.py +++ b/packages/aprs/tests/test_message_invariants.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: 2024-present Adam Fourney # SPDX-License-Identifier: MIT """Message-family constructor rules apply before the wire codecs exist.""" + import unittest from typing import Any @@ -34,8 +35,8 @@ def test_status_grid_dependencies(self) -> None: a.Status("", grid=grid, symbol=symbol, timestamp=a.Timestamp.dhm(1, 1, 2)) valid = a.Status(" House", grid=grid, symbol=symbol) self.assertEqual(a.from_json(a.to_json(valid)), valid) - with self.assertRaises(a.CodecNotImplementedError): - a.serialize_packet(a.Packet(a.Header("N0CALL", "APRS"), valid)) + packet = a.Packet(a.Header("N0CALL", "APRS"), valid) + self.assertEqual(a.parse_packet(a.serialize_packet(packet)), packet) def test_reply_ack_is_one_suffix(self) -> None: for fields in ( @@ -80,8 +81,8 @@ def test_query_tokens(self) -> None: self.assert_invalid(a.Query, fields, "query") query = a.Query("CUSTOM", arguments=b"\xff") self.assertEqual(a.from_json(a.to_json(query)), query) - with self.assertRaises(a.CodecNotImplementedError): - a.serialize_packet(a.Packet(a.Header("N0CALL", "APRS"), query)) + packet = a.Packet(a.Header("N0CALL", "APRS"), query) + self.assertEqual(a.parse_packet(a.serialize_packet(packet)), packet) with self.assertRaises(a.ModelError): a.Footprint(a.Coordinates(0, 0), -1) diff --git a/packages/aprs/tests/test_nmea_invariants.py b/packages/aprs/tests/test_nmea_invariants.py index b2a53e5..01207ae 100644 --- a/packages/aprs/tests/test_nmea_invariants.py +++ b/packages/aprs/tests/test_nmea_invariants.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: 2024-present Adam Fourney # SPDX-License-Identifier: MIT """Semantic NMEA validation applies equally to Python and JSON construction.""" + import json import unittest from typing import Any @@ -117,8 +118,8 @@ def test_usability_cannot_contradict_sentence(self) -> None: ) report = a.NMEA(valid, a.NMEAMetadata("GP"), position_usable=True) self.assertEqual(a.from_json(a.to_json(report)), report) - with self.assertRaises(a.CodecNotImplementedError): - a.serialize_packet(a.Packet(a.Header("N0CALL", "APRS"), report)) + packet = a.Packet(a.Header("N0CALL", "APRS"), report) + self.assertEqual(a.parse_packet(a.serialize_packet(packet)), packet) def test_receiver_specific_rules_are_not_invented(self) -> None: # No received precision is available to establish a speed tolerance. diff --git a/packages/aprs/tests/test_readme_examples.py b/packages/aprs/tests/test_readme_examples.py index f1ec37f..88ab8a6 100644 --- a/packages/aprs/tests/test_readme_examples.py +++ b/packages/aprs/tests/test_readme_examples.py @@ -47,14 +47,18 @@ def setUpClass(cls) -> None: raise AssertionError("Only one JSON input per block") cls.examples.append( ( - "json" - if literals - else ( - "continuation" - if source[2] == "print(aprs.to_json(packet, indent=2))" - else "repair" - if source[2].startswith("import copy\n") - else "python" + ( + "json" + if literals + else ( + "continuation" + if source[2] == "print(aprs.to_json(packet, indent=2))" + else ( + "repair" + if source[2].startswith("import copy\n") + else "python" + ) + ) ), literals[0] if literals else source[2], source[2], @@ -180,16 +184,12 @@ def test_every_family_has_equivalent_python_and_json_construction(self) -> None: dataclasses.asdict(python_packet), dataclasses.asdict(json_packet) ) families.add(type(json_packet.payload)) - # Model-only examples really are unencodable. Working ones must emit - # the displayed TNC2 line, not a hypothetical future encoding. - if a.codec_support_for(json_packet.payload).encode == "unimplemented": - with self.assertRaises(a.CodecNotImplementedError): - a.serialize_packet(json_packet) - else: - self.assertEqual( - a.serialize_packet(json_packet).decode("utf-8") + "\n", - self.examples[index][3], - ) + wire = a.serialize_packet(json_packet) + # Construction examples print the model name; wire examples print + # the encoded line. Both must be valid compositions now. + if self.examples[index][3] != type(json_packet.payload).__name__ + "\n": + self.assertEqual(wire.decode("utf-8") + "\n", self.examples[index][3]) + self.assertEqual(families, set(get_args(a.Payload))) def test_successful_parsing_shows_both_object_and_pretty_json(self) -> None: diff --git a/packages/aprs/tests/test_recovery.py b/packages/aprs/tests/test_recovery.py index 2d79f81..7ec50c8 100644 --- a/packages/aprs/tests/test_recovery.py +++ b/packages/aprs/tests/test_recovery.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: MIT """Received input: lenient where usable, Malformed only where undecodable.""" + import copy import dataclasses import json @@ -57,17 +58,17 @@ def test_out_of_spec_but_usable_packets_still_decode(self) -> None: with self.assertRaises(a.ConformanceError): a.serialize_packet(packet) - def test_rf_profile_reports_instead_of_rejecting(self) -> None: + def test_rf_policy_reports_instead_of_rejecting(self) -> None: raw = b"n0call>APRS,A,B,C,D,E,F,G,H,I:>" + b"x" * 10 - packet = a.parse_packet(raw, profile="rf") + packet = a.parse_packet(raw, policy=a.RF) assert isinstance(packet, a.Packet) self.assertEqual( codes(packet), {("nonconforming", "$.header.source"), ("nonconforming", "$.header.path")}, ) - monitor = a.parse_packet(raw) - assert isinstance(monitor, a.Packet) - self.assertEqual(monitor.diagnostics, ()) + internet = a.parse_packet(raw) + assert isinstance(internet, a.Packet) + self.assertEqual(internet.diagnostics, ()) def test_extensions_leave_the_comment(self) -> None: raw = b"N0CALL>APRS:!4903.50N/07201.75W>088/036/A=001234 hi" @@ -91,7 +92,7 @@ def test_invalid_extension_text_stays_comment_with_a_finding(self) -> None: with self.assertRaises(a.ConformanceError): a.serialize_packet(packet) - def test_recognized_but_undecoded_extensions_are_unsupported(self) -> None: + def test_recognized_extensions_decode(self) -> None: for information in ( b"!4903.50N/07201.75W>hi !W12!", b"!4903.50N/07201.75W>|!!!!|", @@ -101,9 +102,8 @@ def test_recognized_but_undecoded_extensions_are_unsupported(self) -> None: with self.subTest(information=information): packet = a.parse_packet(b"N0CALL>APRS:" + information) assert isinstance(packet, a.Packet) - self.assertIsInstance(packet.payload, a.Opaque) - with self.assertRaises(a.CodecNotImplementedError): - a.parse_packet(b"N0CALL>APRS:" + information, unsupported="raise") + self.assertIsInstance(packet.payload, a.Position) + self.assertEqual(a.parse_packet(a.serialize_packet(packet)), packet) def test_invalid_df_bearing_is_inspectable_but_not_sendable(self) -> None: raw = b"N0CALL>APRS:!4903.50N/07201.75W\\088/036/999/729" @@ -115,10 +115,10 @@ def test_invalid_df_bearing_is_inspectable_but_not_sendable(self) -> None: self.assertEqual(packet.payload.extensions.motion, a.Motion(88, 36)) self.assertIsNone(packet.payload.extensions.bearing) self.assertEqual(codes(packet), {("nonconforming", "$.payload.comment")}) - for profile in ("monitor", "rf"): - self.assertTrue(a.check_packet(packet, profile=profile)) # type: ignore[arg-type] + for policy in (a.APRS_IS, a.RF): + self.assertTrue(a.check_packet(packet, policy=policy)) with self.assertRaises(a.ConformanceError): - a.serialize_packet(packet, profile=profile) # type: ignore[arg-type] + a.serialize_packet(packet, policy=policy) class MalformedTests(unittest.TestCase): @@ -205,17 +205,15 @@ def test_binary_is_lossless(self) -> None: self.assertEqual(a.from_json(a.to_json(binary)), binary) def test_unknown_codec_is_not_a_malformed_diagnosis(self) -> None: - for raw in ( - b"N0CALL>APRS:_not-yet-interpreted", - b"N0CALL>APRS:T#incomplete", - b"N0CALL>APRS:~\xff", - ): + for raw in (b"N0CALL>APRS:~\xff",): result = a.parse_packet(raw) assert isinstance(result, a.Packet) assert isinstance(result.payload, a.Opaque) self.assertEqual(a.serialize_packet(result), raw) with self.assertRaises(a.CodecNotImplementedError): a.parse_packet(raw, unsupported="raise") + for raw in (b"N0CALL>APRS:_not-a-timestamp", b"N0CALL>APRS:T#incomplete"): + self.assertIsInstance(a.parse_packet(raw), a.Malformed) result = a.parse_packet(b">490S5P:`12345678") assert isinstance(result, a.Malformed) self.assertEqual( diff --git a/packages/aprs/tests/test_vector_corpus_contract.py b/packages/aprs/tests/test_vector_corpus_contract.py new file mode 100644 index 0000000..d9d4bad --- /dev/null +++ b/packages/aprs/tests/test_vector_corpus_contract.py @@ -0,0 +1,169 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Fixture provenance and regression guards, independent of codec progress.""" + +from __future__ import annotations + +import json +from dataclasses import replace +from pathlib import Path +from typing import Any + +import pytest +from generate_vectors import records +from packets.test_corpus import check, differences + +from hamkit import aprs as a + +VECTORS = Path(__file__).parent / "vectors" + + +def all_rows() -> list[dict[str, Any]]: + return [ + json.loads(line) + for file in sorted(VECTORS.glob("*.jsonl")) + for line in file.read_text().splitlines() + ] + + +def test_complete_source_extraction() -> None: + rows = all_rows() + assert len(list(VECTORS.glob("*.jsonl"))) == 18 + assert len(rows) == 1564 # 1,541 individual packets + 23 sequence occurrences. + assert len({row["id"] for row in rows}) == len(rows) + assert sorted(rows, key=lambda r: r["id"]) == sorted( + records(), key=lambda r: r["id"] + ) + assert len({row.get("sequence", row["id"]) for row in rows}) == 1548 + + +def test_comparator_checks_missing_null_lists_and_tolerances() -> None: + assert differences({}, {"x": None}) + assert differences([1], [1, 2]) + assert differences(True, 1) + assert differences(1.0, 1.001, "$.latitude_deg") + assert not differences(1.0, 1.0000000001, "$.latitude_deg") + + +def test_mismatch_cannot_be_hidden(monkeypatch: pytest.MonkeyPatch) -> None: + row = next(r for r in all_rows() if r["id"] == "STA-008") + check(row) + packet = a.parse_packet(row["packet"].encode("latin-1")) + assert isinstance(packet, a.Packet) + bad = replace(packet, header=a.Header("WRONG", "APRS")) + monkeypatch.setattr(a, "parse_packet", lambda *args, **kwargs: bad) + with pytest.raises(AssertionError, match="header.source"): + check(row) + + +def test_parser_exception_is_not_an_expected_failure( + monkeypatch: pytest.MonkeyPatch, +) -> None: + row = next(r for r in all_rows() if r["id"] == "MIC-001") + + def broken(*args: Any, **kwargs: Any) -> Any: + raise RuntimeError("unexpected parser crash") + + monkeypatch.setattr(a, "parse_packet", broken) + with pytest.raises(RuntimeError, match="unexpected parser crash"): + check(row) + + +def test_projection_keys_belong_to_public_json_models() -> None: + """Catch adapter typos and invalid enum values, even for missing codecs.""" + import dataclasses + import types + from typing import Literal, Union, get_args, get_origin, get_type_hints + + from hamkit.aprs._json import _SCHEMAS + + tags = {schema.tag: schema.model for schema in _SCHEMAS} + + def validate(value: Any, annotation: Any, path: str) -> None: + if value is None: + return + model: Any + origin, args = get_origin(annotation), get_args(annotation) + # Enforce enums only where every non-null option is a Literal. + options = args if origin in (Union, types.UnionType) else (annotation,) + options = tuple(t for t in options if t is not type(None)) + if options and all(get_origin(t) is Literal for t in options): + allowed = [v for t in options for v in get_args(t)] + assert value in allowed, (path, value, allowed) + return + if isinstance(value, dict): + if "type" in value: + assert value["type"] in tags, (path, value["type"]) + model = tags[value["type"]] + elif origin in (Union, types.UnionType): + models = [ + t + for t in args + if isinstance(t, type) and dataclasses.is_dataclass(t) + ] + if len(models) != 1: + return + model = models[0] + else: + model = annotation + if not isinstance(model, type) or not dataclasses.is_dataclass(model): + return + hints = get_type_hints(model) + assert set(value) <= hints.keys() | {"type"}, ( + path, + set(value) - hints.keys(), + ) + for key, child in value.items(): + if key != "type": + validate(child, hints[key], f"{path}.{key}") + elif isinstance(value, list) and origin is tuple: + for child in value: + validate(child, args[0], path + "[]") + + for row in all_rows(): + if row["expected"] is not None: + validate(row["expected"], a.Packet, row["id"]) + + +# Source cases added after the PR #4 freeze (see the corpus amendment note). +AMENDED_IDS = {"WX-067", "WX-068", "WX-069"} + + +def test_original_vector_bytes_expectations_and_provenance_are_unchanged() -> None: + """Frozen at PR #4 head b97beb7970c6b6fec2c0b6e30200f348bb87d96c. + + Later source amendments are frozen separately, so the original digest keeps + proving that no original vector changed. + """ + import hashlib + + keys = [ + "id", + "title", + "profile", + "source", + "packet", + "outcome", + "source_expected", + "options", + "note", + "scope_note", + "extension_tags", + "sequence", + ] + + def digest(rows: list[dict[str, Any]]) -> str: + frozen = [{k: r[k] for k in keys if k in r} for r in rows] + encoded = json.dumps(frozen, sort_keys=True, separators=(",", ":")).encode() + return hashlib.sha256(encoded).hexdigest() + + rows = all_rows() + assert {r["id"] for r in rows} >= AMENDED_IDS + assert ( + digest([r for r in rows if r["id"] not in AMENDED_IDS]) + == "2db005c07f133aa738ccf3ec65b6364bf57d48cceff447a72c63e659c612573e" + ) + assert ( + digest([r for r in rows if r["id"] in AMENDED_IDS]) + == "54b230e42653249842ec4c1143ad4f618c66eeba967366446944d3fd45a412db" + ) diff --git a/packages/aprs/tests/test_vector_schema_migration.py b/packages/aprs/tests/test_vector_schema_migration.py new file mode 100644 index 0000000..941c839 --- /dev/null +++ b/packages/aprs/tests/test_vector_schema_migration.py @@ -0,0 +1,224 @@ +# SPDX-FileCopyrightText: 2024-present Adam Fourney +# SPDX-License-Identifier: MIT +"""Stored expectations preserve source information without runtime reshaping.""" + +import copy + +import pytest +from generate_vectors import records +from packets.test_corpus import check, rows + +from hamkit import aprs as a + +ROWS = rows() +FAP_ACCEPTED = [ + row + for row in ROWS + if row["profile"] == "compatibility-fap" and row["outcome"] == "accept" +] +WEATHER = [ + row + for row in FAP_ACCEPTED + if row["source_expected"]["fap_fields"]["Wx"] is not None + # FAP-465 diverges: its weather symbol carries no weather fields. + and row["id"] != "FAP-465" +] +NMEA = [ + row + for row in FAP_ACCEPTED + if row["source_expected"]["fap_fields"]["Format"] == "nmea" + # FAP-362 diverges: an incomplete GLL sentence is Malformed. + and row["expected"].get("type") != "malformed" +] +LEGACY = [ + row + for row in ROWS + if row["expected"].get("payload", {}).get("type") == "legacy_position" +] + + +def test_regeneration_does_not_consult_decoders(monkeypatch): + from hamkit.aprs import _codec + + def forbidden(*args, **kwargs): + raise AssertionError("Expectations must come from source assertions") + + for module in (a, _codec): + for name in ("parse_packet", "parse_payload"): + monkeypatch.setattr(module, name, forbidden) + assert sorted(records(), key=lambda row: row["id"]) == sorted( + ROWS, key=lambda row: row["id"] + ) + + +@pytest.mark.parametrize("row", WEATHER, ids=lambda row: row["id"]) +def test_weather_expectations_preserve_physical_measurements(row): + """Convert stored measurements BACK to the captured source units.""" + fields = row["source_expected"]["fap_fields"] + expected = row["expected"]["payload"] + if expected["type"] == "raw_weather": + assert expected["information"] == row["packet"].partition(":")[2] + assert expected["format"] == "ultimeter_2000" + weather = expected["weather"] + elif expected["type"] == "weather": + weather = expected + else: + weather = expected["extensions"]["weather"] + for source, target in ( + ("WindDirection", "wind_direction"), + ("WindSpeed", "wind_speed"), + ("WindGust", "gust"), + ("Temp", "temperature"), + ("Humidity", "humidity"), + ("Pressure", "pressure"), + ("Rain1h", "rain_1h"), + ("Rain24h", "rain_24h"), + ("RainMidnight", "rain_since_midnight"), + ("Snow24h", "snow_24h"), + ("Luminosity", "luminosity"), + ("Radiation", "radiation"), + ("BatteryVoltage", "battery_voltage"), + ): + original = fields["Wx"][source] + if original is None: + continue + if target not in weather and "divergence" in row: + continue # A reviewed divergence reads this field differently. + reading = weather[target] + value, unit = reading["value"], reading["unit"] + if source in ("WindSpeed", "WindGust"): + # Only a reviewed divergence may keep the disputed unit. + if unit == "disputed_knots_or_mph" and "divergence" in row: + unit = "mph" + assert unit in ("mph", "m/s") + value = value * 0.44704 if unit == "mph" else value + elif source == "Temp": + assert unit in ("fahrenheit", "celsius") + value = (value - 32) / 1.8 if unit == "fahrenheit" else value + elif source.startswith("Rain") or source == "Snow24h": + assert unit in ("inches", "mm") + value = value * 25.4 if unit == "inches" else value + else: + assert ( + unit + == { + "WindDirection": "degrees", + "Humidity": "percent", + "Pressure": "hPa", + "Luminosity": "W/m2", + "Radiation": "nSv/h", + "BatteryVoltage": "volts", + }[source] + ) + assert value == pytest.approx(original, abs=1e-12, rel=1e-12) + if fields["Format"] == "compressed": + assert "motion" not in expected["extensions"] + assert weather["wind_direction"] == { + "value": fields["Course"], + "unit": "degrees", + } + assert weather["wind_speed"]["unit"] == "knots" + assert weather["wind_speed"]["value"] * 1.852 == pytest.approx( + fields["Speed"], abs=1e-12 + ) + if fields["Wx"]["WaterLevel"] is not None: + height = weather["water_height"]["measurement"] + assert height["unit"] == "feet" + assert height["value"] * 0.3048 == pytest.approx(fields["Wx"]["WaterLevel"]) + # Indoor readings have no model field and remain source provenance. + for field in ("TempIn", "HumidityIn"): + assert f"$.fap_fields.Wx.{field}" in row["unmapped"] + + +@pytest.mark.parametrize("row", NMEA, ids=lambda row: row["id"]) +def test_nmea_observations_are_stored_in_typed_fields(row): + source = row["source_expected"]["fap_fields"] + payload = row["expected"]["payload"] + sentence = payload["sentence"] + assert sentence["coordinates"] == { + "latitude_deg": source["Latitude"], + "longitude_deg": source["Longitude"], + } + if source["Speed"] is not None: + assert sentence["speed_knots"] * 1.852 == pytest.approx( + source["Speed"], abs=1e-12 + ) + diverged = "divergence" in row # Course precision and default symbol. + if source["Course"] is not None: + assert sentence["course_deg"] == pytest.approx( + source["Course"], abs=0.5 if diverged else 0 + ) + if source["Altitude"] is not None: + assert sentence["altitude_msl_m"] == source["Altitude"] + assert diverged or payload["symbol"] is None + assert source["SymbolTable"] is None and source["SymbolCode"] is None + assert payload["metadata"]["checksum_valid"] == source["ChecksumOK"] + # The source did not assert these sentence fields. Never invent them to make + # an incomplete historical GLL report into a constructible public model. + assert "time_utc" not in sentence and "fix_status" not in sentence + + +@pytest.mark.parametrize("row", LEGACY, ids=lambda row: row["id"]) +def test_legacy_wrappers_preserve_position_values_and_comment(row): + expected = row["expected"]["payload"] + assert ( + expected["prefix"] + "!" + == row["packet"].partition(":")[2].partition("!")[0] + "!" + ) + position = expected["position"] + source = row["source_expected"] + if row["profile"] == "compatibility-fap": + fields = source["fap_fields"] + assert position["latitude_deg"] == fields["Latitude"] + assert position["longitude_deg"] == fields["Longitude"] + assert position["comment"] == fields["Comment"] + else: + assert position["latitude_deg"] == source["position"]["latitude_deg"] + assert position["longitude_deg"] == source["position"]["longitude_deg"] + assert position["comment"] == source["comment"] + + +@pytest.mark.parametrize("identifier", ["FAP-032", "FAP-357", "FAP-406", "FAP-491"]) +def test_migrated_values_are_asserted_not_only_archived(identifier): + row = copy.deepcopy(next(r for r in ROWS if r["id"] == identifier)) + payload = row["expected"]["payload"] + if identifier == "FAP-032": + payload["extensions"]["weather"]["wind_direction"]["value"] += 1 + elif identifier == "FAP-357": + assert payload["sentence"]["course_deg"] == 27.9 # FAP reports 28. + payload["sentence"]["course_deg"] = 28 + elif identifier == "FAP-406": + payload["position"]["latitude_deg"] += 1 + else: + payload["weather"]["temperature"]["value"] += 1 + with pytest.raises(AssertionError): + check(row) + + +def test_conflicting_modern_beacon_interpretation_is_not_rewritten(): + for identifier in ("OTH-033", "OTH-035"): + row = next(r for r in ROWS if r["id"] == identifier) + assert row["expected"]["payload"] == { + "type": "beacon", + "text": row["source_expected"]["raw_text"], + } + + +@pytest.mark.parametrize("identifier", ["FAP-005", "FAP-036", "FAP-345", "FAP-346"]) +def test_mic_e_device_field_preserves_captured_comment(identifier): + row = next(r for r in ROWS if r["id"] == identifier) + payload = row["expected"]["payload"] + # The type byte begins the status text and any version suffix ends it. + head, suffix = payload["device_code"][0], payload["device_code"][1:] + assert head == row["packet"].partition(":")[2][9] + assert ( + head + payload["comment"] + suffix + == row["source_expected"]["fap_fields"]["Comment"] + ) + + +def test_corrupted_mic_e_is_not_repaired(): + row = next(r for r in ROWS if r["id"] == "FAP-349") + assert row["options"]["accept_broken_mice"] + assert row["expected"] == {"original_wire": row["packet"], "type": "malformed"} + assert row["divergence"] diff --git a/packages/aprs/tests/test_weather_invariants.py b/packages/aprs/tests/test_weather_invariants.py index 51cb9a4..22984c8 100644 --- a/packages/aprs/tests/test_weather_invariants.py +++ b/packages/aprs/tests/test_weather_invariants.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: 2024-present Adam Fourney # SPDX-License-Identifier: MIT """Weather and telemetry values: absence, units and channel shapes.""" + from __future__ import annotations import unittest @@ -20,7 +21,7 @@ def test_components_absence_unavailability_and_zero(self) -> None: packet = a.Packet(a.Header("N0CALL", "APRS"), empty) self.assertEqual(a.from_json(a.to_json(packet)), packet) self.assertTrue(a.check_packet(packet)) - with self.assertRaises(a.CodecNotImplementedError): + with self.assertRaises(a.ConformanceError): a.serialize_packet(packet) def test_units_describe_the_quantity(self) -> None: diff --git a/packages/aprs/tests/vectors/README.md b/packages/aprs/tests/vectors/README.md new file mode 100644 index 0000000..800810a --- /dev/null +++ b/packages/aprs/tests/vectors/README.md @@ -0,0 +1,92 @@ +# Documented APRS vectors + +These 18 JSONL files retain all 1,541 individual packets and 23 sequence +occurrences from [edition 1](../../docs/APRS_COMPLIANCE_VECTORS.md): 1,564 rows and +1,548 case IDs. Every raw TNC2 byte, source expectation, receiver option and +provenance field of the original 1,561 rows is unchanged from PR #4. A frozen +integrity test protects that requirement, independently of regeneration; the +three cases added by the corpus amendment (WX-067–WX-069) are frozen separately. + +Run from the repository root: + +```sh +python -m pytest packages/aprs/tests -q +python packages/aprs/tests/generate_vectors.py +``` + +The generator translates source assertions, never parser output. The translated +expectations are stored in these JSONL files; comparisons do not convert them +back to the source schema. Schema changes include units/enums, explicit absence, +telemetry channel padding, structured query responses and typed NMEA sentences. +`packet` is a Latin-1 byte carrier: +use `packet.encode("latin-1")`, including for control/high-bit bytes. + +`expected` is a subset of the public JSON representation. Missing keys make no +assertion; explicit nulls do. `source_expected` preserves the original assertions. +`unmapped` lists source paths outside the JSON projection. For core rows, +`source_details.py` checks every such path using models, evidence or derived +properties, and core rejection cases also check retained headers and partial +observations. For FAP rows, unmapped paths are FAP's own output fields and are +kept as provenance only (PHG rows still check theirs from public models). Error +wording is represented by the public diagnostic scheme rather than copied +verbatim. + +Every row compares `parse_packet` output with `expected` directly; there is +no receiver-emulation layer. FAP's own extra fields stay in `source_expected` as +provenance and are not asserted. + +Where FAP's interpretation differs from the public decoder's, and the public +one follows the specification, `tests/fap_divergences.json` replaces the +FAP-derived expectation. Each override names its reasons: comment whitespace +kept as transmitted, callsign case, compressed course 0, disputed wind units, +NMEA default symbols and precision, packets FAP refuses but the specification +allows, Mic-E type codes, a corrupted Mic-E packet that FAP repairs, invalid +timestamps and incomplete GLL or telemetry that FAP accepts, short telemetry +FAP pads, and an `O` token FAP skips in weather reports. The +generator applies the overrides, copies the reasons into the row's +`divergence` field and leaves `outcome` and `source_expected` as FAP captured +them. Historical and FAP rows parse with `legacy_positions=True`, since those +receivers search other text for an embedded `!` position. + +The schema migration rewrote 35 stored expectations (33 FAP and two historical +position cases): equivalent weather units, compressed weather wind nesting, +`LegacyPosition`/`RawWeather` wrappers, four flattened NMEA observations, and four Mic-E device markers split from comments. +Offline conversion tests reverse unit changes back to the captured measurements +and verify stored fields against source values. The original `source_expected` +snapshots remain immutable provenance; their supplemental observations without +public model fields remain explicitly asserted, not discarded or silently added +to the packet schema. + +All 29 PHG/PHGR projections (including 15 FAP vectors) exercise the public +API directly. Their comment separators, whitespace, and numeric/alphabetic rates are +handled by the public codec. FAP's legacy-position wrapper and omitted trailing +telemetry channels are expressed using the existing JSON schema; original source +values remain unchanged and are also checked. + +Sequence rows contain `state_expected` and run all preceding steps through a test +receiver implemented using public packet models. State is not added to the codec. + +All 1,564 rows pass without xfails. Every row also participates in encoding tests: +1,305 semantic round trips under an explicit permissive envelope policy +(`EnvelopePolicy(".*", ".*", ".*")`), and 259 explicit malformed/conformance +refusals. Three intentionally bad NMEA checksums are refused until explicitly +repaired, then round-trip. The reviewed +`../roundtrip_exceptions.json` records exact reasons. Adding a new unexpected +refusal or silently fixing a recorded one fails the test; this file is not +regenerated by `generate_vectors.py`. + +The new default `APRS_IS` policy additionally refuses serialization for 15 of +those round-trippable packets because of their address formats (including SSID +`-0`). The tests assert those refusals separately and validate the other 1,290 +under the default policy. +This preserves the source vectors while exercising both representation and +transport constraints through the public API. + +Round-trip tests remove all evidence fields before serialization, check semantic +fields at wire precision, and require canonical bytes to stabilize. Raw wrappers +retain `information` because it is their semantic content. JSON round trips are +also checked for every input, including `Malformed` results. + +Tests and fixtures are repository resources, not runtime package data. The CI +workflow tests source and a freshly installed wheel. Pinned FAP provenance and +licensing attribution remain in the unchanged source document. diff --git a/packages/aprs/tests/vectors/bad.jsonl b/packages/aprs/tests/vectors/bad.jsonl new file mode 100644 index 0000000..073ddd0 --- /dev/null +++ b/packages/aprs/tests/vectors/bad.jsonl @@ -0,0 +1,125 @@ +{"id":"BAD-001","title":"empty-input","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"","outcome":"reject-envelope","source_expected":{"error_class":"empty-input"},"expected":{"original_wire":""},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-002","title":"missing-payload-separator","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0CALL>APRS","outcome":"reject-envelope","source_expected":{"error_class":"missing-payload-separator"},"expected":{"original_wire":"N0CALL>APRS"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-003","title":"missing-address-separator","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0CALL:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"missing-address-separator"},"expected":{"original_wire":"N0CALL:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-004","title":"empty-source","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":">APRS:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"empty-source"},"expected":{"original_wire":">APRS:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-005","title":"empty-destination","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0CALL>:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"empty-destination"},"expected":{"original_wire":"N0CALL>:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-006","title":"empty-information","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0CALL>APRS:","outcome":"reject-envelope","source_expected":{"error_class":"empty-information"},"expected":{"original_wire":"N0CALL>APRS:"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-007","title":"empty-path-component","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0CALL>APRS,,WIDE2-1:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"empty-path-component"},"expected":{"original_wire":"N0CALL>APRS,,WIDE2-1:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-008","title":"empty-path-address","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0CALL>APRS,*:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"empty-path-address"},"expected":{"original_wire":"N0CALL>APRS,*:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-009","title":"rf-path-too-long","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0CALL>APRS,D1,D2,D3,D4,D5,D6,D7,D8,D9:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"rf-path-too-long"},"expected":{"original_wire":"N0CALL>APRS,D1,D2,D3,D4,D5,D6,D7,D8,D9:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-010","title":"rf-ssid-out-of-range","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0CALL-16>APRS:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"rf-ssid-out-of-range"},"expected":{"original_wire":"N0CALL-16>APRS:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-011","title":"rf-ssid-out-of-range","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0CALL>APRS-16:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"rf-ssid-out-of-range"},"expected":{"original_wire":"N0CALL>APRS-16:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-012","title":"rf-callsign-too-long","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"TOOLONG>APRS:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"rf-callsign-too-long"},"expected":{"original_wire":"TOOLONG>APRS:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-013","title":"rf-callsign-character","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0_CALL>APRS:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"rf-callsign-character"},"expected":{"original_wire":"N0_CALL>APRS:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-014","title":"extra-address-separator","profile":"strict-envelope","source":"APRS101 pp. 12,84; FAP header tests","packet":"N0CALL>>APRS:>Ready","outcome":"reject-envelope","source_expected":{"error_class":"extra-address-separator"},"expected":{"original_wire":"N0CALL>>APRS:>Ready"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-015","title":"latitude-out-of-range","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!9100.00N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"latitude-out-of-range","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!9100.00N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-016","title":"beyond-north-pole","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!9000.01N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"beyond-north-pole","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!9000.01N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-017","title":"latitude-minutes-60","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!4960.00N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"latitude-minutes-60","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4960.00N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-018","title":"longitude-out-of-range","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!4903.50N/18100.00W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"longitude-out-of-range","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/18100.00W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-019","title":"beyond-antimeridian","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!4903.50N/18000.01W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"beyond-antimeridian","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/18000.01W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-020","title":"longitude-minutes-60","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!4903.50N/07260.00W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"longitude-minutes-60","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/07260.00W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-021","title":"bad-latitude-hemisphere","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!4903.50X/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"bad-latitude-hemisphere","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50X/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-022","title":"bad-longitude-hemisphere","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!4903.50N/07201.75X-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"bad-longitude-hemisphere","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/07201.75X-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-023","title":"bad-decimal-separator","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!4903,50N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"bad-decimal-separator","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903,50N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-024","title":"interior-ambiguity-hole","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!490 .50N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"interior-ambiguity-hole","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!490 .50N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-025","title":"longitude-more-ambiguous-than-latitude","profile":"strict-validation","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!4903.50N/07201. W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"longitude-more-ambiguous-than-latitude","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/07201. W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-026","title":"Truncated uncompressed position 0","profile":"strict-validation","source":"APRS101 pp. 24,32","packet":"N0CALL>APRS:!","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-027","title":"Truncated uncompressed position 1","profile":"strict-validation","source":"APRS101 pp. 24,32","packet":"N0CALL>APRS:!4","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-028","title":"Truncated uncompressed position 7","profile":"strict-validation","source":"APRS101 pp. 24,32","packet":"N0CALL>APRS:!4903.50","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-029","title":"Truncated uncompressed position 8","profile":"strict-validation","source":"APRS101 pp. 24,32","packet":"N0CALL>APRS:!4903.50N","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50N"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-030","title":"Truncated uncompressed position 9","profile":"strict-validation","source":"APRS101 pp. 24,32","packet":"N0CALL>APRS:!4903.50N/","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-031","title":"Truncated uncompressed position 17","profile":"strict-validation","source":"APRS101 pp. 24,32","packet":"N0CALL>APRS:!4903.50N/07201.75","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/07201.75"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-032","title":"Truncated uncompressed position 18","profile":"strict-validation","source":"APRS101 pp. 24,32","packet":"N0CALL>APRS:!4903.50N/07201.75W","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/07201.75W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-033","title":"Invalid extension-looking comment 361/010","profile":"strict-validation","source":"APRS101 pp. 20,26-30","packet":"N0CALL>APRS:!4903.50N/07201.75W>361/010","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"361/010"},"note":"The underlying position remains valid. The extension syntax/range is invalid or undefined. This corpus preserves those bytes as comment and exposes no fabricated movement/altitude/range; a receiver may additionally report an invalid-extension warning.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"361/010","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"BAD-034","title":"Invalid extension-looking comment 088/-01","profile":"strict-validation","source":"APRS101 pp. 20,26-30","packet":"N0CALL>APRS:!4903.50N/07201.75W>088/-01","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"088/-01"},"note":"The underlying position remains valid. The extension syntax/range is invalid or undefined. This corpus preserves those bytes as comment and exposes no fabricated movement/altitude/range; a receiver may additionally report an invalid-extension warning.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"088/-01","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"BAD-035","title":"Invalid extension-looking comment 088/ABC","profile":"strict-validation","source":"APRS101 pp. 20,26-30","packet":"N0CALL>APRS:!4903.50N/07201.75W>088/ABC","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"088/ABC"},"note":"The underlying position remains valid. The extension syntax/range is invalid or undefined. This corpus preserves those bytes as comment and exposes no fabricated movement/altitude/range; a receiver may additionally report an invalid-extension warning.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"088/ABC","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"BAD-036","title":"Invalid extension-looking comment PHG7/20","profile":"strict-validation","source":"APRS101 pp. 20,26-30","packet":"N0CALL>APRS:!4903.50N/07201.75W>PHG7/20","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"PHG7/20"},"note":"The underlying position remains valid. The extension syntax/range is invalid or undefined. This corpus preserves those bytes as comment and exposes no fabricated movement/altitude/range; a receiver may additionally report an invalid-extension warning.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"PHG7/20","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"BAD-037","title":"Invalid extension-looking comment PHG5139","profile":"strict-validation","source":"APRS101 pp. 20,26-30","packet":"N0CALL>APRS:!4903.50N/07201.75W>PHG5139","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"PHG5139"},"note":"The underlying position remains valid. The extension syntax/range is invalid or undefined. This corpus preserves those bytes as comment and exposes no fabricated movement/altitude/range; a receiver may additionally report an invalid-extension warning.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"PHG5139","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"BAD-038","title":"Invalid extension-looking comment RNG00A0","profile":"strict-validation","source":"APRS101 pp. 20,26-30","packet":"N0CALL>APRS:!4903.50N/07201.75W>RNG00A0","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"RNG00A0"},"note":"The underlying position remains valid. The extension syntax/range is invalid or undefined. This corpus preserves those bytes as comment and exposes no fabricated movement/altitude/range; a receiver may additionally report an invalid-extension warning.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"RNG00A0","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"BAD-039","title":"Invalid extension-looking comment /A=12345","profile":"strict-validation","source":"APRS101 pp. 20,26-30","packet":"N0CALL>APRS:!4903.50N/07201.75W>/A=12345","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"/A=12345"},"note":"The underlying position remains valid. The extension syntax/range is invalid or undefined. This corpus preserves those bytes as comment and exposes no fabricated movement/altitude/range; a receiver may additionally report an invalid-extension warning.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"/A=12345","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"BAD-040","title":"Invalid extension-looking comment /A=12A456","profile":"strict-validation","source":"APRS101 pp. 20,26-30","packet":"N0CALL>APRS:!4903.50N/07201.75W>/A=12A456","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"/A=12A456"},"note":"The underlying position remains valid. The extension syntax/range is invalid or undefined. This corpus preserves those bytes as comment and exposes no fabricated movement/altitude/range; a receiver may additionally report an invalid-extension warning.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"/A=12A456","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"BAD-041","title":"Truncated compressed position 0","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-042","title":"Truncated compressed position 1","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-043","title":"Truncated compressed position 2","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-044","title":"Truncated compressed position 3","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5L","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5L"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-045","title":"Truncated compressed position 4","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5L!","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5L!"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-046","title":"Truncated compressed position 5","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5L!!","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5L!!"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-047","title":"Truncated compressed position 6","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5L!!<","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5L!!<"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-048","title":"Truncated compressed position 7","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5L!!<*","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5L!!<*"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-049","title":"Truncated compressed position 8","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5L!!<*e","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5L!!<*e"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-050","title":"Truncated compressed position 9","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5L!!<*e7","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5L!!<*e7"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-051","title":"Truncated compressed position 10","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5L!!<*e7>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5L!!<*e7>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-052","title":"Truncated compressed position 11","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5L!!<*e7>7","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5L!!<*e7>7"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-053","title":"Truncated compressed position 12","profile":"strict-validation","source":"APRS101 p. 37","packet":"N0CALL>APRS:!/5L!!<*e7>7P","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-compressed-position","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/5L!!<*e7>7P"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-054","title":"Compressed invalid byte 1 20","profile":"strict-validation","source":"APRS101 pp. 37-40","packet":"N0CALL>APRS:!/ L!!<*e7>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-compressed-character","position_usable":false},"note":"Base-91 digits are 0..90 => ASCII !..{. The p.20 mention of | is an off-by-one inconsistency; see register.","expected":{"original_wire":"N0CALL>APRS:!/ L!!<*e7>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-055","title":"Compressed invalid byte 2 7c","profile":"strict-validation","source":"APRS101 pp. 37-40","packet":"N0CALL>APRS:!/5|!!<*e7>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-compressed-character","position_usable":false},"note":"Base-91 digits are 0..90 => ASCII !..{. The p.20 mention of | is an off-by-one inconsistency; see register.","expected":{"original_wire":"N0CALL>APRS:!/5|!!<*e7>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-056","title":"Compressed invalid byte 3 7d","profile":"strict-validation","source":"APRS101 pp. 37-40","packet":"N0CALL>APRS:!/5L}!<*e7>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-compressed-character","position_usable":false},"note":"Base-91 digits are 0..90 => ASCII !..{. The p.20 mention of | is an off-by-one inconsistency; see register.","expected":{"original_wire":"N0CALL>APRS:!/5L}!<*e7>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-057","title":"Compressed invalid byte 5 00","profile":"strict-validation","source":"APRS101 pp. 37-40","packet":"N0CALL>APRS:!/5L!!\u0000*e7>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-compressed-character","position_usable":false},"note":"Base-91 digits are 0..90 => ASCII !..{. The p.20 mention of | is an off-by-one inconsistency; see register.","expected":{"original_wire":"N0CALL>APRS:!/5L!!\u0000*e7>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-058","title":"Compressed invalid byte 11 7c","profile":"strict-validation","source":"APRS101 pp. 37-40","packet":"N0CALL>APRS:!/5L!!<*e7>7|[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-compressed-character","position_usable":false},"note":"Base-91 digits are 0..90 => ASCII !..{. The p.20 mention of | is an off-by-one inconsistency; see register.","expected":{"original_wire":"N0CALL>APRS:!/5L!!<*e7>7|["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-059","title":"Compressed invalid byte 12 7f","profile":"strict-validation","source":"APRS101 pp. 37-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P\u007f","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-compressed-character","position_usable":false},"note":"Base-91 digits are 0..90 => ASCII !..{. The p.20 mention of | is an off-by-one inconsistency; see register.","expected":{"original_wire":"N0CALL>APRS:!/5L!!<*e7>7P\u007f"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-060","title":"Invalid compressed table 0","profile":"strict-validation","source":"APRS101 pp. 37,91","packet":"N0CALL>APRS:!05L!!<*e7>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-position-layout","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!05L!!<*e7>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-061","title":"Invalid compressed table 9","profile":"strict-validation","source":"APRS101 pp. 37,91","packet":"N0CALL>APRS:!95L!!<*e7>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-position-layout","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!95L!!<*e7>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-062","title":"Invalid compressed table k","profile":"strict-validation","source":"APRS101 pp. 37,91","packet":"N0CALL>APRS:!k5L!!<*e7>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-position-layout","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!k5L!!<*e7>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-063","title":"Invalid compressed table z","profile":"strict-validation","source":"APRS101 pp. 37,91","packet":"N0CALL>APRS:!z5L!!<*e7>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-position-layout","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!z5L!!<*e7>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-064","title":"Invalid compressed table ,","profile":"strict-validation","source":"APRS101 pp. 37,91","packet":"N0CALL>APRS:!,5L!!<*e7>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-position-layout","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!,5L!!<*e7>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-065","title":"Compressed coordinate outside Earth","profile":"strict-validation","source":"APRS101 pp. 23-24,38","packet":"N0CALL>APRS:!/!!!!{{{{>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"coordinate-out-of-range","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/!!!!{{{{>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-066","title":"Compressed coordinate outside Earth","profile":"strict-validation","source":"APRS101 pp. 23-24,38","packet":"N0CALL>APRS:!/{{{{!!!!>7P[","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"coordinate-out-of-range","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!/{{{{!!!!>7P["},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-067","title":"Invalid Mic-E destination AB","profile":"strict-validation","source":"APRS101 pp. 43-44","packet":"N0CALL>AB:`(_fn\"Oj/","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"AB","path":[]},"error_class":"invalid-mic-e-destination","position_usable":false},"expected":{"original_wire":"N0CALL>AB:`(_fn\"Oj/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-068","title":"Invalid Mic-E destination S32U6","profile":"strict-validation","source":"APRS101 pp. 43-44","packet":"N0CALL>S32U6:`(_fn\"Oj/","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32U6","path":[]},"error_class":"invalid-mic-e-destination","position_usable":false},"expected":{"original_wire":"N0CALL>S32U6:`(_fn\"Oj/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-069","title":"Invalid Mic-E destination S32U6TX","profile":"strict-validation","source":"APRS101 pp. 43-44","packet":"N0CALL>S32U6TX:`(_fn\"Oj/","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32U6TX","path":[]},"error_class":"invalid-mic-e-destination","position_usable":false},"expected":{"original_wire":"N0CALL>S32U6TX:`(_fn\"Oj/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-070","title":"Invalid Mic-E destination S32M6T","profile":"strict-validation","source":"APRS101 pp. 43-44","packet":"N0CALL>S32M6T:`(_fn\"Oj/","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32M6T","path":[]},"error_class":"invalid-mic-e-destination","position_usable":false},"expected":{"original_wire":"N0CALL>S32M6T:`(_fn\"Oj/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-071","title":"Invalid Mic-E destination S32A6T","profile":"strict-validation","source":"APRS101 pp. 43-44","packet":"N0CALL>S32A6T:`(_fn\"Oj/","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32A6T","path":[]},"error_class":"invalid-mic-e-destination","position_usable":false},"expected":{"original_wire":"N0CALL>S32A6T:`(_fn\"Oj/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-072","title":"Invalid Mic-E destination S32U6M","profile":"strict-validation","source":"APRS101 pp. 43-44","packet":"N0CALL>S32U6M:`(_fn\"Oj/","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32U6M","path":[]},"error_class":"invalid-mic-e-destination","position_usable":false},"expected":{"original_wire":"N0CALL>S32U6M:`(_fn\"Oj/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-073","title":"Truncated Mic-E information 0","profile":"strict-validation","source":"APRS101 p. 47","packet":"N0CALL>S32UVT:","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"error_class":"truncated-mic-e-information","position_usable":false},"expected":{"original_wire":"N0CALL>S32UVT:"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-074","title":"Truncated Mic-E information 1","profile":"strict-validation","source":"APRS101 p. 47","packet":"N0CALL>S32UVT:`","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"error_class":"truncated-mic-e-information","position_usable":false},"expected":{"original_wire":"N0CALL>S32UVT:`"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-075","title":"Truncated Mic-E information 2","profile":"strict-validation","source":"APRS101 p. 47","packet":"N0CALL>S32UVT:`(","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"error_class":"truncated-mic-e-information","position_usable":false},"expected":{"original_wire":"N0CALL>S32UVT:`("},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-076","title":"Truncated Mic-E information 3","profile":"strict-validation","source":"APRS101 p. 47","packet":"N0CALL>S32UVT:`(_","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"error_class":"truncated-mic-e-information","position_usable":false},"expected":{"original_wire":"N0CALL>S32UVT:`(_"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-077","title":"Truncated Mic-E information 4","profile":"strict-validation","source":"APRS101 p. 47","packet":"N0CALL>S32UVT:`(_f","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"error_class":"truncated-mic-e-information","position_usable":false},"expected":{"original_wire":"N0CALL>S32UVT:`(_f"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-078","title":"Truncated Mic-E information 5","profile":"strict-validation","source":"APRS101 p. 47","packet":"N0CALL>S32UVT:`(_fn","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"error_class":"truncated-mic-e-information","position_usable":false},"expected":{"original_wire":"N0CALL>S32UVT:`(_fn"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-079","title":"Truncated Mic-E information 6","profile":"strict-validation","source":"APRS101 p. 47","packet":"N0CALL>S32UVT:`(_fn\"","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"error_class":"truncated-mic-e-information","position_usable":false},"expected":{"original_wire":"N0CALL>S32UVT:`(_fn\""},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-080","title":"Truncated Mic-E information 7","profile":"strict-validation","source":"APRS101 p. 47","packet":"N0CALL>S32UVT:`(_fn\"O","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"error_class":"truncated-mic-e-information","position_usable":false},"expected":{"original_wire":"N0CALL>S32UVT:`(_fn\"O"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-081","title":"Truncated Mic-E information 8","profile":"strict-validation","source":"APRS101 p. 47","packet":"N0CALL>S32UVT:`(_fn\"Oj","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"error_class":"truncated-mic-e-information","position_usable":false},"expected":{"original_wire":"N0CALL>S32UVT:`(_fn\"Oj"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-082","title":"short-object-name-field","profile":"strict-validation","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:;LEADER *092345z4903.50N/07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"short-object-name-field","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:;LEADER *092345z4903.50N/07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-083","title":"long-object-name-field","profile":"strict-validation","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:;LEADER *092345z4903.50N/07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"long-object-name-field","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:;LEADER *092345z4903.50N/07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-084","title":"bad-object-alive-marker","profile":"strict-validation","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:;LEADER !092345z4903.50N/07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"bad-object-alive-marker","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:;LEADER !092345z4903.50N/07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-085","title":"missing-object-timestamp","profile":"strict-validation","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:;LEADER *4903.50N/07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"missing-object-timestamp","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:;LEADER *4903.50N/07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-086","title":"item-name-too-short","profile":"strict-validation","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:)AB!4903.50N/07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"item-name-too-short","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:)AB!4903.50N/07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-087","title":"item-name-too-long","profile":"strict-validation","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:)ABCDEFGHIJ!4903.50N/07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"item-name-too-long","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:)ABCDEFGHIJ!4903.50N/07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-088","title":"missing-item-terminator","profile":"strict-validation","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:)ABC4903.50N/07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"missing-item-terminator","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:)ABC4903.50N/07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-089","title":"message-text-too-long","profile":"strict-validation","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"message-text-too-long","message_valid":false},"note":"A permissive receiver may preserve the text with a warning; this is a transmitter-conformance failure, not a requirement to discard the entire envelope.","expected":{"original_wire":"N0CALL>APRS::W1AW :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-090","title":"short-addressee-field","profile":"strict-validation","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Hello","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"short-addressee-field","message_valid":false},"note":"A permissive receiver may preserve the text with a warning; this is a transmitter-conformance failure, not a requirement to discard the entire envelope.","expected":{"original_wire":"N0CALL>APRS::W1AW :Hello"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-091","title":"long-addressee-field","profile":"strict-validation","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Hello","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"long-addressee-field","message_valid":false},"note":"A permissive receiver may preserve the text with a warning; this is a transmitter-conformance failure, not a requirement to discard the entire envelope.","expected":{"original_wire":"N0CALL>APRS::W1AW :Hello"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-092","title":"empty-message-id","profile":"strict-validation","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Hello{","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"empty-message-id","message_valid":false},"note":"A permissive receiver may preserve the text with a warning; this is a transmitter-conformance failure, not a requirement to discard the entire envelope.","expected":{"original_wire":"N0CALL>APRS::W1AW :Hello{"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-093","title":"message-id-too-long","profile":"strict-validation","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Hello{123456","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"message-id-too-long","message_valid":false},"note":"A permissive receiver may preserve the text with a warning; this is a transmitter-conformance failure, not a requirement to discard the entire envelope.","expected":{"original_wire":"N0CALL>APRS::W1AW :Hello{123456"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-094","title":"message-id-space","profile":"strict-validation","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Hello{A B","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"message-id-space","message_valid":false},"note":"A permissive receiver may preserve the text with a warning; this is a transmitter-conformance failure, not a requirement to discard the entire envelope.","expected":{"original_wire":"N0CALL>APRS::W1AW :Hello{A B"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-095","title":"message-id-punctuation","profile":"strict-validation","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Hello{A!","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"message-id-punctuation","message_valid":false},"note":"A permissive receiver may preserve the text with a warning; this is a transmitter-conformance failure, not a requirement to discard the entire envelope.","expected":{"original_wire":"N0CALL>APRS::W1AW :Hello{A!"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-096","title":"reserved-message-byte","profile":"strict-validation","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Has | pipe","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"reserved-message-byte","message_valid":false},"note":"A permissive receiver may preserve the text with a warning; this is a transmitter-conformance failure, not a requirement to discard the entire envelope.","expected":{"original_wire":"N0CALL>APRS::W1AW :Has | pipe"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-097","title":"reserved-message-byte","profile":"strict-validation","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Has ~ tilde","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"reserved-message-byte","message_valid":false},"note":"A permissive receiver may preserve the text with a warning; this is a transmitter-conformance failure, not a requirement to discard the entire envelope.","expected":{"original_wire":"N0CALL>APRS::W1AW :Has ~ tilde"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-098","title":"telemetry-sequence-width","profile":"strict-validation","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#1000,001,002,003,004,005,00000000","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"telemetry-sequence-width","telemetry_valid":false},"note":"Floating-point/short/undefined telemetry accepted by FAP is in the compatibility appendix, not the original five-channel byte format.","expected":{"original_wire":"N0CALL>APRS:T#1000,001,002,003,004,005,00000000"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-099","title":"telemetry-analog-range","profile":"strict-validation","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#005,256,000,000,000,000,00000000","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"telemetry-analog-range","telemetry_valid":false},"note":"Floating-point/short/undefined telemetry accepted by FAP is in the compatibility appendix, not the original five-channel byte format.","expected":{"original_wire":"N0CALL>APRS:T#005,256,000,000,000,000,00000000"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-100","title":"telemetry-negative-analog","profile":"strict-validation","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#005,-01,000,000,000,000,00000000","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"telemetry-negative-analog","telemetry_valid":false},"note":"Floating-point/short/undefined telemetry accepted by FAP is in the compatibility appendix, not the original five-channel byte format.","expected":{"original_wire":"N0CALL>APRS:T#005,-01,000,000,000,000,00000000"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-101","title":"telemetry-decimal-analog","profile":"strict-validation","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#005,1.5,000,000,000,000,00000000","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"telemetry-decimal-analog","telemetry_valid":false},"note":"Floating-point/short/undefined telemetry accepted by FAP is in the compatibility appendix, not the original five-channel byte format.","expected":{"original_wire":"N0CALL>APRS:T#005,1.5,000,000,000,000,00000000"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-102","title":"telemetry-missing-channel","profile":"strict-validation","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#005,001,002,003,004,00000000","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"telemetry-missing-channel","telemetry_valid":false},"note":"Floating-point/short/undefined telemetry accepted by FAP is in the compatibility appendix, not the original five-channel byte format.","expected":{"original_wire":"N0CALL>APRS:T#005,001,002,003,004,00000000"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-103","title":"telemetry-short-bits","profile":"strict-validation","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#005,001,002,003,004,005,0000000","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"telemetry-short-bits","telemetry_valid":false},"note":"Floating-point/short/undefined telemetry accepted by FAP is in the compatibility appendix, not the original five-channel byte format.","expected":{"original_wire":"N0CALL>APRS:T#005,001,002,003,004,005,0000000"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-104","title":"telemetry-invalid-bit","profile":"strict-validation","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#005,001,002,003,004,005,00000002","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"telemetry-invalid-bit","telemetry_valid":false},"note":"Floating-point/short/undefined telemetry accepted by FAP is in the compatibility appendix, not the original five-channel byte format.","expected":{"original_wire":"N0CALL>APRS:T#005,001,002,003,004,005,00000002"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-105","title":"weather-missing-temperature","profile":"strict-validation","source":"APRS101 pp. 22,64","packet":"N0CALL>APRS:_10090556c220s004g005","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"weather-missing-temperature","weather_valid":false},"expected":{"original_wire":"N0CALL>APRS:_10090556c220s004g005"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-106","title":"weather-month-out-of-range","profile":"strict-validation","source":"APRS101 pp. 22,64","packet":"N0CALL>APRS:_13090556c220s004g005t077","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"weather-month-out-of-range","weather_valid":false},"expected":{"original_wire":"N0CALL>APRS:_13090556c220s004g005t077"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-107","title":"weather-direction-out-of-range","profile":"strict-validation","source":"APRS101 pp. 22,64","packet":"N0CALL>APRS:_10090556c361s004g005t077","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"weather-direction-out-of-range","weather_valid":false},"expected":{"original_wire":"N0CALL>APRS:_10090556c361s004g005t077"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-108","title":"weather-pressure-width","profile":"strict-validation","source":"APRS101 pp. 22,64","packet":"N0CALL>APRS:_10090556c220s004g005t077b1234","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"weather-pressure-width","weather_valid":false},"expected":{"original_wire":"N0CALL>APRS:_10090556c220s004g005t077b1234"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-109","title":"Malformed third-party '}'","profile":"strict-validation","source":"APRS101 pp. 83-86","packet":"N0CALL>APRS:}","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"malformed-third-party","inner_packet_valid":false},"expected":{"original_wire":"N0CALL>APRS:}"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-110","title":"Malformed third-party '}N0CALL>APRS'","profile":"strict-validation","source":"APRS101 pp. 83-86","packet":"N0CALL>APRS:}N0CALL>APRS","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"malformed-third-party","inner_packet_valid":false},"expected":{"original_wire":"N0CALL>APRS:}N0CALL>APRS"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-111","title":"Malformed third-party '}N0CALL>APRS:'","profile":"strict-validation","source":"APRS101 pp. 83-86","packet":"N0CALL>APRS:}N0CALL>APRS:","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"malformed-third-party","inner_packet_valid":false},"expected":{"original_wire":"N0CALL>APRS:}N0CALL>APRS:"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-112","title":"Malformed third-party '}BAD'","profile":"strict-validation","source":"APRS101 pp. 83-86","packet":"N0CALL>APRS:}BAD","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"malformed-third-party","inner_packet_valid":false},"expected":{"original_wire":"N0CALL>APRS:}BAD"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-113","title":"Truncated user-defined header '{'","profile":"strict-validation","source":"APRS101 p. 87","packet":"N0CALL>APRS:{","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-user-defined-header"},"expected":{"original_wire":"N0CALL>APRS:{"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-114","title":"Truncated user-defined header '{{'","profile":"strict-validation","source":"APRS101 p. 87","packet":"N0CALL>APRS:{{","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"truncated-user-defined-header"},"expected":{"original_wire":"N0CALL>APRS:{{"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-115","title":"Declared text limit exceeded 64","profile":"strict-validation","source":"APRS101 pp. 32,80","packet":"N0CALL>APRS:>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"declared-text-limit-exceeded"},"expected":{"original_wire":"N0CALL>APRS:>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-116","title":"Declared text limit exceeded 64","profile":"strict-validation","source":"APRS101 pp. 32,80","packet":"N0CALL>APRS:>092345zxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"declared-text-limit-exceeded"},"expected":{"original_wire":"N0CALL>APRS:>092345zxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-117","title":"Declared text limit exceeded 64","profile":"strict-validation","source":"APRS101 pp. 32,80","packet":"N0CALL>APRS:!4903.50N/07201.75W-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"declared-text-limit-exceeded"},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/07201.75W-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-118","title":"Reserved compression high bit 64","profile":"strict-validation","source":"APRS101 p.39","packet":"N0CALL>APRS:!/5L!!<*e7>7Pa","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"reserved-compression-type-bit","compression_type_value":64},"expected":{"original_wire":"N0CALL>APRS:!/5L!!<*e7>7Pa"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-119","title":"Reserved compression high bit 89","profile":"strict-validation","source":"APRS101 p.39","packet":"N0CALL>APRS:!/5L!!<*e7>7Pz","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"reserved-compression-type-bit","compression_type_value":89},"expected":{"original_wire":"N0CALL>APRS:!/5L!!<*e7>7Pz"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-120","title":"Reserved compression high bit 90","profile":"strict-validation","source":"APRS101 p.39","packet":"N0CALL>APRS:!/5L!!<*e7>7P{","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"reserved-compression-type-bit","compression_type_value":90},"expected":{"original_wire":"N0CALL>APRS:!/5L!!<*e7>7P{"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-121","title":"Invalid uncompressed symbol table ,","profile":"strict-validation","source":"APRS101 p.91","packet":"N0CALL>APRS:!4903.50N,07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-symbol-table","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50N,07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-122","title":"Invalid uncompressed symbol table a","profile":"strict-validation","source":"APRS101 p.91","packet":"N0CALL>APRS:!4903.50Na07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-symbol-table","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50Na07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-123","title":"Invalid uncompressed symbol table z","profile":"strict-validation","source":"APRS101 p.91","packet":"N0CALL>APRS:!4903.50Nz07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-symbol-table","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:!4903.50Nz07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-124","title":"Nonprintable symbol code 31","profile":"strict-validation","source":"APRS101 p.90, Appendix 2","packet":"N0CALL>APRS:!4903.50N/07201.75W\u001f","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-symbol-code"},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/07201.75W\u001f"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"BAD-125","title":"Nonprintable symbol code 127","profile":"strict-validation","source":"APRS101 p.90, Appendix 2","packet":"N0CALL>APRS:!4903.50N/07201.75W\u007f","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-symbol-code"},"expected":{"original_wire":"N0CALL>APRS:!4903.50N/07201.75W\u007f"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} diff --git a/packages/aprs/tests/vectors/cmp.jsonl b/packages/aprs/tests/vectors/cmp.jsonl new file mode 100644 index 0000000..0c1abfd --- /dev/null +++ b/packages/aprs/tests/vectors/cmp.jsonl @@ -0,0 +1,122 @@ +{"id":"CMP-001","title":"Compressed DTI !","profile":"core-1.1","source":"APRS101 pp. 36-41","packet":"N0CALL>APRS:!/5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-002","title":"Compressed DTI =","profile":"core-1.1","source":"APRS101 pp. 36-41","packet":"N0CALL>APRS:=/5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-003","title":"Compressed DTI /","profile":"core-1.1","source":"APRS101 pp. 36-41","packet":"N0CALL>APRS:/092345z/5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"CMP-004","title":"Compressed DTI @","profile":"core-1.1","source":"APRS101 pp. 36-41","packet":"N0CALL>APRS:@234517h/5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"timestamp":{"raw":"234517h","format":"HMS","zone":"UTC","hour":23,"minute":45,"second":17},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"hms_utc","hour":23,"minute":45,"second":17},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"CMP-005","title":"Compressed coordinate 90, -180","profile":"core-1.1","source":"APRS101 pp. 38-41","packet":"N0CALL>APRS:!/!!!!!!!!> sT","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":90.0,"longitude_deg":-180.0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":" sT","ignored":true},"comment":""},"note":"Expect the decoded quantized coordinate shown, not the pre-encoding input.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":90.0,"longitude_deg":-180.0,"symbol":{"table_id":"/","code":">"},"compression":{"raw":" sT","ignored":true}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-006","title":"Compressed coordinate -90, 180","profile":"core-1.1","source":"APRS101 pp. 38-41","packet":"N0CALL>APRS:!/{{!!{{!!> sT","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":-90.0,"longitude_deg":180.0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":" sT","ignored":true},"comment":""},"note":"Expect the decoded quantized coordinate shown, not the pre-encoding input.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":-90.0,"longitude_deg":180.0,"symbol":{"table_id":"/","code":">"},"compression":{"raw":" sT","ignored":true}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-007","title":"Compressed coordinate 0, 0","profile":"core-1.1","source":"APRS101 pp. 38-41","packet":"N0CALL>APRS:!/NN!!NN!!> sT","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":0.0,"longitude_deg":0.0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":" sT","ignored":true},"comment":""},"note":"Expect the decoded quantized coordinate shown, not the pre-encoding input.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":0.0,"longitude_deg":0.0,"symbol":{"table_id":"/","code":">"},"compression":{"raw":" sT","ignored":true}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-008","title":"Compressed coordinate 49.5, -72.75","profile":"core-1.1","source":"APRS101 pp. 38-41","packet":"N0CALL>APRS:!/5L!!<*e8> sT","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.749998687409},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":" sT","ignored":true},"comment":""},"note":"Expect the decoded quantized coordinate shown, not the pre-encoding input.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.749998687409,"symbol":{"table_id":"/","code":">"},"compression":{"raw":" sT","ignored":true}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-009","title":"Compressed coordinate -49.5, 72.75","profile":"core-1.1","source":"APRS101 pp. 38-41","packet":"N0CALL>APRS:!/gP!!`q7e> sT","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":-49.5,"longitude_deg":72.749998687409},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":" sT","ignored":true},"comment":""},"note":"Expect the decoded quantized coordinate shown, not the pre-encoding input.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":-49.5,"longitude_deg":72.749998687409,"symbol":{"table_id":"/","code":">"},"compression":{"raw":" sT","ignored":true}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-010","title":"Compressed coordinate 89.99999, 179.99999","profile":"core-1.1","source":"APRS101 pp. 38-41","packet":"N0CALL>APRS:!/!!!%{z{z> sT","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":89.999989499273,"longitude_deg":179.999989499273},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":" sT","ignored":true},"comment":""},"note":"Expect the decoded quantized coordinate shown, not the pre-encoding input.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":89.999989499273,"longitude_deg":179.999989499273,"symbol":{"table_id":"/","code":">"},"compression":{"raw":" sT","ignored":true}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-011","title":"Compressed table / overlay \\","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=\\5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"\\","table":"alternate","code":">","overlay":null},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"\\","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-012","title":"Compressed table / overlay a","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=a5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"a","table":"alternate","code":">","overlay":"0"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"a","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-013","title":"Compressed table / overlay b","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=b5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"b","table":"alternate","code":">","overlay":"1"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"b","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-014","title":"Compressed table / overlay c","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=c5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"c","table":"alternate","code":">","overlay":"2"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"c","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-015","title":"Compressed table / overlay d","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=d5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"d","table":"alternate","code":">","overlay":"3"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"d","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-016","title":"Compressed table / overlay e","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=e5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"e","table":"alternate","code":">","overlay":"4"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"e","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-017","title":"Compressed table / overlay f","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=f5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"f","table":"alternate","code":">","overlay":"5"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"f","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-018","title":"Compressed table / overlay g","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=g5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"g","table":"alternate","code":">","overlay":"6"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"g","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-019","title":"Compressed table / overlay h","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=h5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"h","table":"alternate","code":">","overlay":"7"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"h","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-020","title":"Compressed table / overlay i","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=i5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"i","table":"alternate","code":">","overlay":"8"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"i","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-021","title":"Compressed table / overlay j","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=j5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"j","table":"alternate","code":">","overlay":"9"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"j","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-022","title":"Compressed table / overlay A","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=A5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"A","table":"alternate","code":">","overlay":"A"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"A","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-023","title":"Compressed table / overlay B","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=B5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"B","table":"alternate","code":">","overlay":"B"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"B","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-024","title":"Compressed table / overlay C","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=C5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"C","table":"alternate","code":">","overlay":"C"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"C","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-025","title":"Compressed table / overlay D","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=D5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"D","table":"alternate","code":">","overlay":"D"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"D","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-026","title":"Compressed table / overlay E","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=E5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"E","table":"alternate","code":">","overlay":"E"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"E","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-027","title":"Compressed table / overlay F","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=F5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"F","table":"alternate","code":">","overlay":"F"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"F","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-028","title":"Compressed table / overlay G","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=G5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"G","table":"alternate","code":">","overlay":"G"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"G","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-029","title":"Compressed table / overlay H","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=H5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"H","table":"alternate","code":">","overlay":"H"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"H","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-030","title":"Compressed table / overlay I","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=I5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"I","table":"alternate","code":">","overlay":"I"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"I","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-031","title":"Compressed table / overlay J","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=J5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"J","table":"alternate","code":">","overlay":"J"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"J","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-032","title":"Compressed table / overlay K","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=K5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"K","table":"alternate","code":">","overlay":"K"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"K","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-033","title":"Compressed table / overlay L","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=L5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"L","table":"alternate","code":">","overlay":"L"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"L","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-034","title":"Compressed table / overlay M","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=M5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"M","table":"alternate","code":">","overlay":"M"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"M","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-035","title":"Compressed table / overlay N","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=N5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"N","table":"alternate","code":">","overlay":"N"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"N","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-036","title":"Compressed table / overlay O","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=O5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"O","table":"alternate","code":">","overlay":"O"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"O","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-037","title":"Compressed table / overlay P","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=P5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"P","table":"alternate","code":">","overlay":"P"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"P","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-038","title":"Compressed table / overlay Q","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=Q5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"Q","table":"alternate","code":">","overlay":"Q"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"Q","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-039","title":"Compressed table / overlay R","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=R5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"R","table":"alternate","code":">","overlay":"R"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"R","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-040","title":"Compressed table / overlay S","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=S5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"S","table":"alternate","code":">","overlay":"S"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"S","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-041","title":"Compressed table / overlay T","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=T5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"T","table":"alternate","code":">","overlay":"T"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"T","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-042","title":"Compressed table / overlay U","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=U5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"U","table":"alternate","code":">","overlay":"U"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"U","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-043","title":"Compressed table / overlay V","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=V5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"V","table":"alternate","code":">","overlay":"V"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"V","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-044","title":"Compressed table / overlay W","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=W5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"W","table":"alternate","code":">","overlay":"W"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"W","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-045","title":"Compressed table / overlay X","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=X5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"X","table":"alternate","code":">","overlay":"X"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"X","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-046","title":"Compressed table / overlay Y","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=Y5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"Y","table":"alternate","code":">","overlay":"Y"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"Y","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-047","title":"Compressed table / overlay Z","profile":"core-1.1","source":"APRS101 pp. 37, 91-92","packet":"N0CALL>APRS:=Z5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"Z","table":"alternate","code":">","overlay":"Z"},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"Z","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-048","title":"cs numeric values 0,0","profile":"core-1.1","source":"APRS101 pp. 38-40","packet":"N0CALL>APRS:!/5L!!<*e7>!!!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"!!!","type_value":0,"fix":"old","nmea_source":"other","origin_code":0},"motion":{"course_deg":0,"speed_knots":0.0,"speed_kmh":0.0},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":0,"raw":"!!!"},"extensions":{"motion":{"course_deg":0,"speed_knots":0.0}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-049","title":"cs numeric values 89,0","profile":"core-1.1","source":"APRS101 pp. 38-40","packet":"N0CALL>APRS:!/5L!!<*e7>z!!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"z!!","type_value":0,"fix":"old","nmea_source":"other","origin_code":0},"motion":{"course_deg":356,"speed_knots":0.0,"speed_kmh":0.0},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":0,"raw":"z!!"},"extensions":{"motion":{"course_deg":356,"speed_knots":0.0}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-050","title":"cs numeric values 22,47","profile":"core-1.1","source":"APRS101 pp. 38-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P!","type_value":0,"fix":"old","nmea_source":"other","origin_code":0},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":0,"raw":"7P!"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-051","title":"cs numeric values 0,90","profile":"core-1.1","source":"APRS101 pp. 38-40","packet":"N0CALL>APRS:!/5L!!<*e7>!{!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"!{!","type_value":0,"fix":"old","nmea_source":"other","origin_code":0},"motion":{"course_deg":0,"speed_knots":1017.915089278274,"speed_kmh":1885.178745343363},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":0,"raw":"!{!"},"extensions":{"motion":{"course_deg":0,"speed_knots":1017.915089278274}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-052","title":"cs numeric values 89,90","profile":"core-1.1","source":"APRS101 pp. 38-40","packet":"N0CALL>APRS:!/5L!!<*e7>z{!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"z{!","type_value":0,"fix":"old","nmea_source":"other","origin_code":0},"motion":{"course_deg":356,"speed_knots":1017.915089278274,"speed_kmh":1885.178745343363},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":0,"raw":"z{!"},"extensions":{"motion":{"course_deg":356,"speed_knots":1017.915089278274}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-053","title":"cs numeric values 90,0","profile":"core-1.1","source":"APRS101 pp. 38-40","packet":"N0CALL>APRS:!/5L!!<*e7>{!!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"{!!","type_value":0,"fix":"old","nmea_source":"other","origin_code":0},"radio_range":{"miles":2.0,"km":3.218688},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":0,"raw":"{!!"},"extensions":{"range":{"miles":2.0}}}},"unmapped":["$.compression.type_value","$.radio_range.km","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-054","title":"cs numeric values 90,30","profile":"core-1.1","source":"APRS101 pp. 38-40","packet":"N0CALL>APRS:!/5L!!<*e7>{?!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"{?!","type_value":0,"fix":"old","nmea_source":"other","origin_code":0},"radio_range":{"miles":20.125313778147,"km":32.388552976978},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":0,"raw":"{?!"},"extensions":{"range":{"miles":20.125313778147}}}},"unmapped":["$.compression.type_value","$.radio_range.km","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-055","title":"cs numeric values 90,90","profile":"core-1.1","source":"APRS101 pp. 38-40","packet":"N0CALL>APRS:!/5L!!<*e7>{{!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"{{!","type_value":0,"fix":"old","nmea_source":"other","origin_code":0},"radio_range":{"miles":2037.830178556547,"km":3279.569770878908},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":0,"raw":"{{!"},"extensions":{"range":{"miles":2037.830178556547}}}},"unmapped":["$.compression.type_value","$.radio_range.km","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-056","title":"GGA altitude '!!'","profile":"core-1.1","source":"APRS101 p. 40","packet":"N0CALL>APRS:=/5L!!<*e7O!!S","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":"O","overlay":null},"compression":{"csT_raw":"!!S","type_value":50,"fix":"current","nmea_source":"GGA","origin_code":2},"altitude":{"feet":1.0,"meters":0.3048,"encoding":"compressed"},"comment":""},"note":"GGA mode takes precedence over the course/range interpretation of c, including c={.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":"O"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":2,"raw":"!!S"},"extensions":{"altitude":{"measurement":{"value":1.0,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-057","title":"GGA altitude 'S]'","profile":"core-1.1","source":"APRS101 p. 40","packet":"N0CALL>APRS:=/5L!!<*e7OS]S","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":"O","overlay":null},"compression":{"csT_raw":"S]S","type_value":50,"fix":"current","nmea_source":"GGA","origin_code":2},"altitude":{"feet":10004.52005070133,"meters":3049.377711453766,"encoding":"compressed"},"comment":""},"note":"GGA mode takes precedence over the course/range interpretation of c, including c={.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":"O"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":2,"raw":"S]S"},"extensions":{"altitude":{"measurement":{"value":10004.52005070133,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-058","title":"GGA altitude '{{'","profile":"core-1.1","source":"APRS101 p. 40","packet":"N0CALL>APRS:=/5L!!<*e7O{{S","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":"O","overlay":null},"compression":{"csT_raw":"{{S","type_value":50,"fix":"current","nmea_source":"GGA","origin_code":2},"altitude":{"feet":15301509.581191743,"meters":4663900.120347244,"encoding":"compressed"},"comment":""},"note":"GGA mode takes precedence over the course/range interpretation of c, including c={.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":"O"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":2,"raw":"{{S"},"extensions":{"altitude":{"measurement":{"value":15301509.581191743,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-059","title":"Compression type bitfield 000000","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P!","type_value":0,"fix":"old","nmea_source":"other","origin_code":0},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":0,"raw":"7P!"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-060","title":"Compression type bitfield 000001","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P\"","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P\"","type_value":1,"fix":"old","nmea_source":"other","origin_code":1},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":1,"raw":"7P\""},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-061","title":"Compression type bitfield 000010","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P#","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P#","type_value":2,"fix":"old","nmea_source":"other","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":2,"raw":"7P#"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-062","title":"Compression type bitfield 000011","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P$","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P$","type_value":3,"fix":"old","nmea_source":"other","origin_code":3},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":3,"raw":"7P$"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-063","title":"Compression type bitfield 000100","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P%","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P%","type_value":4,"fix":"old","nmea_source":"other","origin_code":4},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":4,"raw":"7P%"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-064","title":"Compression type bitfield 000101","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P&","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P&","type_value":5,"fix":"old","nmea_source":"other","origin_code":5},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":5,"raw":"7P&"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-065","title":"Compression type bitfield 000110","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P'","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P'","type_value":6,"fix":"old","nmea_source":"other","origin_code":6},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":6,"raw":"7P'"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-066","title":"Compression type bitfield 000111","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P(","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P(","type_value":7,"fix":"old","nmea_source":"other","origin_code":7},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"other","origin_code":7,"raw":"7P("},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-067","title":"Compression type bitfield 001000","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P)","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P)","type_value":8,"fix":"old","nmea_source":"GLL","origin_code":0},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GLL","origin_code":0,"raw":"7P)"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-068","title":"Compression type bitfield 001001","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P*","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P*","type_value":9,"fix":"old","nmea_source":"GLL","origin_code":1},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GLL","origin_code":1,"raw":"7P*"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-069","title":"Compression type bitfield 001010","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P+","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P+","type_value":10,"fix":"old","nmea_source":"GLL","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GLL","origin_code":2,"raw":"7P+"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-070","title":"Compression type bitfield 001011","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P,","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P,","type_value":11,"fix":"old","nmea_source":"GLL","origin_code":3},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GLL","origin_code":3,"raw":"7P,"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-071","title":"Compression type bitfield 001100","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P-","type_value":12,"fix":"old","nmea_source":"GLL","origin_code":4},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GLL","origin_code":4,"raw":"7P-"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-072","title":"Compression type bitfield 001101","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P.","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P.","type_value":13,"fix":"old","nmea_source":"GLL","origin_code":5},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GLL","origin_code":5,"raw":"7P."},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-073","title":"Compression type bitfield 001110","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P/","type_value":14,"fix":"old","nmea_source":"GLL","origin_code":6},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GLL","origin_code":6,"raw":"7P/"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-074","title":"Compression type bitfield 001111","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P0","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P0","type_value":15,"fix":"old","nmea_source":"GLL","origin_code":7},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GLL","origin_code":7,"raw":"7P0"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-075","title":"Compression type bitfield 010000","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P1","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P1","type_value":16,"fix":"old","nmea_source":"GGA","origin_code":0},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GGA","origin_code":0,"raw":"7P1"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-076","title":"Compression type bitfield 010001","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P2","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P2","type_value":17,"fix":"old","nmea_source":"GGA","origin_code":1},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GGA","origin_code":1,"raw":"7P2"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-077","title":"Compression type bitfield 010010","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P3","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P3","type_value":18,"fix":"old","nmea_source":"GGA","origin_code":2},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GGA","origin_code":2,"raw":"7P3"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-078","title":"Compression type bitfield 010011","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P4","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P4","type_value":19,"fix":"old","nmea_source":"GGA","origin_code":3},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GGA","origin_code":3,"raw":"7P4"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-079","title":"Compression type bitfield 010100","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P5","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P5","type_value":20,"fix":"old","nmea_source":"GGA","origin_code":4},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GGA","origin_code":4,"raw":"7P5"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-080","title":"Compression type bitfield 010101","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P6","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P6","type_value":21,"fix":"old","nmea_source":"GGA","origin_code":5},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GGA","origin_code":5,"raw":"7P6"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-081","title":"Compression type bitfield 010110","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P7","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P7","type_value":22,"fix":"old","nmea_source":"GGA","origin_code":6},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GGA","origin_code":6,"raw":"7P7"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-082","title":"Compression type bitfield 010111","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P8","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P8","type_value":23,"fix":"old","nmea_source":"GGA","origin_code":7},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"GGA","origin_code":7,"raw":"7P8"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-083","title":"Compression type bitfield 011000","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P9","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P9","type_value":24,"fix":"old","nmea_source":"RMC","origin_code":0},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"RMC","origin_code":0,"raw":"7P9"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-084","title":"Compression type bitfield 011001","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P:","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P:","type_value":25,"fix":"old","nmea_source":"RMC","origin_code":1},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"RMC","origin_code":1,"raw":"7P:"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-085","title":"Compression type bitfield 011010","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P;","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P;","type_value":26,"fix":"old","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"RMC","origin_code":2,"raw":"7P;"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-086","title":"Compression type bitfield 011011","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P<","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P<","type_value":27,"fix":"old","nmea_source":"RMC","origin_code":3},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"RMC","origin_code":3,"raw":"7P<"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-087","title":"Compression type bitfield 011100","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P=","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P=","type_value":28,"fix":"old","nmea_source":"RMC","origin_code":4},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"RMC","origin_code":4,"raw":"7P="},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-088","title":"Compression type bitfield 011101","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P>","type_value":29,"fix":"old","nmea_source":"RMC","origin_code":5},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"RMC","origin_code":5,"raw":"7P>"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-089","title":"Compression type bitfield 011110","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P?","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P?","type_value":30,"fix":"old","nmea_source":"RMC","origin_code":6},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"RMC","origin_code":6,"raw":"7P?"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-090","title":"Compression type bitfield 011111","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P@","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P@","type_value":31,"fix":"old","nmea_source":"RMC","origin_code":7},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"old","nmea_source":"RMC","origin_code":7,"raw":"7P@"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-091","title":"Compression type bitfield 100000","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PA","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PA","type_value":32,"fix":"current","nmea_source":"other","origin_code":0},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"other","origin_code":0,"raw":"7PA"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-092","title":"Compression type bitfield 100001","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PB","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PB","type_value":33,"fix":"current","nmea_source":"other","origin_code":1},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"other","origin_code":1,"raw":"7PB"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-093","title":"Compression type bitfield 100010","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PC","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PC","type_value":34,"fix":"current","nmea_source":"other","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"other","origin_code":2,"raw":"7PC"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-094","title":"Compression type bitfield 100011","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PD","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PD","type_value":35,"fix":"current","nmea_source":"other","origin_code":3},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"other","origin_code":3,"raw":"7PD"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-095","title":"Compression type bitfield 100100","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PE","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PE","type_value":36,"fix":"current","nmea_source":"other","origin_code":4},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"other","origin_code":4,"raw":"7PE"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-096","title":"Compression type bitfield 100101","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PF","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PF","type_value":37,"fix":"current","nmea_source":"other","origin_code":5},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"other","origin_code":5,"raw":"7PF"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-097","title":"Compression type bitfield 100110","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PG","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PG","type_value":38,"fix":"current","nmea_source":"other","origin_code":6},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"other","origin_code":6,"raw":"7PG"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-098","title":"Compression type bitfield 100111","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PH","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PH","type_value":39,"fix":"current","nmea_source":"other","origin_code":7},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"other","origin_code":7,"raw":"7PH"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-099","title":"Compression type bitfield 101000","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PI","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PI","type_value":40,"fix":"current","nmea_source":"GLL","origin_code":0},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GLL","origin_code":0,"raw":"7PI"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-100","title":"Compression type bitfield 101001","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PJ","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PJ","type_value":41,"fix":"current","nmea_source":"GLL","origin_code":1},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GLL","origin_code":1,"raw":"7PJ"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-101","title":"Compression type bitfield 101010","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PK","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PK","type_value":42,"fix":"current","nmea_source":"GLL","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GLL","origin_code":2,"raw":"7PK"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-102","title":"Compression type bitfield 101011","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PL","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PL","type_value":43,"fix":"current","nmea_source":"GLL","origin_code":3},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GLL","origin_code":3,"raw":"7PL"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-103","title":"Compression type bitfield 101100","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PM","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PM","type_value":44,"fix":"current","nmea_source":"GLL","origin_code":4},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GLL","origin_code":4,"raw":"7PM"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-104","title":"Compression type bitfield 101101","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PN","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PN","type_value":45,"fix":"current","nmea_source":"GLL","origin_code":5},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GLL","origin_code":5,"raw":"7PN"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-105","title":"Compression type bitfield 101110","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PO","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PO","type_value":46,"fix":"current","nmea_source":"GLL","origin_code":6},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GLL","origin_code":6,"raw":"7PO"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-106","title":"Compression type bitfield 101111","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PP","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PP","type_value":47,"fix":"current","nmea_source":"GLL","origin_code":7},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GLL","origin_code":7,"raw":"7PP"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-107","title":"Compression type bitfield 110000","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PQ","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PQ","type_value":48,"fix":"current","nmea_source":"GGA","origin_code":0},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":0,"raw":"7PQ"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-108","title":"Compression type bitfield 110001","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PR","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PR","type_value":49,"fix":"current","nmea_source":"GGA","origin_code":1},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":1,"raw":"7PR"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-109","title":"Compression type bitfield 110010","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PS","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PS","type_value":50,"fix":"current","nmea_source":"GGA","origin_code":2},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":2,"raw":"7PS"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-110","title":"Compression type bitfield 110011","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PT","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PT","type_value":51,"fix":"current","nmea_source":"GGA","origin_code":3},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":3,"raw":"7PT"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-111","title":"Compression type bitfield 110100","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PU","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PU","type_value":52,"fix":"current","nmea_source":"GGA","origin_code":4},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":4,"raw":"7PU"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-112","title":"Compression type bitfield 110101","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PV","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PV","type_value":53,"fix":"current","nmea_source":"GGA","origin_code":5},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":5,"raw":"7PV"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-113","title":"Compression type bitfield 110110","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PW","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PW","type_value":54,"fix":"current","nmea_source":"GGA","origin_code":6},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":6,"raw":"7PW"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-114","title":"Compression type bitfield 110111","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PX","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PX","type_value":55,"fix":"current","nmea_source":"GGA","origin_code":7},"altitude":{"feet":59.973779346725,"meters":18.280007944882,"encoding":"compressed"},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"GGA","origin_code":7,"raw":"7PX"},"extensions":{"altitude":{"measurement":{"value":59.973779346725,"unit":"feet"},"encoding":"compressed"}}}},"unmapped":["$.altitude.meters","$.compression.type_value","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-115","title":"Compression type bitfield 111000","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PY","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PY","type_value":56,"fix":"current","nmea_source":"RMC","origin_code":0},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":0,"raw":"7PY"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-116","title":"Compression type bitfield 111001","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7PZ","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7PZ","type_value":57,"fix":"current","nmea_source":"RMC","origin_code":1},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":1,"raw":"7PZ"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-117","title":"Compression type bitfield 111010","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-118","title":"Compression type bitfield 111011","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P\\","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P\\","type_value":59,"fix":"current","nmea_source":"RMC","origin_code":3},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":3,"raw":"7P\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-119","title":"Compression type bitfield 111100","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P]","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P]","type_value":60,"fix":"current","nmea_source":"RMC","origin_code":4},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":4,"raw":"7P]"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-120","title":"Compression type bitfield 111101","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P^","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P^","type_value":61,"fix":"current","nmea_source":"RMC","origin_code":5},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":5,"raw":"7P^"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-121","title":"Compression type bitfield 111110","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P_","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P_","type_value":62,"fix":"current","nmea_source":"RMC","origin_code":6},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":6,"raw":"7P_"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"CMP-122","title":"Compression type bitfield 111111","profile":"core-1.1","source":"APRS101 pp. 39-40","packet":"N0CALL>APRS:!/5L!!<*e7>7P`","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P`","type_value":63,"fix":"current","nmea_source":"RMC","origin_code":7},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Origin codes 3 and 6 are reserved/tbd labels; preserve the code without inventing a product name.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":7,"raw":"7P`"},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} diff --git a/packages/aprs/tests/vectors/ext.jsonl b/packages/aprs/tests/vectors/ext.jsonl new file mode 100644 index 0000000..9e26d9e --- /dev/null +++ b/packages/aprs/tests/vectors/ext.jsonl @@ -0,0 +1,50 @@ +{"id":"EXT-001","title":"Course 1, speed 1","profile":"core-1.1","source":"APRS101 p. 27","packet":"N0CALL>APRS:!4903.50N/07201.75W>001/001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","motion":{"course_code":1,"course_deg":1,"speed_knots":1,"speed_kmh":1.852}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"course_deg":1,"speed_knots":1,"course_code":1}}}},"unmapped":["$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-002","title":"Course 88, speed 36","profile":"core-1.1","source":"APRS101 p. 27","packet":"N0CALL>APRS:!4903.50N/07201.75W>088/036","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","motion":{"course_code":88,"course_deg":88,"speed_knots":36,"speed_kmh":66.672}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"course_deg":88,"speed_knots":36,"course_code":88}}}},"unmapped":["$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-003","title":"Course 359, speed 999","profile":"core-1.1","source":"APRS101 p. 27","packet":"N0CALL>APRS:!4903.50N/07201.75W>359/999","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","motion":{"course_code":359,"course_deg":359,"speed_knots":999,"speed_kmh":1850.148}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"course_deg":359,"speed_knots":999,"course_code":359}}}},"unmapped":["$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-004","title":"Course 360, speed 0","profile":"core-1.1","source":"APRS101 p. 27","packet":"N0CALL>APRS:!4903.50N/07201.75W>360/000","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","motion":{"course_code":360,"course_deg":360,"speed_knots":0,"speed_kmh":0.0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"course_deg":360,"speed_knots":0,"course_code":360}}}},"unmapped":["$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-005","title":"Course 0, speed 0","profile":"core-1.1","source":"APRS101 p. 27","packet":"N0CALL>APRS:!4903.50N/07201.75W>000/000","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","motion":{"course_code":0,"course_deg":null,"speed_knots":null,"speed_kmh":null,"zero_pair_meaning":"unknown-or-not-relevant","speed_code":0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"course_deg":null,"speed_knots":null,"course_code":0,"speed_code":0}}}},"unmapped":["$.motion.speed_kmh","$.motion.zero_pair_meaning","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-006","title":"Unknown movement '.../...'","profile":"core-1.1","source":"APRS101 p. 27","packet":"N0CALL>APRS:!4903.50N/07201.75W>.../...","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","motion":{"raw":".../...","course_deg":null,"speed_knots":null}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"course_deg":null,"speed_knots":null}}}},"unmapped":["$.motion.raw","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-007","title":"Unknown movement ' / '","profile":"core-1.1","source":"APRS101 p. 27","packet":"N0CALL>APRS:!4903.50N/07201.75W> / ","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","motion":{"raw":" / ","course_deg":null,"speed_knots":null}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"course_deg":null,"speed_knots":null}}}},"unmapped":["$.motion.raw","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-008","title":"Altitude 0 ft first","profile":"core-1.1","source":"APRS101 p. 26","packet":"N0CALL>APRS:!4903.50N/07201.75W-/A=000000 tail","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":" tail","altitude":{"feet":0,"meters":0.0,"encoding":"comment"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":" tail","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"extensions":{"altitude":{"measurement":{"value":0,"unit":"feet"},"encoding":"feet_extension"}}}},"unmapped":["$.altitude.meters","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-009","title":"Altitude 0 ft middle","profile":"core-1.1","source":"APRS101 p. 26","packet":"N0CALL>APRS:!4903.50N/07201.75W-before /A=000000 after","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"before after","altitude":{"feet":0,"meters":0.0,"encoding":"comment"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"before after","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"extensions":{"altitude":{"measurement":{"value":0,"unit":"feet"},"encoding":"feet_extension"}}}},"unmapped":["$.altitude.meters","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-010","title":"Altitude 0 ft last","profile":"core-1.1","source":"APRS101 p. 26","packet":"N0CALL>APRS:!4903.50N/07201.75W-before /A=000000","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"before ","altitude":{"feet":0,"meters":0.0,"encoding":"comment"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"before ","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"extensions":{"altitude":{"measurement":{"value":0,"unit":"feet"},"encoding":"feet_extension"}}}},"unmapped":["$.altitude.meters","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-011","title":"Altitude 1234 ft first","profile":"core-1.1","source":"APRS101 p. 26","packet":"N0CALL>APRS:!4903.50N/07201.75W-/A=001234 tail","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":" tail","altitude":{"feet":1234,"meters":376.1232,"encoding":"comment"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":" tail","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"extensions":{"altitude":{"measurement":{"value":1234,"unit":"feet"},"encoding":"feet_extension"}}}},"unmapped":["$.altitude.meters","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-012","title":"Altitude 1234 ft middle","profile":"core-1.1","source":"APRS101 p. 26","packet":"N0CALL>APRS:!4903.50N/07201.75W-before /A=001234 after","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"before after","altitude":{"feet":1234,"meters":376.1232,"encoding":"comment"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"before after","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"extensions":{"altitude":{"measurement":{"value":1234,"unit":"feet"},"encoding":"feet_extension"}}}},"unmapped":["$.altitude.meters","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-013","title":"Altitude 1234 ft last","profile":"core-1.1","source":"APRS101 p. 26","packet":"N0CALL>APRS:!4903.50N/07201.75W-before /A=001234","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"before ","altitude":{"feet":1234,"meters":376.1232,"encoding":"comment"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"before ","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"extensions":{"altitude":{"measurement":{"value":1234,"unit":"feet"},"encoding":"feet_extension"}}}},"unmapped":["$.altitude.meters","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-014","title":"Altitude 999999 ft first","profile":"core-1.1","source":"APRS101 p. 26","packet":"N0CALL>APRS:!4903.50N/07201.75W-/A=999999 tail","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":" tail","altitude":{"feet":999999,"meters":304799.6952,"encoding":"comment"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":" tail","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"extensions":{"altitude":{"measurement":{"value":999999,"unit":"feet"},"encoding":"feet_extension"}}}},"unmapped":["$.altitude.meters","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-015","title":"Altitude 999999 ft middle","profile":"core-1.1","source":"APRS101 p. 26","packet":"N0CALL>APRS:!4903.50N/07201.75W-before /A=999999 after","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"before after","altitude":{"feet":999999,"meters":304799.6952,"encoding":"comment"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"before after","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"extensions":{"altitude":{"measurement":{"value":999999,"unit":"feet"},"encoding":"feet_extension"}}}},"unmapped":["$.altitude.meters","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-016","title":"Altitude 999999 ft last","profile":"core-1.1","source":"APRS101 p. 26","packet":"N0CALL>APRS:!4903.50N/07201.75W-before /A=999999","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"before ","altitude":{"feet":999999,"meters":304799.6952,"encoding":"comment"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"before ","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"extensions":{"altitude":{"measurement":{"value":999999,"unit":"feet"},"encoding":"feet_extension"}}}},"unmapped":["$.altitude.meters","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-017","title":"PHG 0000","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG0000Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"0000","power_w":0,"height_haat_ft":10,"gain_dbi":0,"directivity_deg":null,"omnidirectional":true,"range_miles_1_0":0.0,"display_radius_miles_1_1":0.0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":0,"height_haat_ft":10,"gain_dbi":0,"directivity_deg":null,"raw":"0000"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-018","title":"PHG 5132","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5132Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5132","power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":90,"omnidirectional":false,"range_miles_1_0":7.947993420414,"display_radius_miles_1_1":3.973996710207}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":90,"raw":"5132"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-019","title":"PHG 9998","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG9998Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"9998","power_w":81,"height_haat_ft":5120,"gain_dbi":9,"directivity_deg":360,"omnidirectional":false,"range_miles_1_0":240.99816407125,"display_radius_miles_1_1":120.499082035625}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":81,"height_haat_ft":5120,"gain_dbi":9,"directivity_deg":360,"raw":"9998"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-020","title":"PHG 5:32","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5:32Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5:32","power_w":25,"height_haat_ft":10240,"gain_dbi":3,"directivity_deg":90,"omnidirectional":false,"range_miles_1_0":179.842561420823,"display_radius_miles_1_1":89.921280710412}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":10240,"gain_dbi":3,"directivity_deg":90,"raw":"5:32"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-021","title":"PHG 5;32","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5;32Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5;32","power_w":25,"height_haat_ft":20480,"gain_dbi":3,"directivity_deg":90,"omnidirectional":false,"range_miles_1_0":254.335789453244,"display_radius_miles_1_1":127.167894726622}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20480,"gain_dbi":3,"directivity_deg":90,"raw":"5;32"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-022","title":"PHG 5130","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5130Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5130","power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":null,"omnidirectional":true,"range_miles_1_0":7.947993420414,"display_radius_miles_1_1":3.973996710207}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":null,"raw":"5130"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-023","title":"PHG 5131","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5131Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5131","power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":45,"omnidirectional":false,"range_miles_1_0":7.947993420414,"display_radius_miles_1_1":3.973996710207}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":45,"raw":"5131"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-024","title":"PHG 5132","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5132Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5132","power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":90,"omnidirectional":false,"range_miles_1_0":7.947993420414,"display_radius_miles_1_1":3.973996710207}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":90,"raw":"5132"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-025","title":"PHG 5133","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5133Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5133","power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":135,"omnidirectional":false,"range_miles_1_0":7.947993420414,"display_radius_miles_1_1":3.973996710207}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":135,"raw":"5133"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-026","title":"PHG 5134","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5134Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5134","power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":180,"omnidirectional":false,"range_miles_1_0":7.947993420414,"display_radius_miles_1_1":3.973996710207}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":180,"raw":"5134"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-027","title":"PHG 5135","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5135Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5135","power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":225,"omnidirectional":false,"range_miles_1_0":7.947993420414,"display_radius_miles_1_1":3.973996710207}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":225,"raw":"5135"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-028","title":"PHG 5136","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5136Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5136","power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":270,"omnidirectional":false,"range_miles_1_0":7.947993420414,"display_radius_miles_1_1":3.973996710207}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":270,"raw":"5136"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-029","title":"PHG 5137","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5137Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5137","power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":315,"omnidirectional":false,"range_miles_1_0":7.947993420414,"display_radius_miles_1_1":3.973996710207}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":315,"raw":"5137"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-030","title":"PHG 5138","profile":"core-1.1","source":"APRS101 pp. 28-29; A11: PHG gain and range corrections","packet":"N0CALL>APRS:!4903.50N/07201.75W#PHG5138Radio","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Radio","phg":{"raw":"5138","power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":360,"omnidirectional":false,"range_miles_1_0":7.947993420414,"display_radius_miles_1_1":3.973996710207}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Radio","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":25,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":360,"raw":"5138"}}}},"unmapped":["$.phg.display_radius_miles_1_1","$.phg.omnidirectional","$.phg.range_miles_1_0","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-031","title":"RNG 0","profile":"core-1.1","source":"APRS101 p. 29","packet":"N0CALL>APRS:!4903.50N/07201.75W#RNG0000Range","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Range","radio_range":{"miles":0,"km":0.0}},"note":"The PHG halving correction does not halve an explicitly transmitted RNG value.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Range","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"range":{"miles":0}}}},"unmapped":["$.radio_range.km","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-032","title":"RNG 1","profile":"core-1.1","source":"APRS101 p. 29","packet":"N0CALL>APRS:!4903.50N/07201.75W#RNG0001Range","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Range","radio_range":{"miles":1,"km":1.609344}},"note":"The PHG halving correction does not halve an explicitly transmitted RNG value.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Range","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"range":{"miles":1}}}},"unmapped":["$.radio_range.km","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-033","title":"RNG 50","profile":"core-1.1","source":"APRS101 p. 29","packet":"N0CALL>APRS:!4903.50N/07201.75W#RNG0050Range","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Range","radio_range":{"miles":50,"km":80.4672}},"note":"The PHG halving correction does not halve an explicitly transmitted RNG value.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Range","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"range":{"miles":50}}}},"unmapped":["$.radio_range.km","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-034","title":"RNG 9999","profile":"core-1.1","source":"APRS101 p. 29","packet":"N0CALL>APRS:!4903.50N/07201.75W#RNG9999Range","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"#","overlay":null},"comment":"Range","radio_range":{"miles":9999,"km":16091.830656000002}},"note":"The PHG halving correction does not halve an explicitly transmitted RNG value.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Range","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"range":{"miles":9999}}}},"unmapped":["$.radio_range.km","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-035","title":"DFS 2360","profile":"core-1.1","source":"APRS101 pp. 29-30","packet":"N0CALL>APRS:!4903.50N/07201.75W\\DFS2360","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","df_signal":{"s_units":2,"height_haat_ft":80,"gain_db":6,"directivity_deg":null}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"signal":{"s_units":2,"height_haat_ft":80,"gain_db":6,"directivity_deg":null}}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-036","title":"DFS 0360","profile":"core-1.1","source":"APRS101 pp. 29-30","packet":"N0CALL>APRS:!4903.50N/07201.75W\\DFS0360","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","df_signal":{"s_units":0,"height_haat_ft":80,"gain_db":6,"directivity_deg":null}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"signal":{"s_units":0,"height_haat_ft":80,"gain_db":6,"directivity_deg":null}}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-037","title":"DFS 9998","profile":"core-1.1","source":"APRS101 pp. 29-30","packet":"N0CALL>APRS:!4903.50N/07201.75W\\DFS9998","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","df_signal":{"s_units":9,"height_haat_ft":5120,"gain_db":9,"directivity_deg":360}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"signal":{"s_units":9,"height_haat_ft":5120,"gain_db":9,"directivity_deg":360}}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-038","title":"DF quality 0","profile":"core-1.1","source":"APRS101 pp. 30, 34-35","packet":"N0CALL>APRS:=4903.50N/07201.75W\\088/036/270/720","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"df_bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"range_miles":4,"quality_code":0,"accuracy_less_than_deg":null,"usable":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"quality_code":0}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.range_miles","$.df_bearing.usable","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-039","title":"DF quality 1","profile":"core-1.1","source":"APRS101 pp. 30, 34-35","packet":"N0CALL>APRS:=4903.50N/07201.75W\\088/036/270/721","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"df_bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"range_miles":4,"quality_code":1,"accuracy_less_than_deg":240,"usable":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"quality_code":1}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.range_miles","$.df_bearing.usable","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-040","title":"DF quality 2","profile":"core-1.1","source":"APRS101 pp. 30, 34-35","packet":"N0CALL>APRS:=4903.50N/07201.75W\\088/036/270/722","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"df_bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"range_miles":4,"quality_code":2,"accuracy_less_than_deg":120,"usable":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"quality_code":2}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.range_miles","$.df_bearing.usable","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-041","title":"DF quality 3","profile":"core-1.1","source":"APRS101 pp. 30, 34-35","packet":"N0CALL>APRS:=4903.50N/07201.75W\\088/036/270/723","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"df_bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"range_miles":4,"quality_code":3,"accuracy_less_than_deg":64,"usable":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"quality_code":3}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.range_miles","$.df_bearing.usable","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-042","title":"DF quality 4","profile":"core-1.1","source":"APRS101 pp. 30, 34-35","packet":"N0CALL>APRS:=4903.50N/07201.75W\\088/036/270/724","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"df_bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"range_miles":4,"quality_code":4,"accuracy_less_than_deg":32,"usable":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"quality_code":4}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.range_miles","$.df_bearing.usable","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-043","title":"DF quality 5","profile":"core-1.1","source":"APRS101 pp. 30, 34-35","packet":"N0CALL>APRS:=4903.50N/07201.75W\\088/036/270/725","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"df_bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"range_miles":4,"quality_code":5,"accuracy_less_than_deg":16,"usable":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"quality_code":5}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.range_miles","$.df_bearing.usable","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-044","title":"DF quality 6","profile":"core-1.1","source":"APRS101 pp. 30, 34-35","packet":"N0CALL>APRS:=4903.50N/07201.75W\\088/036/270/726","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"df_bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"range_miles":4,"quality_code":6,"accuracy_less_than_deg":8,"usable":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"quality_code":6}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.range_miles","$.df_bearing.usable","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-045","title":"DF quality 7","profile":"core-1.1","source":"APRS101 pp. 30, 34-35","packet":"N0CALL>APRS:=4903.50N/07201.75W\\088/036/270/727","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"df_bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"range_miles":4,"quality_code":7,"accuracy_less_than_deg":4,"usable":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"quality_code":7}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.range_miles","$.df_bearing.usable","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-046","title":"DF quality 8","profile":"core-1.1","source":"APRS101 pp. 30, 34-35","packet":"N0CALL>APRS:=4903.50N/07201.75W\\088/036/270/728","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"df_bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"range_miles":4,"quality_code":8,"accuracy_less_than_deg":2,"usable":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"quality_code":8}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.range_miles","$.df_bearing.usable","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-047","title":"DF quality 9","profile":"core-1.1","source":"APRS101 pp. 30, 34-35","packet":"N0CALL>APRS:=4903.50N/07201.75W\\088/036/270/729","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"df_bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"range_miles":4,"quality_code":9,"accuracy_less_than_deg":1,"usable":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"bearing":{"bearing_deg":270,"hits_code":7,"range_code":2,"quality_code":9}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.range_miles","$.df_bearing.usable","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-048","title":"DF special NRQ 000","profile":"core-1.1","source":"APRS101 pp. 30, 34","packet":"N0CALL>APRS:!4903.50N/07201.75W\\000/000/270/000","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"station_fixed":true,"speed_knots":0},"df_bearing":{"bearing_deg":270,"nrq_raw":"000","nrq_meaningful":false,"manual":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"speed_knots":0},"bearing":{"bearing_deg":270}}}},"unmapped":["$.df_bearing.manual","$.df_bearing.nrq_meaningful","$.df_bearing.nrq_raw","$.motion.station_fixed","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-049","title":"DF special NRQ 949","profile":"core-1.1","source":"APRS101 pp. 30, 34","packet":"N0CALL>APRS:!4903.50N/07201.75W\\000/000/270/949","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"\\","overlay":null},"comment":"","motion":{"station_fixed":true,"speed_knots":0},"df_bearing":{"bearing_deg":270,"nrq_raw":"949","nrq_meaningful":true,"manual":true,"range_miles":16,"accuracy_less_than_deg":1}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"\\"},"extensions":{"motion":{"speed_knots":0},"bearing":{"bearing_deg":270}}}},"unmapped":["$.df_bearing.accuracy_less_than_deg","$.df_bearing.manual","$.df_bearing.nrq_meaningful","$.df_bearing.nrq_raw","$.df_bearing.range_miles","$.motion.station_fixed","$.symbol.overlay","$.symbol.table"]} +{"id":"EXT-050","title":"DF suffix without DF symbol","profile":"core-1.1","source":"APRS101 p. 34","packet":"N0CALL>APRS:!4903.50N/07201.75W>088/036/270/729","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"/270/729","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672}},"note":"Do not promote the comment suffix to a DF bearing without /\\.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"/270/729","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"course_deg":88,"speed_knots":36}}}},"unmapped":["$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} diff --git a/packages/aprs/tests/vectors/fap.jsonl b/packages/aprs/tests/vectors/fap.jsonl new file mode 100644 index 0000000..f98ebb6 --- /dev/null +++ b/packages/aprs/tests/vectors/fap.jsonl @@ -0,0 +1,517 @@ +{"id":"FAP-001","title":"TestAPRSISPathIPv6AfterQConstruct","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/aprsis_paths_test.go#L9","packet":"IQ3VQ>APD225,TCPIP*,qAI,IQ3VQ,THIRD,92E5A2B6,T2HUB1,200106F8020204020000000000000002,T2FINLAND:!4526.66NI01104.68E#PHG21306/- Lnx APRS Srv - sez. ARI VR EST","outcome":"accept","source_expected":{"fap_header":{"source":"IQ3VQ","destination":"APD225","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAI","WasDigied":false},{"Call":"IQ3VQ","WasDigied":false},{"Call":"THIRD","WasDigied":false},{"Call":"92E5A2B6","WasDigied":false},{"Call":"T2HUB1","WasDigied":false},{"Call":"200106F8020204020000000000000002","WasDigied":false},{"Call":"T2FINLAND","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":45.44433333333333,"Longitude":11.078,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"I","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"21306","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"- Lnx APRS Srv - sez. ARI VR EST","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"IQ3VQ","destination":"APD225","path":[{"address":"TCPIP","repeated":true},{"address":"qAI","repeated":false},{"address":"IQ3VQ","repeated":false},{"address":"THIRD","repeated":false},{"address":"92E5A2B6","repeated":false},{"address":"T2HUB1","repeated":false},{"address":"200106F8020204020000000000000002","repeated":false},{"address":"T2FINLAND","repeated":false}]},"payload":{"type":"position","comment":"- Lnx APRS Srv - sez. ARI VR EST","messaging":false,"latitude_deg":45.44433333333333,"longitude_deg":11.078,"ambiguity":0,"symbol":{"table_id":"I","code":"#"},"extensions":{"phg":{"power_w":4,"height_haat_ft":20,"gain_dbi":3,"directivity_deg":null,"rate_per_hour":6}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-002","title":"TestAPRSISPathIPv6BeforeQConstruct","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/aprsis_paths_test.go#L23","packet":"IQ3VQ>APD225,200106F8020204020000000000000002,TCPIP*,qAI,IQ3VQ,THIRD,92E5A2B6,T2HUB1,200106F8020204020000000000000002,T2FINLAND:!4526.66NI01104.68E#PHG21306/- Lnx APRS Srv - sez. ARI VR EST","outcome":"reject","source_expected":{"fap_header":{"source":"IQ3VQ","destination":"APD225","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: digicall_badchars: digipeater callsign contains bad characters"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"IQ3VQ>APD225,200106F8020204020000000000000002,TCPIP*,qAI,IQ3VQ,THIRD,92E5A2B6,T2HUB1,200106F8020204020000000000000002,T2FINLAND:!4526.66NI01104.68E#PHG21306/- Lnx APRS Srv - sez. ARI VR EST"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-003","title":"TestDial","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/aprsis_test.go#L77","packet":"N0CALL-1>APRS:;LEADER *092345z4903.50N/07201.75W>088/036","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"object","Format":"uncompressed","Latitude":49.05833333333333,"Longitude":-72.02916666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":66.672,"Course":88,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"LEADER ","ItemName":"","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"LEADER","alive":true,"latitude_deg":49.05833333333333,"longitude_deg":-72.02916666666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":35.99999999999999,"course_deg":88}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.ItemName","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-004","title":"TestDial","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/aprsis_test.go#L77","packet":"N0CALL-1>APRS:)AID #2!4903.50N/07201.75WA","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"item","Format":"uncompressed","Latitude":49.05833333333333,"Longitude":-72.02916666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"A","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"AID #2","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"AID #2","alive":true,"latitude_deg":49.05833333333333,"longitude_deg":-72.02916666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"A"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-005","title":"TestDial","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/aprsis_test.go#L77","packet":"N0CALL-2>TQ4W2V,WIDE2-1,qAo,IGATE:`c51!f?>/]\"3x}=","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-2","destination":"TQ4W2V","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"mice","Latitude":41.78766666666667,"Longitude":-71.42016666666666,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":105.56400000000001,"Course":35,"Altitude":6,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"110","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"]=","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-2","destination":"TQ4W2V","path":[{"address":"WIDE2-1","repeated":false},{"address":"qAo","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"mic_e","comment":"","latitude_deg":41.78766666666667,"longitude_deg":-71.42016666666666,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"device_code":"]=","extensions":{"motion":{"speed_knots":57.0,"course_deg":35},"altitude":{"encoding":"mic_e","measurement":{"unit":"meters","value":6}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["APRS 1.2 Mic-E type codes end the status text with a declared version suffix (\"=\" after \"]\" is the TM-D710); it is part of device_code, not comment text."]} +{"id":"FAP-006","title":"TestWithAX25/valid_AX.25_packet","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"OH7LZB-9>APX200,OH7AA-1*,WIDE2-1:!6028.51N/02505.68E#PHG7220/RELAY,WIDE, OH7LZB testing","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB-9","destination":"APX200","digipeaters":[{"Call":"OH7AA-1","WasDigied":true},{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"7220","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"RELAY,WIDE, OH7LZB testing","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7LZB-9","destination":"APX200","path":[{"address":"OH7AA-1","repeated":true},{"address":"WIDE2-1","repeated":false}]},"payload":{"type":"position","comment":"RELAY,WIDE, OH7LZB testing","messaging":false,"latitude_deg":60.47516666666667,"longitude_deg":25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-007","title":"TestWithAX25/valid_AX.25_no_digipeaters","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"OH7LZB>APRS:>status","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"status","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"status","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7LZB","destination":"APRS","path":[]},"payload":{"type":"status","text":"status"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-008","title":"TestWithAX25/invalid_AX.25_source_callsign","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"TOOLONGCALLSIGN>APRS:>status","outcome":"reject","source_expected":{"fap_header":{"source":"TOOLONGCALLSIGN","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: srccall_noax25: source callsign is not a valid AX.25 call"},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"original_wire":"TOOLONGCALLSIGN>APRS:>status"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-009","title":"TestWithAX25/source_SSID_too_large_for_AX.25","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"OH7LZB-16>APRS:>status","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB-16","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: srccall_noax25: source callsign is not a valid AX.25 call"},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB-16>APRS:>status"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-010","title":"TestWithAX25/invalid_AX.25_digipeater_callsign","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"OH7LZB>APRS,TOOLONGCALLSIGN:>status","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: digicall_noax25: digipeater callsign is not a valid AX.25 call"},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS,TOOLONGCALLSIGN:>status"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-011","title":"TestWithAX25/too_many_path_components_for_AX.25","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"OH7LZB>APRS,D1,D2,D3,D4,D5,D6,D7,D8,D9:>status","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: dstpath_toomany: too many path components for AX.25"},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS,D1,D2,D3,D4,D5,D6,D7,D8,D9:>status"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-012","title":"TestWithAX25/max_8_digipeaters_is_valid","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"OH7LZB>APRS,D1,D2,D3,D4,D5,D6,D7,D8:>status","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":[{"Call":"D1","WasDigied":false},{"Call":"D2","WasDigied":false},{"Call":"D3","WasDigied":false},{"Call":"D4","WasDigied":false},{"Call":"D5","WasDigied":false},{"Call":"D6","WasDigied":false},{"Call":"D7","WasDigied":false},{"Call":"D8","WasDigied":false}]},"fap_fields":{"Type":"status","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"status","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7LZB","destination":"APRS","path":[{"address":"D1","repeated":false},{"address":"D2","repeated":false},{"address":"D3","repeated":false},{"address":"D4","repeated":false},{"address":"D5","repeated":false},{"address":"D6","repeated":false},{"address":"D7","repeated":false},{"address":"D8","repeated":false}]},"payload":{"type":"status","text":"status"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-013","title":"TestWithAX25/source_callsign_normalized_to_uppercase","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"oh7lzb>APRS:>status","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"status","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"status","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"oh7lzb","destination":"APRS","path":[]},"payload":{"type":"status","text":"status"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"],"divergence":["Callsigns keep the case transmitted; FAP uppercases them."]} +{"id":"FAP-014","title":"TestWithAX25/invalid_AX.25_destination_callsign","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"OH7LZB>TOOLONGDST:>status","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: dstcall_noax25: destination callsign is not a valid AX.25 call"},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>TOOLONGDST:>status"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-015","title":"TestWithAX25/destination_SSID_too_large_for_AX.25","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"OH7LZB>APRS-16:>status","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: dstcall_noax25: destination callsign is not a valid AX.25 call"},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS-16:>status"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-016","title":"TestWithAX25/destination_callsign_normalized_to_uppercase","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L92","packet":"OH7LZB>aprs:>status","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"status","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"status","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7LZB","destination":"aprs","path":[]},"payload":{"type":"status","text":"status"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"],"divergence":["Callsigns keep the case transmitted; FAP uppercases them."]} +{"id":"FAP-017","title":"TestDstCallNoAX25WithoutOption","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/ax25_option_test.go#L132","packet":"OH7LZB>TOOLONGDST:>status","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: dstcall_noax25: destination callsign is not a valid AX.25 call"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>TOOLONGDST:>status"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-018","title":"TestBadPacketCorruptedPosition","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/badpacket_test.go#L14","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:!60ff.51N/0250akh3r99hfae","outcome":"reject","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: loc_inv: invalid latitude: invalid minutes: invalid character at position 2: f"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:!60ff.51N/0250akh3r99hfae"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-019","title":"TestBadPacketBadSrcCall","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/badpacket_test.go#L42","packet":"K6IFR_S>APJS10,TCPIP*,qAC,K6IFR-BS:;K6IFR B *250300z3351.79ND11626.40WaRNG0040 440 Voice 447.140 -5.00 Mhz","outcome":"reject","source_expected":{"fap_header":{"source":"K6IFR_S","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: srccall_badchars: source callsign contains bad characters"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"K6IFR_S>APJS10,TCPIP*,qAC,K6IFR-BS:;K6IFR B *250300z3351.79ND11626.40WaRNG0040 440 Voice 447.140 -5.00 Mhz"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-020","title":"TestBadPacketBadDigiCall","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/badpacket_test.go#L58","packet":"SV2BRF-6>APU25N,TCPXX*,qAX,SZ8L_GREE:=/:$U#T<:G- BVagelis, qrv:434.350, tsq:77 {UIV32N}","outcome":"reject","source_expected":{"fap_header":{"source":"SV2BRF-6","destination":"APU25N","digipeaters":[{"Call":"TCPXX","WasDigied":true},{"Call":"qAX","WasDigied":false}]},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: digicall_badchars: digipeater callsign contains bad characters"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"SV2BRF-6>APU25N,TCPXX*,qAX,SZ8L_GREE:=/:$U#T<:G- BVagelis, qrv:434.350, tsq:77 {UIV32N}"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-021","title":"TestBadPacketBadSymbolTable","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/badpacket_test.go#L74","packet":"ASDF>DSALK,OH2RDG*,WIDE:!6028.51N,02505.68E#","outcome":"reject","source_expected":{"fap_header":{"source":"ASDF","destination":"DSALK","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":null,"PosAmbiguity":0,"PosResolution":null,"SymbolTable":",","SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: sym_inv_table: invalid symbol table: ,"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"ASDF>DSALK,OH2RDG*,WIDE:!6028.51N,02505.68E#"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-022","title":"TestBadPacketExperimental","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/badpacket_test.go#L87","packet":"ASDF>DSALK,OH2RDG*,WIDE:{{ unsupported experimental format","outcome":"reject","source_expected":{"fap_header":{"source":"ASDF","destination":"DSALK","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: exp_unsupp: unsupported experimental packet"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","original_wire":"ASDF>DSALK,OH2RDG*,WIDE:{{ unsupported experimental format","payload":{"type":"user_defined","user_id":"{","user_type":" ","data":"unsupported experimental format"}},"divergence":["'{' is APRS101's user-defined data type, so this decodes as user-defined data; FAP rejects experimental formats."]} +{"id":"FAP-023","title":"TestBeacon/non-APRS","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/beacon_test.go#L13","packet":"OH2RDU>UIDIGI: UIDIGI 1.9","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDU","destination":"UIDIGI","digipeaters":null},"fap_fields":{"Type":"beacon","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDU","destination":"UIDIGI","path":[]},"payload":{"type":"beacon"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-024","title":"TestBeacon/all_beacon_destinations/ID","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/beacon_test.go#L34","packet":"OH2RDU>ID:hello world","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDU","destination":"ID","digipeaters":null},"fap_fields":{"Type":"beacon","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDU","destination":"ID","path":[]},"payload":{"type":"beacon"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-025","title":"TestBeacon/all_beacon_destinations/BEACON","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/beacon_test.go#L34","packet":"OH2RDU>BEACON:hello world","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDU","destination":"BEACON","digipeaters":null},"fap_fields":{"Type":"beacon","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDU","destination":"BEACON","path":[]},"payload":{"type":"beacon"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-026","title":"TestBeacon/all_beacon_destinations/UIDIGI","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/beacon_test.go#L34","packet":"OH2RDU>UIDIGI:hello world","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDU","destination":"UIDIGI","digipeaters":null},"fap_fields":{"Type":"beacon","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDU","destination":"UIDIGI","path":[]},"payload":{"type":"beacon"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-027","title":"TestBeacon/all_beacon_destinations/CQ","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/beacon_test.go#L34","packet":"OH2RDU>CQ:hello world","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDU","destination":"CQ","digipeaters":null},"fap_fields":{"Type":"beacon","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDU","destination":"CQ","path":[]},"payload":{"type":"beacon"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-028","title":"TestBeacon/beacon_with_position_fallback","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/beacon_test.go#L48","packet":"OH2RDU>BEACON:testing!6028.51N/02505.68E#PHG2360","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDU","destination":"BEACON","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"2360","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDU","destination":"BEACON","path":[]},"payload":{"type":"legacy_position","prefix":"testing","position":{"comment":"","messaging":false,"latitude_deg":60.47516666666667,"longitude_deg":25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":4,"height_haat_ft":80,"gain_dbi":6,"directivity_deg":null}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-029","title":"TestCompressedNonMoving","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/compressed_test.go#L15","packet":"OH2KKU-15>APRS,TCPIP*,qAC,FOURTH:!I0-X;T_Wv&{-Aigate testing","outcome":"accept","source_expected":{"fap_header":{"source":"OH2KKU-15","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"FOURTH","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"compressed","Latitude":60.052010101699544,"Longitude":24.504507437140035,"PosAmbiguity":null,"PosResolution":0.291,"SymbolTable":"I","SymbolCode":"&","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":8.10520393696385,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":1,"ChecksumOK":null,"Comment":"igate testing","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2KKU-15","destination":"APRS","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"FOURTH","repeated":false}]},"payload":{"type":"position","comment":"igate testing","messaging":false,"latitude_deg":60.052010101699544,"longitude_deg":24.504507437140035,"symbol":{"table_id":"I","code":"&"},"extensions":{"range":{"miles":5.036340233637961}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-030","title":"TestCompressedMoving","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/compressed_test.go#L107","packet":"OH2LCQ-10>APZMDR,WIDE3-2,qAo,OH2MQK-1:!//zPHTfVv>!V_ Tero, Green Volvo 960, GGL-880|!!!!!!!!!!!!!!|","outcome":"accept","source_expected":{"fap_header":{"source":"OH2LCQ-10","destination":"APZMDR","digipeaters":[{"Call":"WIDE3-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH2MQK-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"compressed","Latitude":60.35823493276909,"Longitude":24.808377480140507,"PosAmbiguity":null,"PosResolution":0.291,"SymbolTable":"/","SymbolCode":">","Speed":107.56883463739969,"Course":360,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":0,"Vals":[0,0,0,0,0],"Bits":"00000000"},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":1,"ChecksumOK":null,"Comment":"Tero, Green Volvo 960, GGL-880","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"OH2LCQ-10","destination":"APZMDR","path":[{"address":"WIDE3-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH2MQK-1","repeated":false}]},"payload":{"type":"position","comment":" Tero, Green Volvo 960, GGL-880","messaging":false,"latitude_deg":60.35823493276909,"longitude_deg":24.808377480140507,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":58.08252410226765,"course_deg":0},"telemetry":{"sequence":0,"analog":[0,0,0,0,0],"digital":[false,false,false,false,false,false,false,false]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["A compressed course byte of 0 is reported as 0 degrees, as transmitted; FAP rewrites it to 360.","Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-031","title":"TestCompressedTooShort","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/compressed_test.go#L196","packet":"KJ4ERJ-AL>APWW05,TCPIP*,qAC,FOURTH:@075111h/@@.Y:*lol ","outcome":"reject","source_expected":{"fap_header":{"source":"KJ4ERJ-AL","destination":"APWW05","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"FOURTH","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"compressed","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: comp_short: compressed position too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"original_wire":"KJ4ERJ-AL>APWW05,TCPIP*,qAC,FOURTH:@075111h/@@.Y:*lol "},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-032","title":"TestCompressedWeather","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/compressed_test.go#L206","packet":"SV4IKL-2>APU25N,WIDE2-2,qAR,SV6EXB-1:@011444z/:JF!T/W-_e!bg001t054r000p010P010h65b10073WS 2300 {UIV32N}","outcome":"accept","source_expected":{"fap_header":{"source":"SV4IKL-2","destination":"APU25N","digipeaters":[{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"SV6EXB-1","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"compressed","Latitude":39.64333492594362,"Longitude":22.417167638858984,"PosAmbiguity":null,"PosResolution":0.291,"SymbolTable":"/","SymbolCode":"_","Speed":0,"Course":272,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":null,"WindSpeed":null,"WindGust":0.44704,"Temp":12.222222222222221,"TempIn":null,"Humidity":65,"HumidityIn":null,"Pressure":1007.3,"Rain1h":0,"Rain24h":2.54,"RainMidnight":2.54,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":0,"ChecksumOK":null,"Comment":"WS 2300 {UIV32N}","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"SV4IKL-2","destination":"APU25N","path":[{"address":"WIDE2-2","repeated":false},{"address":"qAR","repeated":false},{"address":"SV6EXB-1","repeated":false}]},"payload":{"type":"position","comment":"WS 2300 {UIV32N}","messaging":true,"latitude_deg":39.64333492594362,"longitude_deg":22.417167638858984,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"gust":{"value":1.0,"unit":"mph"},"temperature":{"value":54.0,"unit":"fahrenheit"},"humidity":{"value":65,"unit":"percent"},"pressure":{"value":1007.3,"unit":"hPa"},"rain_1h":{"value":0.0,"unit":"inches"},"rain_24h":{"value":0.1,"unit":"inches"},"rain_since_midnight":{"value":0.1,"unit":"inches"},"wind_direction":{"value":272,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"knots"}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-033","title":"TestCompressedWeatherSpaceGust","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/compressed_test.go#L255","packet":"SV4IKL-2>APU25N,WIDE2-2,qAR,SV6EXB-1:@011444z/:JF!T/W-_e!bg t054r000p010P010h65b10073WS 2300 {UIV32N}","outcome":"accept","source_expected":{"fap_header":{"source":"SV4IKL-2","destination":"APU25N","digipeaters":[{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"SV6EXB-1","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"compressed","Latitude":39.64333492594362,"Longitude":22.417167638858984,"PosAmbiguity":null,"PosResolution":0.291,"SymbolTable":"/","SymbolCode":"_","Speed":0,"Course":272,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":null,"WindSpeed":null,"WindGust":null,"Temp":12.222222222222221,"TempIn":null,"Humidity":65,"HumidityIn":null,"Pressure":1007.3,"Rain1h":0,"Rain24h":2.54,"RainMidnight":2.54,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":0,"ChecksumOK":null,"Comment":"WS 2300 {UIV32N}","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"SV4IKL-2","destination":"APU25N","path":[{"address":"WIDE2-2","repeated":false},{"address":"qAR","repeated":false},{"address":"SV6EXB-1","repeated":false}]},"payload":{"type":"position","comment":"WS 2300 {UIV32N}","messaging":true,"latitude_deg":39.64333492594362,"longitude_deg":22.417167638858984,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"temperature":{"value":54.0,"unit":"fahrenheit"},"humidity":{"value":65,"unit":"percent"},"pressure":{"value":1007.3,"unit":"hPa"},"rain_1h":{"value":0.0,"unit":"inches"},"rain_24h":{"value":0.1,"unit":"inches"},"rain_since_midnight":{"value":0.1,"unit":"inches"},"wind_direction":{"value":272,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"knots"}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-034","title":"TestDAOUncompressedHumanReadable","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/dao_test.go#L13","packet":"K0ELR-15>APOT02,WIDE1-1,WIDE2-1,qAo,K0ELR:/102033h4133.03NX09029.49Wv204/000!W33! 12.3V 21C/A=000665","outcome":"accept","source_expected":{"fap_header":{"source":"K0ELR-15","destination":"APOT02","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"K0ELR","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":41.55055,"Longitude":-90.49155,"PosAmbiguity":0,"PosResolution":1.852,"SymbolTable":"X","SymbolCode":"v","Speed":0,"Course":204,"Altitude":202.692,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"12.3V 21C","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"K0ELR-15","destination":"APOT02","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-1","repeated":false},{"address":"qAo","repeated":false},{"address":"K0ELR","repeated":false}]},"payload":{"type":"position","comment":" 12.3V 21C","messaging":false,"latitude_deg":41.55055,"longitude_deg":-90.49155,"ambiguity":0,"symbol":{"table_id":"X","code":"v"},"extensions":{"motion":{"speed_knots":0.0,"course_deg":204},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":665.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-035","title":"TestDAOCompressedBase91","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/dao_test.go#L53","packet":"OH7LZB-9>APZMDR,WIDE2-2,qAo,OH2RCH:!/0(yiTc5y>{2O http://aprs.fi/!w11!","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB-9","destination":"APZMDR","digipeaters":[{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH2RCH","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"compressed","Latitude":60.15273087861335,"Longitude":24.662220910798077,"PosAmbiguity":null,"PosResolution":0.1852,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":11.909203712770884,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":1,"ChecksumOK":null,"Comment":"http://aprs.fi/","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"OH7LZB-9","destination":"APZMDR","path":[{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH2RCH","repeated":false}]},"payload":{"type":"position","comment":" http://aprs.fi/","messaging":false,"latitude_deg":60.15273087861335,"longitude_deg":24.662220910798077,"symbol":{"table_id":"/","code":">"},"extensions":{"range":{"miles":7.400036109601728}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-036","title":"TestDAOMicEBase91","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/dao_test.go#L87","packet":"OH2JCQ-9>VP1U88,TRACE2-2,qAR,OH2RDK-5:'5'9\"^Rj/]\"4-}Foo !w66!Bar","outcome":"accept","source_expected":{"fap_header":{"source":"OH2JCQ-9","destination":"VP1U88","digipeaters":[{"Call":"TRACE2-2","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"OH2RDK-5","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"mice","Latitude":60.26470512820512,"Longitude":25.18820512820513,"PosAmbiguity":0,"PosResolution":0.1852,"SymbolTable":"/","SymbolCode":"j","Speed":122.232,"Course":254,"Altitude":22,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"110","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"]Foo Bar","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"OH2JCQ-9","destination":"VP1U88","path":[{"address":"TRACE2-2","repeated":false},{"address":"qAR","repeated":false},{"address":"OH2RDK-5","repeated":false}]},"payload":{"type":"mic_e","comment":"Foo Bar","latitude_deg":60.26470512820512,"longitude_deg":25.18820512820513,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"device_code":"]","extensions":{"motion":{"speed_knots":66.0,"course_deg":254},"altitude":{"encoding":"mic_e","measurement":{"unit":"meters","value":22}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-037","title":"TestParseStatus","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L12","packet":"OH7LZB>APRS:>Testing status","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"status","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"Testing status","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7LZB","destination":"APRS","path":[]},"payload":{"type":"status","text":"Testing status"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-038","title":"TestParseNoBody","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L27","packet":"OH7LZB>APRS","outcome":"reject","source_expected":{"fap_header":{"source":"","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: packet_no_body: no packet body after header"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-039","title":"TestParseNoGT","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L35","packet":"OH7LZB:body","outcome":"reject","source_expected":{"fap_header":{"source":"","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: srccall_nogt: no '>' in header"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-040","title":"TestParseErrors/no_colon","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7LZB>APRS","outcome":"reject","source_expected":{"fap_header":{"source":"","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: packet_no_body: no packet body after header"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-041","title":"TestParseErrors/empty_body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7LZB>APRS:","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: packet_no_body: packet body is empty"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS:"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-042","title":"TestParseErrors/no_>_in_header","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7LZB:body","outcome":"reject","source_expected":{"fap_header":{"source":"","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: srccall_nogt: no '>' in header"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-043","title":"TestParseErrors/empty_source_callsign","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":">APRS:body","outcome":"reject","source_expected":{"fap_header":{"source":"","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: srccall_empty: source callsign is empty"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":">APRS:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-044","title":"TestParseErrors/source_callsign_bad_chars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7_LZB>APRS:body","outcome":"reject","source_expected":{"fap_header":{"source":"OH7_LZB","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: srccall_badchars: source callsign contains bad characters"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7_LZB>APRS:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-045","title":"TestParseErrors/source_callsign_not_valid_AX.25","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"TOOLONGCALL>APRS:body","outcome":"reject","source_expected":{"fap_header":{"source":"TOOLONGCALL","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: srccall_noax25: source callsign is not a valid AX.25 call"},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"original_wire":"TOOLONGCALL>APRS:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-046","title":"TestParseErrors/empty_destination","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7LZB>:body","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: dstcall_empty: destination callsign is empty"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-047","title":"TestParseErrors/destination_not_valid_AX.25","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7LZB>!!!:body","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: dstcall_noax25: destination callsign is not a valid AX.25 call"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>!!!:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-048","title":"TestParseErrors/too_many_path_components_for_AX.25","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7LZB>APRS,A,B,C,D,E,F,G,H,I:body","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: dstpath_toomany: too many path components for AX.25"},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS,A,B,C,D,E,F,G,H,I:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-049","title":"TestParseErrors/empty_digipeater_callsign","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7LZB>APRS,,WIDE:body","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: digi_empty: empty digipeater callsign"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS,,WIDE:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-050","title":"TestParseErrors/empty_digipeater_after_star","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7LZB>APRS,*:body","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: digi_empty: empty digipeater callsign"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS,*:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-051","title":"TestParseErrors/digipeater_bad_chars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7LZB>APRS,WI_DE:body","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: digicall_badchars: digipeater callsign contains bad characters"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS,WI_DE:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-052","title":"TestParseErrors/digipeater_not_valid_AX.25","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L163","packet":"OH7LZB>APRS,TOOLONGCALL:body","outcome":"reject","source_expected":{"fap_header":{"source":"OH7LZB","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: digicall_noax25: digipeater callsign is not a valid AX.25 call"},"options":{"accept_broken_mice":false,"ax25":true,"raw_timestamp":false},"expected":{"original_wire":"OH7LZB>APRS,TOOLONGCALL:body"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-053","title":"TestItemAlive","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/item_test.go#L18","packet":"N0CALL-1>APRS:)AID #2!4903.50N/07201.75WA","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"item","Format":"uncompressed","Latitude":49.05833333333333,"Longitude":-72.02916666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"A","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"AID #2","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"AID #2","alive":true,"latitude_deg":49.05833333333333,"longitude_deg":-72.02916666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"A"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-054","title":"TestItemKilled","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/item_test.go#L57","packet":"N0CALL-1>APRS:)AID #2_4903.50N/07201.75WA","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"item","Format":"uncompressed","Latitude":49.05833333333333,"Longitude":-72.02916666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"A","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"AID #2","Alive":false,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"AID #2","alive":false,"latitude_deg":49.05833333333333,"longitude_deg":-72.02916666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"A"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-055","title":"TestItemShortName","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/item_test.go#L76","packet":"N0CALL-1>APRS:)X1Y!4903.50N/07201.75WA","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"item","Format":"uncompressed","Latitude":49.05833333333333,"Longitude":-72.02916666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"A","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"X1Y","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"X1Y","alive":true,"latitude_deg":49.05833333333333,"longitude_deg":-72.02916666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"A"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-056","title":"TestItemMaxLengthName","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/item_test.go#L92","packet":"N0CALL-15>APRS,TCPIP*,qAC,T2TEST:)MyRadio99!4327.00N/00119.00WlMyRadio99","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-15","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"T2TEST","WasDigied":false}]},"fap_fields":{"Type":"item","Format":"uncompressed","Latitude":43.45,"Longitude":-1.3166666666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"l","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"MyRadio99","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"MyRadio99","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-15","destination":"APRS","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"T2TEST","repeated":false}]},"payload":{"type":"item","comment":"MyRadio99","name":"MyRadio99","alive":true,"latitude_deg":43.45,"longitude_deg":-1.3166666666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"l"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-057","title":"TestItemTooShort","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/item_test.go#L114","packet":"N0CALL-1>APRS:)short","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"item","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: item_short: item packet too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL-1>APRS:)short"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-058","title":"TestItemCompressedPosition","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/item_test.go#L129","packet":"N0CALL-1>APRS:)TEST!/0%E/Th4_/ A","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"item","Format":"compressed","Latitude":60.23049358668088,"Longitude":24.878968618576835,"PosAmbiguity":null,"PosResolution":0.291,"SymbolTable":"/","SymbolCode":"/","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"TEST","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"TEST","alive":true,"latitude_deg":60.23049358668088,"longitude_deg":24.878968618576835,"symbol":{"table_id":"/","code":"/"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-059","title":"TestItemWithCourseSpeed","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/item_test.go#L168","packet":"N0CALL-1>APRS:)MOBILE!4903.50N/07201.75W>088/036","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"item","Format":"uncompressed","Latitude":49.05833333333333,"Longitude":-72.02916666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":66.672,"Course":88,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"MOBILE","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"MOBILE","alive":true,"latitude_deg":49.05833333333333,"longitude_deg":-72.02916666666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":35.99999999999999,"course_deg":88}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-060","title":"TestItemErrors/too_short","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/item_test.go#L207","packet":"N0CALL-1>APRS:)SH!1234","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"item","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: item_short: item packet too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL-1>APRS:)SH!1234"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-061","title":"TestItemErrors/no_name_terminator","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/item_test.go#L207","packet":"N0CALL-1>APRS:)ABCDEFGHIJ4903.50N/07201.75W>","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"item","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: item_inv: item name terminator not found"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL-1>APRS:)ABCDEFGHIJ4903.50N/07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-062","title":"TestBinaryCleanASCII","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB : !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz}{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz}","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz}","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-063","title":"TestBinaryCleanSet1","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB : !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ab{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ab","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ab","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-064","title":"TestBinaryCleanSet2","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :cdefghijklmnopqrstuvwxyz}\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"cdefghijklmnopqrstuvwxyz}\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"cdefghijklmnopqrstuvwxyz}\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-065","title":"TestBinaryCleanSet3","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-066","title":"TestBinaryCleanSet4","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-067","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: {42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: ","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: ","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-068","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: !{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: !","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: !","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-069","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \"{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \"","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \"","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-070","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: #{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: #","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: #","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-071","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: ${42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: $","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: $","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-072","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: %{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: %","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: %","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-073","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: &{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: &","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: &","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-074","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: '{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: '","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: '","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-075","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: ({42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: (","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: (","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-076","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: ){42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: )","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: )","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-077","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: *{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: *","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: *","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-078","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: +{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: +","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: +","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-079","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: ,{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: ,","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: ,","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-080","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: -{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: -","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: -","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-081","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: .{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: .","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: .","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-082","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: /{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: /","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: /","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-083","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: 0{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: 0","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: 0","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-084","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: 1{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: 1","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: 1","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-085","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: 2{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: 2","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: 2","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-086","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: 3{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: 3","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: 3","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-087","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: 4{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: 4","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: 4","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-088","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: 5{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: 5","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: 5","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-089","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: 6{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: 6","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: 6","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-090","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: 7{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: 7","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: 7","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-091","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: 8{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: 8","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: 8","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-092","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: 9{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: 9","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: 9","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-093","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: :{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: :","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: :","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-094","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: ;{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: ;","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: ;","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-095","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: <{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: <","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: <","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-096","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: ={42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: =","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: =","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-097","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: >{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: >","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: >","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-098","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: ?{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: ?","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: ?","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-099","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: @{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: @","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: @","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-100","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: A{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: A","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: A","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-101","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: B{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: B","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: B","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-102","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: C{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: C","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: C","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-103","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: D{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: D","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: D","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-104","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: E{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: E","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: E","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-105","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: F{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: F","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: F","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-106","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: G{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: G","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: G","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-107","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: H{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: H","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: H","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-108","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: I{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: I","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: I","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-109","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: J{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: J","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: J","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-110","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: K{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: K","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: K","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-111","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: L{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: L","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: L","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-112","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: M{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: M","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: M","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-113","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: N{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: N","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: N","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-114","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: O{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: O","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: O","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-115","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: P{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: P","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: P","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-116","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: Q{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: Q","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: Q","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-117","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: R{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: R","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: R","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-118","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: S{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: S","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: S","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-119","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: T{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: T","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: T","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-120","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: U{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: U","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: U","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-121","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: V{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: V","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: V","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-122","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: W{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: W","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: W","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-123","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: X{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: X","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: X","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-124","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: Y{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: Y","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: Y","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-125","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: Z{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: Z","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: Z","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-126","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: [{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: [","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: [","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-127","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \\{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \\","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \\","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-128","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: ]{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: ]","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: ]","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-129","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: ^{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: ^","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: ^","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-130","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: _{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: _","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: _","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-131","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: `{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: `","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: `","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-132","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: a{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: a","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: a","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-133","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: b{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: b","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: b","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-134","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: c{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: c","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: c","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-135","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: d{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: d","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: d","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-136","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: e{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: e","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: e","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-137","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: f{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: f","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: f","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-138","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: g{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: g","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: g","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-139","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: h{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: h","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: h","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-140","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: i{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: i","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: i","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-141","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: j{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: j","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: j","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-142","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: k{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: k","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: k","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-143","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: l{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: l","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: l","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-144","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: m{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: m","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: m","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-145","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: n{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: n","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: n","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-146","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: o{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: o","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: o","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-147","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: p{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: p","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: p","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-148","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: q{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: q","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: q","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-149","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: r{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: r","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: r","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-150","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: s{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: s","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: s","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-151","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: t{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: t","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: t","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-152","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: u{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: u","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: u","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-153","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: v{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: v","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: v","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-154","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: w{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: w","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: w","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-155","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: x{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: x","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: x","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-156","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: y{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: y","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: y","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-157","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: z{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: z","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: z","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-158","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: {42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: ","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: ","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-159","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: {42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: ","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: ","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-160","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: }{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: }","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: }","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-161","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: {42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: ","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: ","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-162","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0080{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0080","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0080","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-163","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0081{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0081","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0081","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-164","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0082{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0082","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0082","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-165","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0083{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0083","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0083","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-166","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0084{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0084","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0084","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-167","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0085{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0085","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0085","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-168","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0086{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0086","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0086","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-169","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0087{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0087","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0087","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-170","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0088{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0088","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0088","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-171","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0089{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0089","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0089","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-172","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u008a{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u008a","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u008a","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-173","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u008b{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u008b","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u008b","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-174","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u008c{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u008c","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u008c","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-175","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u008d{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u008d","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u008d","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-176","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u008e{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u008e","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u008e","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-177","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u008f{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u008f","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u008f","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-178","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0090{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0090","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0090","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-179","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0091{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0091","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0091","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-180","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0092{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0092","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0092","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-181","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0093{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0093","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0093","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-182","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0094{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0094","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0094","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-183","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0095{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0095","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0095","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-184","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0096{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0096","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0096","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-185","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0097{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0097","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0097","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-186","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0098{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0098","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0098","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-187","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u0099{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u0099","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u0099","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-188","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u009a{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u009a","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u009a","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-189","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u009b{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u009b","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u009b","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-190","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u009c{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u009c","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u009c","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-191","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u009d{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u009d","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u009d","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-192","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u009e{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u009e","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u009e","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-193","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u009f{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u009f","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u009f","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-194","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00a0{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00a0","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00a0","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-195","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00a1{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00a1","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00a1","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-196","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00a2{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00a2","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00a2","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-197","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00a3{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00a3","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00a3","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-198","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00a4{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00a4","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00a4","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-199","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00a5{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00a5","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00a5","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-200","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00a6{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00a6","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00a6","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-201","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00a7{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00a7","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00a7","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-202","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00a8{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00a8","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00a8","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-203","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00a9{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00a9","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00a9","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-204","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00aa{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00aa","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00aa","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-205","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ab{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ab","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ab","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-206","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ac{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ac","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ac","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-207","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ad{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ad","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ad","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-208","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ae{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ae","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ae","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-209","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00af{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00af","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00af","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-210","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00b0{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00b0","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00b0","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-211","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00b1{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00b1","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00b1","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-212","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00b2{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00b2","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00b2","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-213","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00b3{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00b3","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00b3","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-214","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00b4{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00b4","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00b4","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-215","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00b5{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00b5","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00b5","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-216","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00b6{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00b6","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00b6","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-217","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00b7{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00b7","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00b7","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-218","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00b8{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00b8","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00b8","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-219","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00b9{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00b9","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00b9","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-220","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ba{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ba","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ba","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-221","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00bb{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00bb","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00bb","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-222","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00bc{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00bc","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00bc","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-223","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00bd{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00bd","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00bd","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-224","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00be{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00be","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00be","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-225","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00bf{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00bf","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00bf","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-226","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00c0{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00c0","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00c0","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-227","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00c1{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00c1","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00c1","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-228","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00c2{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00c2","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00c2","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-229","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00c3{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00c3","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00c3","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-230","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00c4{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00c4","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00c4","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-231","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00c5{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00c5","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00c5","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-232","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00c6{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00c6","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00c6","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-233","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00c7{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00c7","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00c7","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-234","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00c8{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00c8","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00c8","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-235","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00c9{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00c9","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00c9","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-236","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ca{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ca","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ca","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-237","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00cb{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00cb","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00cb","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-238","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00cc{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00cc","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00cc","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-239","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00cd{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00cd","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00cd","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-240","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ce{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ce","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ce","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-241","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00cf{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00cf","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00cf","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-242","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00d0{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00d0","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00d0","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-243","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00d1{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00d1","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00d1","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-244","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00d2{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00d2","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00d2","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-245","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00d3{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00d3","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00d3","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-246","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00d4{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00d4","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00d4","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-247","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00d5{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00d5","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00d5","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-248","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00d6{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00d6","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00d6","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-249","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00d7{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00d7","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00d7","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-250","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00d8{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00d8","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00d8","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-251","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00d9{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00d9","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00d9","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-252","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00da{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00da","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00da","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-253","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00db{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00db","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00db","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-254","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00dc{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00dc","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00dc","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-255","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00dd{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00dd","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00dd","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-256","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00de{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00de","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00de","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-257","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00df{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00df","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00df","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-258","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00e0{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00e0","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00e0","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-259","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00e1{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00e1","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00e1","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-260","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00e2{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00e2","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00e2","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-261","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00e3{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00e3","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00e3","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-262","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00e4{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00e4","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00e4","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-263","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00e5{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00e5","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00e5","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-264","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00e6{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00e6","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00e6","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-265","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00e7{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00e7","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00e7","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-266","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00e8{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00e8","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00e8","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-267","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00e9{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00e9","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00e9","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-268","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ea{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ea","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ea","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-269","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00eb{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00eb","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00eb","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-270","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ec{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ec","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ec","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-271","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ed{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ed","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ed","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-272","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ee{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ee","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ee","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-273","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00ef{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00ef","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00ef","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-274","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00f0{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00f0","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00f0","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-275","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00f1{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00f1","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00f1","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-276","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00f2{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00f2","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00f2","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-277","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00f3{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00f3","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00f3","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-278","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00f4{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00f4","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00f4","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-279","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00f5{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00f5","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00f5","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-280","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00f6{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00f6","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00f6","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-281","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00f7{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00f7","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00f7","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-282","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00f8{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00f8","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00f8","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-283","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00f9{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00f9","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00f9","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-284","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00fa{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00fa","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00fa","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-285","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00fb{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00fb","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00fb","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-286","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00fc{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00fc","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00fc","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-287","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00fd{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00fd","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00fd","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-288","title":"TestBinaryCleanIndividualChars","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_binary_clean_test.go#L31","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::OH7LZB :char: \u00fe{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"OH7LZB","Text":"char: \u00fe","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"scope_note":"Contains 8-bit bytes preserved by FAP; not evidence that non-ASCII message text conforms to APRS101.","expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"OH7LZB","text":"char: \u00fe","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-289","title":"TestMessageNormal/id_1","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L17","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{1","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"1","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"1"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-290","title":"TestMessageNormal/id_42","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L17","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-291","title":"TestMessageNormal/id_10512","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L17","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{10512","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"10512","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"10512"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-292","title":"TestMessageNormal/id_a","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L17","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{a","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"a","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"a"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-293","title":"TestMessageNormal/id_1Ff84","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L17","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{1Ff84","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"1Ff84","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"1Ff84"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-294","title":"TestMessageNormal/id_F00b4","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L17","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{F00b4","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"F00b4","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"F00b4"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-295","title":"TestMessageReplyAckEmpty/id_1","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L48","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{1}","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"1","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"1"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-296","title":"TestMessageReplyAckEmpty/id_42","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L48","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{42}","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-297","title":"TestMessageReplyAckEmpty/id_10512","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L48","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{10512}","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"10512","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"10512"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-298","title":"TestMessageReplyAckEmpty/id_a","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L48","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{a}","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"a","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"a"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-299","title":"TestMessageReplyAckEmpty/id_1Ff84","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L48","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{1Ff84}","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"1Ff84","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"1Ff84"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-300","title":"TestMessageReplyAckEmpty/id_F00b4","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L48","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{F00b4}","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"F00b4","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"F00b4"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-301","title":"TestMessageReplyAck/id_1","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L76","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{1}f001","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"1","AckID":"f001","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"1","reply_ack":"f001"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.Message.RejID","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-302","title":"TestMessageReplyAck/id_42","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L76","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{42}f001","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"42","AckID":"f001","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"42","reply_ack":"f001"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.Message.RejID","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-303","title":"TestMessageReplyAck/id_10512","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L76","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{10512}f001","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"10512","AckID":"f001","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"10512","reply_ack":"f001"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.Message.RejID","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-304","title":"TestMessageReplyAck/id_a","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L76","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{a}f001","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"a","AckID":"f001","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"a","reply_ack":"f001"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.Message.RejID","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-305","title":"TestMessageReplyAck/id_1Ff84","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L76","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{1Ff84}f001","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"1Ff84","AckID":"f001","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"1Ff84","reply_ack":"f001"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.Message.RejID","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-306","title":"TestMessageReplyAck/id_F00b4","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L76","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Testing, 1 2 3{F00b4}f001","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"F00b4","AckID":"f001","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"F00b4","reply_ack":"f001"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.Message.RejID","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-307","title":"TestMessageAck/id_1","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L103","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :ack1","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"1","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"1","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-308","title":"TestMessageAck/id_42","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L103","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :ack42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"42","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"42","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-309","title":"TestMessageAck/id_10512","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L103","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :ack10512","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"10512","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"10512","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-310","title":"TestMessageAck/id_a","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L103","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :acka","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"a","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"a","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-311","title":"TestMessageAck/id_1Ff84","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L103","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :ack1Ff84","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"1Ff84","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"1Ff84","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-312","title":"TestMessageAck/id_F00b4","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L103","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :ackF00b4","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"F00b4","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"F00b4","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-313","title":"TestMessageReject/id_1","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L127","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :rej1","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"1"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"1","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-314","title":"TestMessageReject/id_42","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L127","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :rej42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"42"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"42","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-315","title":"TestMessageReject/id_10512","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L127","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :rej10512","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"10512"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"10512","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-316","title":"TestMessageReject/id_a","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L127","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :reja","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"a"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"a","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-317","title":"TestMessageReject/id_1Ff84","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L127","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :rej1Ff84","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"1Ff84"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"1Ff84","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-318","title":"TestMessageReject/id_F00b4","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L127","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :rejF00b4","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"F00b4"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"F00b4","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-319","title":"TestMessageNoID","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L151","packet":"OH7AA-1>APRS,WIDE1-1,WIDE2-2,qAo,OH7AA::N0CALL :Hello world","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Hello world","ID":"","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"message","addressee":"N0CALL","text":"Hello world","message_id":null}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-320","title":"TestEncodeMessageNormal/id_1","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L193","packet":"OH7AA-1>APRS::N0CALL :Testing, 1 2 3{1","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"1","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"1"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-321","title":"TestEncodeMessageNormal/id_42","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L193","packet":"OH7AA-1>APRS::N0CALL :Testing, 1 2 3{42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"42","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"42"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-322","title":"TestEncodeMessageNormal/id_10512","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L193","packet":"OH7AA-1>APRS::N0CALL :Testing, 1 2 3{10512","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"10512","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"10512"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-323","title":"TestEncodeMessageNormal/id_a","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L193","packet":"OH7AA-1>APRS::N0CALL :Testing, 1 2 3{a","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"a","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"a"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-324","title":"TestEncodeMessageNormal/id_1Ff84","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L193","packet":"OH7AA-1>APRS::N0CALL :Testing, 1 2 3{1Ff84","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"1Ff84","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"1Ff84"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-325","title":"TestEncodeMessageNormal/id_F00b4","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L193","packet":"OH7AA-1>APRS::N0CALL :Testing, 1 2 3{F00b4","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"F00b4","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"F00b4"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-326","title":"TestEncodeMessageAck/id_1","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L226","packet":"OH7AA-1>APRS::N0CALL :ack1","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"1","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"1","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-327","title":"TestEncodeMessageAck/id_42","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L226","packet":"OH7AA-1>APRS::N0CALL :ack42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"42","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"42","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-328","title":"TestEncodeMessageAck/id_10512","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L226","packet":"OH7AA-1>APRS::N0CALL :ack10512","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"10512","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"10512","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-329","title":"TestEncodeMessageAck/id_a","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L226","packet":"OH7AA-1>APRS::N0CALL :acka","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"a","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"a","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-330","title":"TestEncodeMessageAck/id_1Ff84","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L226","packet":"OH7AA-1>APRS::N0CALL :ack1Ff84","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"1Ff84","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"1Ff84","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-331","title":"TestEncodeMessageAck/id_F00b4","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L226","packet":"OH7AA-1>APRS::N0CALL :ackF00b4","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"F00b4","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"F00b4","rejected":false}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-332","title":"TestEncodeMessageReject/id_1","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L253","packet":"OH7AA-1>APRS::N0CALL :rej1","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"1"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"1","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-333","title":"TestEncodeMessageReject/id_42","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L253","packet":"OH7AA-1>APRS::N0CALL :rej42","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"42"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"42","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-334","title":"TestEncodeMessageReject/id_10512","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L253","packet":"OH7AA-1>APRS::N0CALL :rej10512","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"10512"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"10512","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-335","title":"TestEncodeMessageReject/id_a","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L253","packet":"OH7AA-1>APRS::N0CALL :reja","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"a"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"a","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-336","title":"TestEncodeMessageReject/id_1Ff84","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L253","packet":"OH7AA-1>APRS::N0CALL :rej1Ff84","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"1Ff84"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"1Ff84","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-337","title":"TestEncodeMessageReject/id_F00b4","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L253","packet":"OH7AA-1>APRS::N0CALL :rejF00b4","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"","ID":"","AckID":"","RejID":"F00b4"},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"N0CALL","message_id":"F00b4","rejected":true}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-338","title":"TestEncodeMessageReplyAck/id_1_ack_abc","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L292","packet":"OH7AA-1>APRS::N0CALL :Testing, 1 2 3{1}abc","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"1","AckID":"abc","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"1","reply_ack":"abc"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.Message.RejID","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-339","title":"TestEncodeMessageReplyAck/id_42_ack_ab","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L292","packet":"OH7AA-1>APRS::N0CALL :Testing, 1 2 3{42}ab","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"42","AckID":"ab","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"42","reply_ack":"ab"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.Message.RejID","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-340","title":"TestEncodeMessageReplyAck/id_ab_ack_cd","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L292","packet":"OH7AA-1>APRS::N0CALL :Testing, 1 2 3{ab}cd","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"ab","AckID":"cd","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"ab","reply_ack":"cd"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.Message.RejID","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-341","title":"TestEncodeMessageReplyAck/id_abc_ack_d","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L292","packet":"OH7AA-1>APRS::N0CALL :Testing, 1 2 3{abc}d","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Testing, 1 2 3","ID":"abc","AckID":"d","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Testing, 1 2 3","message_id":"abc","reply_ack":"d"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.Message.RejID","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-342","title":"TestEncodeMessageNoID","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L323","packet":"OH7AA-1>APRS::N0CALL :Hello world","outcome":"accept","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Hello world","ID":"","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7AA-1","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Hello world","message_id":null}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-343","title":"TestMessageErrors/too_short","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L444","packet":"OH7AA-1>APRS::N0CALL ","outcome":"reject","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: msg_short: message packet too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7AA-1>APRS::N0CALL "},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-344","title":"TestMessageErrors/missing_colon_after_addressee","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/message_test.go#L444","packet":"OH7AA-1>APRS::N0CALL XHello world","outcome":"reject","source_expected":{"fap_header":{"source":"OH7AA-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: msg_inv: message addressee field malformed"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH7AA-1>APRS::N0CALL XHello world"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-345","title":"TestMicENonMoving","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L13","packet":"OH7LZB-13>SX15S6,TCPIP*,qAC,FOURTH:'I',l \u001c>/]","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB-13","destination":"SX15S6","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"FOURTH","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"mice","Latitude":-38.256,"Longitude":145.186,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":0,"Course":0,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"110","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"]","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7LZB-13","destination":"SX15S6","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"FOURTH","repeated":false}]},"payload":{"type":"mic_e","comment":"","latitude_deg":-38.256,"longitude_deg":145.186,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"device_code":"]","extensions":{"motion":{"speed_knots":0.0,"course_deg":0}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-346","title":"TestMicEMoving","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L108","packet":"OH7LZB-2>TQ4W2V,WIDE2-1,qAo,OH7LZB:`c51!f?>/]\"3x}=","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB-2","destination":"TQ4W2V","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7LZB","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"mice","Latitude":41.78766666666667,"Longitude":-71.42016666666666,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":105.56400000000001,"Course":35,"Altitude":6,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"110","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"]=","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH7LZB-2","destination":"TQ4W2V","path":[{"address":"WIDE2-1","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7LZB","repeated":false}]},"payload":{"type":"mic_e","comment":"","latitude_deg":41.78766666666667,"longitude_deg":-71.42016666666666,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"device_code":"]=","extensions":{"motion":{"speed_knots":57.0,"course_deg":35},"altitude":{"encoding":"mic_e","measurement":{"unit":"meters","value":6}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["APRS 1.2 Mic-E type codes end the status text with a declared version suffix (\"=\" after \"]\" is the TM-D710); it is part of device_code, not comment text."]} +{"id":"FAP-347","title":"TestMicEHexTelemetry5Ch","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L208","packet":"OZ2BRN-4>5U2V08,WIDE2-1,qAo,OH7LZB:`c51!f?>/'102030FFff commeeeent","outcome":"accept","source_expected":{"fap_header":{"source":"OZ2BRN-4","destination":"5U2V08","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7LZB","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"mice","Latitude":55.434666666666665,"Longitude":71.42016666666666,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":105.56400000000001,"Course":35,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":0,"Vals":[16,32,48,255,255],"Bits":""},"Capabilities":null,"MBits":"010","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"commeeeent","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OZ2BRN-4","destination":"5U2V08","path":[{"address":"WIDE2-1","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7LZB","repeated":false}]},"payload":{"type":"mic_e","comment":" commeeeent","latitude_deg":55.434666666666665,"longitude_deg":71.42016666666666,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":57.0,"course_deg":35},"telemetry":{"sequence":null,"analog":[16,32,48,255,255]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Mic-E hex telemetry carries no sequence number, so none is reported; FAP reports 0.","Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-348","title":"TestMicEHexTelemetry2Ch","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L237","packet":"OZ2BRN-4>5U2V08,WIDE2-1,qAo,OH7LZB:`c51!f?>/'1020 commeeeent","outcome":"accept","source_expected":{"fap_header":{"source":"OZ2BRN-4","destination":"5U2V08","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7LZB","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"mice","Latitude":55.434666666666665,"Longitude":71.42016666666666,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":105.56400000000001,"Course":35,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":0,"Vals":[16,0,32],"Bits":""},"Capabilities":null,"MBits":"010","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"commeeeent","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OZ2BRN-4","destination":"5U2V08","path":[{"address":"WIDE2-1","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7LZB","repeated":false}]},"payload":{"type":"mic_e","comment":"1020 commeeeent","latitude_deg":55.434666666666665,"longitude_deg":71.42016666666666,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":57.0,"course_deg":35}},"device_code":"'"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["APRS 1.2 redefines a leading ` or ' as a Mic-E type byte; APRS101 hex telemetry needs the complete form (10 hex digits after '), so this is a type code followed by comment text. FAP reads two channels."]} +{"id":"FAP-349","title":"TestMicEMangled","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L267","packet":"KD0KZE>TUPX9R,RS0ISS*,qAR,K0GDI-6:'yaIl -/]Greetings via ISS=","outcome":"accept","source_expected":{"fap_header":{"source":"KD0KZE","destination":"TUPX9R","digipeaters":[{"Call":"RS0ISS","WasDigied":true},{"Call":"qAR","WasDigied":false},{"Call":"K0GDI-6","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"mice","Latitude":45.148666666666664,"Longitude":-93.1575,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"-","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"111","MiceMangled":true,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"]Greetings via ISS=","Warnings":null}},"options":{"accept_broken_mice":true,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"KD0KZE>TUPX9R,RS0ISS*,qAR,K0GDI-6:'yaIl -/]Greetings via ISS=","type":"malformed"},"unmapped":[],"divergence":["A byte was lost in transit, so the symbol table is invalid; FAP's accept_broken_mice option guesses the repair, while the public parser reports the packet as Malformed."]} +{"id":"FAP-350","title":"TestMicEErrors/destination_too_short","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L334","packet":"N0CALL>AB:`c51!f?>/","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"AB","digipeaters":null},"fap_fields":{"Type":"location","Format":"mice","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: mice_inv_dstcall: Mic-E destination callsign too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>AB:`c51!f?>/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-351","title":"TestMicEErrors/info_field_too_short","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L334","packet":"N0CALL>SX15S6:`short","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"SX15S6","digipeaters":null},"fap_fields":{"Type":"location","Format":"mice","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: mice_short: Mic-E information field too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>SX15S6:`short"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-352","title":"TestMicEErrors/invalid_destination_character","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L334","packet":"N0CALL>SX1MS6:`c51!f?>/","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"SX1MS6","digipeaters":null},"fap_fields":{"Type":"location","Format":"mice","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: mice_inv_dstcall: invalid Mic-E destination character: M"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>SX1MS6:`c51!f?>/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-353","title":"TestMicEErrors/invalid_symbol_table","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L334","packet":"OZ2BRN-4>5U2V08,OZ3RIN-3,OZ4DIA-2*,WIDE2-1,qAR,DB0KUE:`'O5U2V08,OZ3RIN-3,OZ4DIA-2*,WIDE2-1,qAR,DB0KUE:`'OAB:`c51!f?>/","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"AB","digipeaters":null},"fap_fields":{"Type":"location","Format":"mice","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: mice_short: mangled Mic-E packet too short"},"options":{"accept_broken_mice":true,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>AB:`c51!f?>/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-355","title":"TestMicEMangledErrors/invalid_info_field","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L370","packet":"N0CALL>SX15S6:`c51!f?>\u0001","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"SX15S6","digipeaters":null},"fap_fields":{"Type":"location","Format":"mice","Latitude":-38.256,"Longitude":171.42016666666666,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"\u0001","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"110","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: mice_inv_infofield: invalid Mic-E information field"},"options":{"accept_broken_mice":true,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>SX15S6:`c51!f?>\u0001"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-356","title":"TestMicEMangledErrors/invalid_destination_character","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/mice_test.go#L370","packet":"N0CALL>SX1MS6:`@@@@ >/","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"SX1MS6","digipeaters":null},"fap_fields":{"Type":"location","Format":"mice","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":true,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: mice_inv_dstcall: invalid Mic-E destination character"},"options":{"accept_broken_mice":true,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>SX1MS6:`@@@@ >/"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-357","title":"TestGPRMC","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L17","packet":"N0CALL-11>APRS,DIGI*,WIDE2-1,qAR,IGATE:$GPRMC,145526,A,3349.0378,N,08406.2617,W,23.726,27.9,121207,4.9,W*7A","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-11","destination":"APRS","digipeaters":[{"Call":"DIGI","WasDigied":true},{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":33.817296666666664,"Longitude":-84.10436166666666,"PosAmbiguity":null,"PosResolution":0.1852,"SymbolTable":null,"SymbolCode":null,"Speed":43.940552000000004,"Course":28,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":true,"Comment":"","Warnings":null,"Timestamp":"2007-12-12T14:55:26Z"}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-11","destination":"APRS","path":[{"address":"DIGI","repeated":true},{"address":"WIDE2-1","repeated":false},{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"nmea","sentence":{"type":"rmc","coordinates":{"latitude_deg":33.817296666666664,"longitude_deg":-84.10436166666666},"speed_knots":23.726,"course_deg":27.9},"symbol":{"table_id":"/","code":"O"},"metadata":{"checksum_valid":true}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Timestamp","$.fap_fields.Warnings"],"divergence":["NMEA course keeps the transmitted precision; FAP rounds to whole degrees.","APRS101 assigns a default symbol from the source SSID when NMEA has no symbol destination (SSID 11 is the balloon, /O); FAP reports no symbol."]} +{"id":"FAP-358","title":"TestGPRMCNoFix","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L99","packet":"SRC>APRS,WIDE1-1,GATE,qAR,GATE-1:$GPRMC,041518,V,,,,,,,230309,,*33","outcome":"reject","source_expected":{"fap_header":{"source":"SRC","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"GATE","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"GATE-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":true,"Comment":"","Warnings":null},"fap_error":"fap: gprmc_nofix: GPRMC: no valid fix"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"SRC>APRS,WIDE1-1,GATE,qAR,GATE-1:$GPRMC,041518,V,,,,,,,230309,,*33"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-359","title":"TestGPGGA","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L111","packet":"N0CALL-11>APRS,WIDE2-1,qAR,IGATE:$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,47.0,M,,*4F","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-11","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":48.1173,"Longitude":11.516666666666667,"PosAmbiguity":null,"PosResolution":1.852,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":545.4,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":true,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-11","destination":"APRS","path":[{"address":"WIDE2-1","repeated":false},{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"nmea","sentence":{"type":"gga","coordinates":{"latitude_deg":48.1173,"longitude_deg":11.516666666666667},"altitude_msl_m":545.4},"symbol":{"table_id":"/","code":"O"},"metadata":{"checksum_valid":true}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["APRS101 assigns a default symbol from the source SSID when NMEA has no symbol destination (SSID 11 is the balloon, /O); FAP reports no symbol."]} +{"id":"FAP-360","title":"TestGPGGANoFix","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L171","packet":"N0CALL-11>APRS,WIDE2-1,qAR,IGATE:$GPGGA,123519,4807.038,N,01131.000,E,0,08,0.9,545.4,M,47.0,M,,*48","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL-11","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: NMEA checksum mismatch"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL-11>APRS,WIDE2-1,qAR,IGATE:$GPGGA,123519,4807.038,N,01131.000,E,0,08,0.9,545.4,M,47.0,M,,*48"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-361","title":"TestGPGLL","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L183","packet":"N0CALL-11>APRS,WIDE2-1,qAR,IGATE:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-11","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":49.274166666666666,"Longitude":-123.18533333333333,"PosAmbiguity":null,"PosResolution":18.52,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":true,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-11","destination":"APRS","path":[{"address":"WIDE2-1","repeated":false},{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"nmea","sentence":{"type":"gll","coordinates":{"latitude_deg":49.274166666666666,"longitude_deg":-123.18533333333333}},"symbol":{"table_id":"/","code":"O"},"metadata":{"checksum_valid":true}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["APRS101 assigns a default symbol from the source SSID when NMEA has no symbol destination (SSID 11 is the balloon, /O); FAP reports no symbol."]} +{"id":"FAP-362","title":"TestGPGLLMinimal","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L239","packet":"N0CALL-11>APRS,WIDE2-1,qAR,IGATE:$GPGLL,4916.45,N,12311.12,W","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-11","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":49.274166666666666,"Longitude":-123.18533333333333,"PosAmbiguity":null,"PosResolution":18.52,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL-11>APRS,WIDE2-1,qAR,IGATE:$GPGLL,4916.45,N,12311.12,W","type":"malformed"},"unmapped":[],"divergence":["This GLL sentence has no time or fix status, which the GLL model requires and the parser does not invent, so it is Malformed; FAP accepts the coordinates alone."]} +{"id":"FAP-363","title":"TestParseNMEAErrors/not_starting_with_$GP","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L339","packet":"N0CALL>APRS,WIDE2-1:$XXXXX,A,B,C","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: NMEA sentence must start with $GP"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","original_wire":"N0CALL>APRS,WIDE2-1:$XXXXX,A,B,C","payload":{"type":"opaque","information":"$XXXXX,A,B,C","diagnostic":{"code":"unsupported","path":"$"}}},"divergence":["Unknown NMEA sentences are kept as opaque data with an 'unsupported' diagnostic, not rejected."]} +{"id":"FAP-364","title":"TestParseNMEAErrors/checksum_mismatch","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L339","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,23.726,27.9,121207,4.9,W*FF","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: NMEA checksum mismatch"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,23.726,27.9,121207,4.9,W*FF"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-365","title":"TestParseNMEAErrors/too_few_fields","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L339","packet":"N0CALL>APRS,WIDE2-1:$GPXXX","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_short: NMEA sentence too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPXXX"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-366","title":"TestParseNMEAErrors/unsupported_sentence","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L339","packet":"N0CALL>APRS,WIDE2-1:$GPVTG,0,T,0,M,0,N,0,K","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: unsupported NMEA sentence: $GPVTG"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","original_wire":"N0CALL>APRS,WIDE2-1:$GPVTG,0,T,0,M,0,N,0,K","payload":{"type":"nmea","sentence":{"type":"vtg","course_true_deg":0.0,"course_magnetic_deg":0.0,"speed_knots":0.0,"speed_kmh_reported":0.0},"metadata":{"talker":"GP","checksum_supplied":null,"checksum_valid":null,"fields_raw":["0","T","0","M","0","N","0","K"]},"position_usable":false,"symbol":null,"comment":""}},"divergence":["$GPVTG is a supported NMEA sentence (course and speed only, so no usable position); FAP rejects it."]} +{"id":"FAP-367","title":"TestParseGPRMCErrors/too_few_fields","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L394","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,23.726,27.9","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_short: GPRMC sentence too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,23.726,27.9"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-368","title":"TestParseGPRMCErrors/no_fix","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L394","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,V,3349.0378,N,08406.2617,W,23.726,27.9,121207,4.9,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: gprmc_nofix: GPRMC: no valid fix"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,V,3349.0378,N,08406.2617,W,23.726,27.9,121207,4.9,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-369","title":"TestParseGPRMCErrors/invalid_latitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L394","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,XXXX.XXXX,N,08406.2617,W,23.726,27.9,121207,4.9,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null,"Timestamp":"2007-12-12T14:55:26Z"},"fap_error":"fap: pos_lat_inv: GPRMC: invalid degrees: strconv.ParseFloat: parsing \"XX\": invalid syntax"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,XXXX.XXXX,N,08406.2617,W,23.726,27.9,121207,4.9,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-370","title":"TestParseGPRMCErrors/empty_latitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L394","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,,N,08406.2617,W,23.726,27.9,121207,4.9,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null,"Timestamp":"2007-12-12T14:55:26Z"},"fap_error":"fap: pos_lat_inv: GPRMC: empty coordinate or hemisphere"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,,N,08406.2617,W,23.726,27.9,121207,4.9,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-371","title":"TestParseGPRMCErrors/invalid_longitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L394","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,XXXXX.XXXX,W,23.726,27.9,121207,4.9,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":33.817296666666664,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null,"Timestamp":"2007-12-12T14:55:26Z"},"fap_error":"fap: pos_lon_inv: GPRMC: invalid degrees: strconv.ParseFloat: parsing \"XXX\": invalid syntax"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,XXXXX.XXXX,W,23.726,27.9,121207,4.9,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-372","title":"TestParseGPRMCErrors/empty_longitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L394","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,,W,23.726,27.9,121207,4.9,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":33.817296666666664,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null,"Timestamp":"2007-12-12T14:55:26Z"},"fap_error":"fap: pos_lon_inv: GPRMC: empty coordinate or hemisphere"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,,W,23.726,27.9,121207,4.9,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-373","title":"TestParseGPGGAErrors/too_few_fields","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L447","packet":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_short: GPGGA sentence too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-374","title":"TestParseGPGGAErrors/no_fix","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L447","packet":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,4807.038,N,01131.000,E,0,08,0.9,545.4,M,47.0,M,,","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPGGA: no valid fix"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,4807.038,N,01131.000,E,0,08,0.9,545.4,M,47.0,M,,"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-375","title":"TestParseGPGGAErrors/invalid_latitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L447","packet":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,XXXX.XXX,N,01131.000,E,1,08,0.9,545.4,M,47.0,M,,","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: pos_lat_inv: GPGGA: invalid degrees: strconv.ParseFloat: parsing \"XX\": invalid syntax"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,XXXX.XXX,N,01131.000,E,1,08,0.9,545.4,M,47.0,M,,"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-376","title":"TestParseGPGGAErrors/empty_latitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L447","packet":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,,N,01131.000,E,1,08,0.9,545.4,M,47.0,M,,","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: pos_lat_inv: GPGGA: empty coordinate or hemisphere"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,,N,01131.000,E,1,08,0.9,545.4,M,47.0,M,,"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-377","title":"TestParseGPGGAErrors/invalid_longitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L447","packet":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,4807.038,N,XXXXX.XXX,E,1,08,0.9,545.4,M,47.0,M,,","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":48.1173,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: pos_lon_inv: GPGGA: invalid degrees: strconv.ParseFloat: parsing \"XXX\": invalid syntax"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,4807.038,N,XXXXX.XXX,E,1,08,0.9,545.4,M,47.0,M,,"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-378","title":"TestParseGPGGAErrors/empty_longitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L447","packet":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,4807.038,N,,E,1,08,0.9,545.4,M,47.0,M,,","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":48.1173,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: pos_lon_inv: GPGGA: empty coordinate or hemisphere"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGGA,123519,4807.038,N,,E,1,08,0.9,545.4,M,47.0,M,,"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-379","title":"TestParseGPGLLErrors/too_few_fields","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L494","packet":"N0CALL>APRS,WIDE2-1:$GPGLL,4916.45,N,12311.12","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_short: GPGLL sentence too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGLL,4916.45,N,12311.12"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-380","title":"TestParseGPGLLErrors/invalid_latitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L494","packet":"N0CALL>APRS,WIDE2-1:$GPGLL,XXXX.XX,N,12311.12,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: pos_lat_inv: GPGLL: invalid degrees: strconv.ParseFloat: parsing \"XX\": invalid syntax"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGLL,XXXX.XX,N,12311.12,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-381","title":"TestParseGPGLLErrors/empty_latitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L494","packet":"N0CALL>APRS,WIDE2-1:$GPGLL,,N,12311.12,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: pos_lat_inv: GPGLL: empty coordinate or hemisphere"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGLL,,N,12311.12,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-382","title":"TestParseGPGLLErrors/invalid_longitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L494","packet":"N0CALL>APRS,WIDE2-1:$GPGLL,4916.45,N,XXXXX.XX,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":49.274166666666666,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: pos_lon_inv: GPGLL: invalid degrees: strconv.ParseFloat: parsing \"XXX\": invalid syntax"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGLL,4916.45,N,XXXXX.XX,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-383","title":"TestParseGPGLLErrors/empty_longitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L494","packet":"N0CALL>APRS,WIDE2-1:$GPGLL,4916.45,N,,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":49.274166666666666,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: pos_lon_inv: GPGLL: empty coordinate or hemisphere"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPGLL,4916.45,N,,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-384","title":"TestParseGPRMCTimestampErrors/time_too_short","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,1234,A,3349.0378,N,08406.2617,W,0,0,121207,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid time"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,1234,A,3349.0378,N,08406.2617,W,0,0,121207,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-385","title":"TestParseGPRMCTimestampErrors/time_too_long","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,12345678,A,3349.0378,N,08406.2617,W,0,0,121207,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid time"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,12345678,A,3349.0378,N,08406.2617,W,0,0,121207,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-386","title":"TestParseGPRMCTimestampErrors/time_empty","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,,A,3349.0378,N,08406.2617,W,0,0,121207,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid time"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,,A,3349.0378,N,08406.2617,W,0,0,121207,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-387","title":"TestParseGPRMCTimestampErrors/hour_non-numeric","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,XX0000,A,3349.0378,N,08406.2617,W,0,0,121207,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid time"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,XX0000,A,3349.0378,N,08406.2617,W,0,0,121207,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-388","title":"TestParseGPRMCTimestampErrors/hour_24","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,240000,A,3349.0378,N,08406.2617,W,0,0,121207,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid time"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,240000,A,3349.0378,N,08406.2617,W,0,0,121207,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-389","title":"TestParseGPRMCTimestampErrors/minute_non-numeric","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,12XX00,A,3349.0378,N,08406.2617,W,0,0,121207,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid time"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,12XX00,A,3349.0378,N,08406.2617,W,0,0,121207,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-390","title":"TestParseGPRMCTimestampErrors/minute_60","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,126000,A,3349.0378,N,08406.2617,W,0,0,121207,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid time"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,126000,A,3349.0378,N,08406.2617,W,0,0,121207,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-391","title":"TestParseGPRMCTimestampErrors/second_non-numeric","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,1200XX,A,3349.0378,N,08406.2617,W,0,0,121207,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid time"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,1200XX,A,3349.0378,N,08406.2617,W,0,0,121207,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-392","title":"TestParseGPRMCTimestampErrors/second_60","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,120060,A,3349.0378,N,08406.2617,W,0,0,121207,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid time"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,120060,A,3349.0378,N,08406.2617,W,0,0,121207,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-393","title":"TestParseGPRMCTimestampErrors/date_too_short","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,1212,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid date"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,1212,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-394","title":"TestParseGPRMCTimestampErrors/date_too_long","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,12120712,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid date"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,12120712,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-395","title":"TestParseGPRMCTimestampErrors/date_empty","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid date"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-396","title":"TestParseGPRMCTimestampErrors/day_non-numeric","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,XX1207,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid date"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,XX1207,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-397","title":"TestParseGPRMCTimestampErrors/month_non-numeric","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,12XX07,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid date"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,12XX07,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-398","title":"TestParseGPRMCTimestampErrors/year_non-numeric","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/nmea_test.go#L540","packet":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,1212XX,0,W","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"WIDE2-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"nmea","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: nmea_invalid: GPRMC: invalid date"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL>APRS,WIDE2-1:$GPRMC,145526,A,3349.0378,N,08406.2617,W,0,0,1212XX,0,W"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-399","title":"TestObjectInvalidBroken","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/object_inv_test.go#L16","packet":"OH2KKU-1>APRS,TCPIP*,qAC,FIRST:;SRAL HQ *110507zS0%E/Th4_a AKaupinmaenpolku9,open M-Th12-17,F12-14 lcl","outcome":"reject","source_expected":{"fap_header":{"source":"OH2KKU-1","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"FIRST","WasDigied":false}]},"fap_fields":{"Type":"object","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"SRAL HQ *","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: obj_inv: invalid object alive/killed indicator: 1"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH2KKU-1>APRS,TCPIP*,qAC,FIRST:;SRAL HQ *110507zS0%E/Th4_a AKaupinmaenpolku9,open M-Th12-17,F12-14 lcl"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-400","title":"TestObjectCompressed","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/object_test.go#L16","packet":"N0CALL-1>APRS,TCPIP*,qAC,FIRST:;SRAL HQ *100927zS0%E/Th4_a AKaupinmaenpolku9,open M-Th12-17,F12-14 lcl","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"FIRST","WasDigied":false}]},"fap_fields":{"Type":"object","Format":"compressed","Latitude":60.23049358668088,"Longitude":24.878968618576835,"PosAmbiguity":null,"PosResolution":0.291,"SymbolTable":"S","SymbolCode":"a","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"SRAL HQ ","ItemName":"","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"Kaupinmaenpolku9,open M-Th12-17,F12-14 lcl","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"FIRST","repeated":false}]},"payload":{"type":"object","comment":"Kaupinmaenpolku9,open M-Th12-17,F12-14 lcl","name":"SRAL HQ","alive":true,"latitude_deg":60.23049358668088,"longitude_deg":24.878968618576835,"symbol":{"table_id":"S","code":"a"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.ItemName","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-401","title":"TestObjectUncompressed","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/object_test.go#L71","packet":"N0CALL-1>APRS:;LEADER *092345z4903.50N/07201.75W>088/036","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"object","Format":"uncompressed","Latitude":49.05833333333333,"Longitude":-72.02916666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":66.672,"Course":88,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"LEADER ","ItemName":"","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"LEADER","alive":true,"latitude_deg":49.05833333333333,"longitude_deg":-72.02916666666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":35.99999999999999,"course_deg":88}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.ItemName","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-402","title":"TestObjectKilled","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/object_test.go#L117","packet":"N0CALL-1>APRS:;LEADER _092345z4903.50N/07201.75W>088/036","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"object","Format":"uncompressed","Latitude":49.05833333333333,"Longitude":-72.02916666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":66.672,"Course":88,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"LEADER ","ItemName":"","Alive":false,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"LEADER","alive":false,"latitude_deg":49.05833333333333,"longitude_deg":-72.02916666666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":35.99999999999999,"course_deg":88}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.ItemName","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-403","title":"TestObjectErrors/too_short","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/object_test.go#L153","packet":"N0CALL-1>APRS:;SHORT","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"object","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: obj_short: object packet too short"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL-1>APRS:;SHORT"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-404","title":"TestObjectErrors/invalid_alive/killed_indicator","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/object_test.go#L153","packet":"N0CALL-1>APRS:;LEADER X092345z4903.50N/07201.75W>","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"object","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"LEADER ","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: obj_inv: invalid object alive/killed indicator: X"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"N0CALL-1>APRS:;LEADER X092345z4903.50N/07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-405","title":"TestFallbackUncompressed","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_fallback_test.go#L15","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:hoponassualku!6028.51S/02505.68W#PHG7220/RELAY,WIDE, OH2AP Jarvenpaa","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":-60.47516666666667,"Longitude":-25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"7220","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"RELAY,WIDE, OH2AP Jarvenpaa","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"OH2RDG","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"legacy_position","prefix":"hoponassualku","position":{"comment":"RELAY,WIDE, OH2AP Jarvenpaa","messaging":false,"latitude_deg":-60.47516666666667,"longitude_deg":-25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-406","title":"TestFallbackCompressed","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_fallback_test.go#L44","packet":"OH2KKU>APRS,TCPIP*:hello!/I0-X;T_Wv&{-Aigate testing","outcome":"accept","source_expected":{"fap_header":{"source":"OH2KKU","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"location","Format":"compressed","Latitude":10.540467177352028,"Longitude":-74.88313740726545,"PosAmbiguity":null,"PosResolution":0.291,"SymbolTable":"/","SymbolCode":"v","Speed":1885.1787453433603,"Course":20,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":0,"ChecksumOK":null,"Comment":"Aigate testing","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2KKU","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"legacy_position","prefix":"hello","position":{"comment":"Aigate testing","messaging":false,"latitude_deg":10.540467177352028,"longitude_deg":-74.88313740726545,"symbol":{"table_id":"/","code":"v"},"extensions":{"motion":{"speed_knots":1017.9150892782723,"course_deg":20}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-407","title":"TestFallbackExclAtOffset39","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_fallback_test.go#L64","packet":"OH2RDP-1>BEACON-15:012345678901234567890123456789012345678!6028.51N/02505.68E#","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[]},"payload":{"type":"legacy_position","prefix":"012345678901234567890123456789012345678","position":{"comment":"","messaging":false,"latitude_deg":60.47516666666667,"longitude_deg":25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-408","title":"TestFallbackExclAtOffset40","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_fallback_test.go#L81","packet":"OH2RDP-1>BEACON-15:0123456789012345678901234567890123456789!6028.51N/02505.68E#","outcome":"reject","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: type_not_supported: unsupported packet type"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","original_wire":"OH2RDP-1>BEACON-15:0123456789012345678901234567890123456789!6028.51N/02505.68E#","payload":{"type":"beacon","text":"0123456789012345678901234567890123456789!6028.51N/02505.68E#"}},"divergence":["Text with no position in the first 40 bytes is a non-APRS beacon, kept as text; FAP rejects it."]} +{"id":"FAP-409","title":"TestFallbackNoExcl","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_fallback_test.go#L94","packet":"OH2RDP-1>BEACON-15:Tno position here at all","outcome":"reject","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: type_not_supported: unsupported packet type"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","original_wire":"OH2RDP-1>BEACON-15:Tno position here at all","payload":{"type":"beacon","text":"Tno position here at all"}},"divergence":["Text with no position in the first 40 bytes is a non-APRS beacon, kept as text; FAP rejects it."]} +{"id":"FAP-410","title":"TestFallbackUncompressedTooShort","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_fallback_test.go#L107","packet":"OH2RDP-1>BEACON-15:X!6028.51N/02505.6","outcome":"reject","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: type_not_supported: unsupported packet type"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH2RDP-1>BEACON-15:X!6028.51N/02505.6"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-411","title":"TestFallbackCompressedTooShort","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_fallback_test.go#L120","packet":"OH2RDP-1>BEACON-15:X!/I0-X;T_Wv&","outcome":"reject","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: type_not_supported: unsupported packet type"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH2RDP-1>BEACON-15:X!/I0-X;T_Wv&"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-412","title":"TestFallbackBadCompressedTableChar","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_fallback_test.go#L134","packet":"OH2RDP-1>BEACON-15:X!zI0-X;T_Wv&{-A","outcome":"reject","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":null},"fap_fields":{"Type":"","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: type_not_supported: unsupported packet type"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"OH2RDP-1>BEACON-15:X!zI0-X;T_Wv&{-A"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-413","title":"TestParseCapabilities","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/status_test.go#L14","packet":"OH7LZB>APRS:APU25N,WIDE2-2,qAR,LANSNG:>151811z>>Nashville,TN>>Toronto,ON","outcome":"accept","source_expected":{"fap_header":{"source":"KB3HVP-14","destination":"APU25N","digipeaters":[{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"LANSNG","WasDigied":false}]},"fap_fields":{"Type":"status","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":">>Nashville,TN>>Toronto,ON","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"KB3HVP-14","destination":"APU25N","path":[{"address":"WIDE2-2","repeated":false},{"address":"qAR","repeated":false},{"address":"LANSNG","repeated":false}]},"payload":{"type":"status","text":">>Nashville,TN>>Toronto,ON"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-415","title":"TestCommentTelemetry/uncompressed_PHG_4ch","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L22","packet":"N0CALL>APRS,qAR,IGATE:!6304.03NN02739.63E#PHG26303/Siilinjarvi|\"p%T'.agff|","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"N","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"26303","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":170,"Vals":[415,559,5894,6348,null],"Bits":""},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"Siilinjarvi","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"Siilinjarvi","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"N","code":"#"},"extensions":{"telemetry":{"sequence":170,"analog":[415,559,5894,6348]},"phg":{"power_w":4,"height_haat_ft":640,"gain_dbi":3,"directivity_deg":null,"rate_per_hour":3}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-416","title":"TestCommentTelemetry/compressed_3ch","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L22","packet":"N0CALL>APRS,qAR,IGATE:!/0%3RTh<6>dS_http://aprs.fi/|\"p%T'.ag|","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"compressed","Latitude":60.2347017530964,"Longitude":24.882575618361585,"PosAmbiguity":null,"PosResolution":0.291,"SymbolTable":"/","SymbolCode":">","Speed":85.0097863745044,"Course":268,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":170,"Vals":[415,559,5894,null,null],"Bits":""},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":1,"ChecksumOK":null,"Comment":"http://aprs.fi/","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"http://aprs.fi/","messaging":false,"latitude_deg":60.2347017530964,"longitude_deg":24.882575618361585,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":45.90161251323131,"course_deg":268},"telemetry":{"sequence":170,"analog":[415,559,5894]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-417","title":"TestCommentTelemetry/uncompressed_course_speed_3ch","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L22","packet":"N0CALL-14>APRS,qAR,IGATE:!6304.03N/02739.63E>036/010test |(7Cq?3<\"|","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-14","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":18.52,"Course":36,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":659,"Vals":[3174,2748,2458,null,null],"Bits":""},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"test","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL-14","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"test ","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":9.999999999999998,"course_deg":36},"telemetry":{"sequence":659,"analog":[3174,2748,2458]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-418","title":"TestCommentTelemetry/uncompressed_altitude_5ch_bits","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L22","packet":"OH7FDN>APZMDR,OH7AA-1*,WIDE2-1,qAR,OH7AA:!6253.52N/02739.47E>036/010/A=000465 |!!!!!!!!!!!!!!|","outcome":"accept","source_expected":{"fap_header":{"source":"OH7FDN","destination":"APZMDR","digipeaters":[{"Call":"OH7AA-1","WasDigied":true},{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":62.892,"Longitude":27.657833333333333,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":18.52,"Course":36,"Altitude":141.732,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":0,"Vals":[0,0,0,0,0],"Bits":"00000000"},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"OH7FDN","destination":"APZMDR","path":[{"address":"OH7AA-1","repeated":true},{"address":"WIDE2-1","repeated":false},{"address":"qAR","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"position","comment":" ","messaging":false,"latitude_deg":62.892,"longitude_deg":27.657833333333333,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":9.999999999999998,"course_deg":36},"telemetry":{"sequence":0,"analog":[0,0,0,0,0],"digital":[false,false,false,false,false,false,false,false]},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":465.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-419","title":"TestCommentTelemetry/compressed_5ch_bits","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L22","packet":"OH2LCQ-10>APZMDR,WIDE3-2,qAo,OH2MQK-1:!//zPHTfVv>!V_ Tero, Green Volvo 960, GGL-880|!!!!!!!!!!!!!!|","outcome":"accept","source_expected":{"fap_header":{"source":"OH2LCQ-10","destination":"APZMDR","digipeaters":[{"Call":"WIDE3-2","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH2MQK-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"compressed","Latitude":60.35823493276909,"Longitude":24.808377480140507,"PosAmbiguity":null,"PosResolution":0.291,"SymbolTable":"/","SymbolCode":">","Speed":107.56883463739969,"Course":360,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":0,"Vals":[0,0,0,0,0],"Bits":"00000000"},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":1,"ChecksumOK":null,"Comment":"Tero, Green Volvo 960, GGL-880","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"OH2LCQ-10","destination":"APZMDR","path":[{"address":"WIDE3-2","repeated":false},{"address":"qAo","repeated":false},{"address":"OH2MQK-1","repeated":false}]},"payload":{"type":"position","comment":" Tero, Green Volvo 960, GGL-880","messaging":false,"latitude_deg":60.35823493276909,"longitude_deg":24.808377480140507,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":58.08252410226765,"course_deg":0},"telemetry":{"sequence":0,"analog":[0,0,0,0,0],"digital":[false,false,false,false,false,false,false,false]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["A compressed course byte of 0 is reported as 0 degrees, as transmitted; FAP rewrites it to 360.","Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-420","title":"TestCommentTelemetry/uncompressed_bits_LSB_first","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L22","packet":"N0CALL>APRS,qAR,IGATE:!6304.03N/02739.63E>|ss1122334455!\"|","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":7544,"Vals":[1472,1564,1656,1748,1840],"Bits":"10000000"},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"telemetry":{"sequence":7544,"analog":[1472,1564,1656,1748,1840],"digital":[true,false,false,false,false,false,false,false]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-421","title":"TestCommentTelemetry/pipe_in_comment_text","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L22","packet":"N0CALL>APRS,qAR,IGATE:!6304.03N/02739.63E>a|b |!!!!|","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":0,"Vals":[0,null,null,null,null],"Bits":""},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"a|b","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"a|b ","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"telemetry":{"sequence":0,"analog":[0]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-422","title":"TestCommentTelemetry/uncompressed_telemetry_then_DAO","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L22","packet":"N0CALL>APRS,qAR,IGATE:!6304.03N/02739.63E>comment|\"p%T|!W12!","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.06718333333333,"Longitude":27.660533333333333,"PosAmbiguity":0,"PosResolution":1.852,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":170,"Vals":[415,null,null,null,null],"Bits":""},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"comment","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["DAO","base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"comment","messaging":false,"latitude_deg":63.06718333333333,"longitude_deg":27.660533333333333,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"telemetry":{"sequence":170,"analog":[415]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-423","title":"TestCommentTelemetryInvalid/too_long","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L174","packet":"N0CALL>APRS,qAR,IGATE:!6304.03N/02739.63E>c |!!!!!!!!!!!!!!!!|","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"c |!!!!!!!!!!!!!!!!|","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"c |!!!!!!!!!!!!!!!!|","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-424","title":"TestCommentTelemetryInvalid/too_short","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L174","packet":"N0CALL>APRS,qAR,IGATE:!6304.03N/02739.63E>c |!!|","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"c |!!|","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"c |!!|","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-425","title":"TestCommentTelemetryInvalid/odd_length","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L174","packet":"N0CALL>APRS,qAR,IGATE:!6304.03N/02739.63E>c |!!!!!|","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"c |!!!!!|","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"c |!!!!!|","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-426","title":"TestCommentTelemetryInvalid/invalid_character","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L174","packet":"N0CALL>APRS,qAR,IGATE:!6304.03N/02739.63E>c |!!!}|","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"c |!!!}|","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"c |!!!}|","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-427","title":"TestCommentTelemetryInvalid/single_pipe","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_comment_test.go#L174","packet":"N0CALL>APRS,qAR,IGATE:!6304.03N/02739.63E>c |!!!!","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"qAR","WasDigied":false},{"Call":"IGATE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"c |!!!!","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"position","comment":"c |!!!!","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-428","title":"TestMicEBase91Telemetry5Ch","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_mice_test.go#L13","packet":"OH7LZB-13>SX15S6,TCPIP*,qAC,FOURTH:'I',l \u001c>/ comment |!!!!!!!!!!!!!!|","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB-13","destination":"SX15S6","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"FOURTH","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"mice","Latitude":-38.256,"Longitude":145.186,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":0,"Course":0,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":0,"Vals":[0,0,0,0,0],"Bits":"00000000"},"Capabilities":null,"MBits":"110","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"comment","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"OH7LZB-13","destination":"SX15S6","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"FOURTH","repeated":false}]},"payload":{"type":"mic_e","comment":" comment ","latitude_deg":-38.256,"longitude_deg":145.186,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":0.0,"course_deg":0},"telemetry":{"sequence":0,"analog":[0,0,0,0,0],"digital":[false,false,false,false,false,false,false,false]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-429","title":"TestMicEBase91Telemetry1Ch","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_mice_test.go#L50","packet":"OH7LZB-13>SX15S6,TCPIP*,qAC,FOURTH:'I',l \u001c>/ comment |!!!!|","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB-13","destination":"SX15S6","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"FOURTH","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"mice","Latitude":-38.256,"Longitude":145.186,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":0,"Course":0,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":0,"Vals":[0,null,null,null,null],"Bits":""},"Capabilities":null,"MBits":"110","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"comment","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"OH7LZB-13","destination":"SX15S6","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"FOURTH","repeated":false}]},"payload":{"type":"mic_e","comment":" comment ","latitude_deg":-38.256,"longitude_deg":145.186,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":0.0,"course_deg":0},"telemetry":{"sequence":0,"analog":[0]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-430","title":"TestMicEBase91TelemetryHarder","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_mice_test.go#L84","packet":"N6BG-1>S6QTUX:`+,^l!cR/'\";z}||ss11223344bb!\"|!w>f!|3","outcome":"accept","source_expected":{"fap_header":{"source":"N6BG-1","destination":"S6QTUX","digipeaters":null},"fap_fields":{"Type":"location","Format":"mice","Latitude":36.24305311355312,"Longitude":-115.27779304029303,"PosAmbiguity":0,"PosResolution":0.1852,"SymbolTable":"/","SymbolCode":"R","Speed":0,"Course":171,"Altitude":736,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":7544,"Vals":[1472,1564,1656,1748,5980],"Bits":"10000000"},"Capabilities":null,"MBits":"101","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"'||3","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["DAO","base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"N6BG-1","destination":"S6QTUX","path":[]},"payload":{"type":"mic_e","comment":"|","latitude_deg":36.24305311355312,"longitude_deg":-115.27779304029303,"ambiguity":0,"symbol":{"table_id":"/","code":"R"},"extensions":{"motion":{"speed_knots":0.0,"course_deg":171},"telemetry":{"sequence":7544,"analog":[1472,1564,1656,1748,5980],"digital":[true,false,false,false,false,false,false,false]},"altitude":{"encoding":"mic_e","measurement":{"unit":"meters","value":736}}},"device_code":"'|3"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["APRS 1.2 Mic-E type code ' with the Byonics TinyTrack3 suffix |3 is stored in device_code; FAP keeps both in the comment."]} +{"id":"FAP-431","title":"TestMicEBase91TelemetryDAOConfusing","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_mice_test.go#L102","packet":"OH7LZB-13>SX15S6,TCPIP*,qAC,FOURTH:'I',l \u001c>/ comment |!wEU!![S|","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB-13","destination":"SX15S6","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"FOURTH","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"mice","Latitude":-38.256,"Longitude":145.186,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":0,"Course":0,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":86,"Vals":[3328,0,5328,null,null],"Bits":""},"Capabilities":null,"MBits":"110","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"comment","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["DAO","base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"OH7LZB-13","destination":"SX15S6","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"FOURTH","repeated":false}]},"payload":{"type":"mic_e","comment":" comment ","latitude_deg":-38.256,"longitude_deg":145.186,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":0.0,"course_deg":0},"telemetry":{"sequence":86,"analog":[3328,0,5328]}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-432","title":"TestTelemetryClassic","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L12","packet":"SRCCALL>APRS:T#324,000,038,255,.12,50.12,01000001","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":324,"Vals":[0,38,255,0.12,50.12],"Bits":"01000001"},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"","sequence":324,"analog":[0,38,255,0.12,50.12],"digital":[false,true,false,false,false,false,false,true]}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-433","title":"TestTelemetryRelaxed","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L43","packet":"SRCCALL>APRS:T#1,-1,2147483647,-2147483648,0.000001,-0.0000001,01000001 comment","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":1,"Vals":[-1,2147483647,-2147483648,1e-06,-1e-07],"Bits":"01000001"},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["relaxed-telemetry"],"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":" comment","sequence":1,"analog":[-1,2147483647,-2147483648,1e-06,-1e-07],"digital":[false,true,false,false,false,false,false,true]}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"],"divergence":["Text after the telemetry digital bits is kept as the comment; FAP discards it."]} +{"id":"FAP-434","title":"TestTelemetryShort","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L71","packet":"SRCCALL>APRS:T#001,42","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":1,"Vals":[42,null,null,null,null],"Bits":""},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["relaxed-telemetry"],"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"","sequence":1,"analog":[42.0]}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"],"divergence":["A short telemetry report decodes with only the channels transmitted and is marked nonconforming; FAP pads it to five channels."]} +{"id":"FAP-435","title":"TestTelemetryUndefinedMiddle","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L101","packet":"SRCCALL>APRS:T#1,1,,3,,5","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":1,"Vals":[1,null,3,null,5],"Bits":""},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["relaxed-telemetry"],"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"","sequence":1,"analog":[1,null,3,null,5]}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-436","title":"TestTelemetryPartiallyCorrect","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L140","packet":"SRCCALL>APRS:T#1,1,f,3","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":1,"Vals":[1,null,null,null,null],"Bits":""},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["relaxed-telemetry"],"expected":{"original_wire":"SRCCALL>APRS:T#1,1,f,3","type":"malformed"},"unmapped":[],"divergence":["A non-numeric telemetry channel cannot be decoded, so the report is Malformed; FAP keeps the channels before it."]} +{"id":"FAP-437","title":"TestTelemetryInvalidDash","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L239","packet":"SRCCALL>APRS:T#1,1,-,3","outcome":"reject","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: tlm_inv: invalid telemetry value: -"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"SRCCALL>APRS:T#1,1,-,3"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-438","title":"TestTelemetryInvalidTrailingDot","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L250","packet":"SRCCALL>APRS:T#1,1,-1.,3","outcome":"reject","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: tlm_inv: invalid telemetry value: -1."},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"SRCCALL>APRS:T#1,1,-1.,3"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-439","title":"TestTelemetryParameterMessage","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L264","packet":"SRCCALL>APRS::N0CALL-10:PARM.Vin,Rx1h,Dg1h,Eff1h,EffTo,O1,O2,O3,O4,I1,I2,I3,I4","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry-message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL-10","Text":"PARM.Vin,Rx1h,Dg1h,Eff1h,EffTo,O1,O2,O3,O4,I1,I2,I3,I4","ID":"","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL-10","definition":{"type":"telemetry_parameters","channels":["Vin","Rx1h","Dg1h","Eff1h","EffTo","O1","O2","O3","O4","I1","I2","I3","I4"]}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-440","title":"TestTelemetryParameterMessageTypes/PARM","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L295","packet":"SRCCALL>APRS::N0CALL :PARM.Vin,Rx1h","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry-message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"PARM.Vin,Rx1h","ID":"","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL","definition":{"type":"telemetry_parameters","channels":["Vin","Rx1h",null,null,null,null,null,null,null,null,null,null,null]}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-441","title":"TestTelemetryParameterMessageTypes/UNIT","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L295","packet":"SRCCALL>APRS::N0CALL :UNIT.Volt,Pkt/h","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry-message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"UNIT.Volt,Pkt/h","ID":"","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL","definition":{"type":"telemetry_units","channels":["Volt","Pkt/h",null,null,null,null,null,null,null,null,null,null,null]}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-442","title":"TestTelemetryParameterMessageTypes/EQNS","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L295","packet":"SRCCALL>APRS::N0CALL :EQNS.0,0.075,0,0,1,0","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry-message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"EQNS.0,0.075,0,0,1,0","ID":"","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL","definition":{"type":"telemetry_equations","coefficients":[{"a":0.0,"b":0.075,"c":0.0},{"a":0.0,"b":1.0,"c":0.0}]}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-443","title":"TestTelemetryParameterMessageTypes/BITS","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L295","packet":"SRCCALL>APRS::N0CALL :BITS.11111111,My station","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry-message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"BITS.11111111,My station","ID":"","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL","definition":{"type":"telemetry_bits","sense":[true,true,true,true,true,true,true,true],"project_title":"My station"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-444","title":"TestTelemetryParameterMessageTypes/parm_lowercase","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L295","packet":"SRCCALL>APRS::N0CALL :parm.Vin,Rx1h","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry-message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"parm.Vin,Rx1h","ID":"","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"parm.Vin,Rx1h","message_id":null,"reply_ack":null}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"],"divergence":["APRS101 defines the telemetry keywords in upper case, so 'parm.' is ordinary message text; FAP matches them case-insensitively."]} +{"id":"FAP-445","title":"TestRegularMessageNotTelemetryMessage","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/telemetry_test.go#L308","packet":"SRCCALL>APRS::N0CALL :Hello world","outcome":"accept","source_expected":{"fap_header":{"source":"SRCCALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"message","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":{"Destination":"N0CALL","Text":"Hello world","ID":"","AckID":"","RejID":""},"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"SRCCALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"N0CALL","text":"Hello world","message_id":null}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-446","title":"TestTimestampRawDHMzUTC","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L19","packet":"KB3HVP-14>APU25N,N8TJG-10*,WIDE2-1,qAR,LANSNG:@151811z4231.16N/08449.88Wu227/052/A=000941 {UIV32N}","outcome":"accept","source_expected":{"fap_header":{"source":"KB3HVP-14","destination":"APU25N","digipeaters":[{"Call":"N8TJG-10","WasDigied":true},{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"LANSNG","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":42.519333333333336,"Longitude":-84.83133333333333,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"u","Speed":96.304,"Course":227,"Altitude":286.8168,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"151811","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"{UIV32N}","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":true},"expected":{"type":"packet","header":{"source":"KB3HVP-14","destination":"APU25N","path":[{"address":"N8TJG-10","repeated":true},{"address":"WIDE2-1","repeated":false},{"address":"qAR","repeated":false},{"address":"LANSNG","repeated":false}]},"payload":{"type":"position","comment":" {UIV32N}","messaging":true,"latitude_deg":42.519333333333336,"longitude_deg":-84.83133333333333,"ambiguity":0,"symbol":{"table_id":"/","code":"u"},"extensions":{"motion":{"speed_knots":52.0,"course_deg":227},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":941.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-447","title":"TestTimestampDecodedDHMzUTC","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L35","packet":"KB3HVP-14>APU25N,N8TJG-10*,WIDE2-1,qAR,LANSNG:@151811z4231.16N/08449.88Wu227/052/A=000941 {UIV32N}","outcome":"accept","source_expected":{"fap_header":{"source":"KB3HVP-14","destination":"APU25N","digipeaters":[{"Call":"N8TJG-10","WasDigied":true},{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"LANSNG","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":42.519333333333336,"Longitude":-84.83133333333333,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"u","Speed":96.304,"Course":227,"Altitude":286.8168,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"{UIV32N}","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"KB3HVP-14","destination":"APU25N","path":[{"address":"N8TJG-10","repeated":true},{"address":"WIDE2-1","repeated":false},{"address":"qAR","repeated":false},{"address":"LANSNG","repeated":false}]},"payload":{"type":"position","comment":" {UIV32N}","messaging":true,"latitude_deg":42.519333333333336,"longitude_deg":-84.83133333333333,"ambiguity":0,"symbol":{"table_id":"/","code":"u"},"extensions":{"motion":{"speed_knots":52.0,"course_deg":227},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":941.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-448","title":"TestTimestampRawHMSh","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L50","packet":"G4EUM-9>APOTC1,G4EUM*,WIDE2-2,qAS,M3SXA-10:/055816h5134.38N/00019.47W>155/023!W26!/A=000188 14.3V 27C HDOP01.0 SATS09","outcome":"accept","source_expected":{"fap_header":{"source":"G4EUM-9","destination":"APOTC1","digipeaters":[{"Call":"G4EUM","WasDigied":true},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAS","WasDigied":false},{"Call":"M3SXA-10","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":51.573033333333335,"Longitude":-0.32459999999999994,"PosAmbiguity":0,"PosResolution":1.852,"SymbolTable":"/","SymbolCode":">","Speed":42.596000000000004,"Course":155,"Altitude":57.302400000000006,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"055816","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"14.3V 27C HDOP01.0 SATS09","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":true},"extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"G4EUM-9","destination":"APOTC1","path":[{"address":"G4EUM","repeated":true},{"address":"WIDE2-2","repeated":false},{"address":"qAS","repeated":false},{"address":"M3SXA-10","repeated":false}]},"payload":{"type":"position","comment":" 14.3V 27C HDOP01.0 SATS09","messaging":false,"latitude_deg":51.573033333333335,"longitude_deg":-0.32459999999999994,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":23.0,"course_deg":155},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":188.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-449","title":"TestTimestampDecodedHMSh","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L66","packet":"G4EUM-9>APOTC1,G4EUM*,WIDE2-2,qAS,M3SXA-10:/181144h5134.38N/00019.47W>155/023!W26!/A=000188 14.3V 27C HDOP01.0 SATS09","outcome":"accept","source_expected":{"fap_header":{"source":"G4EUM-9","destination":"APOTC1","digipeaters":[{"Call":"G4EUM","WasDigied":true},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAS","WasDigied":false},{"Call":"M3SXA-10","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":51.573033333333335,"Longitude":-0.32459999999999994,"PosAmbiguity":0,"PosResolution":1.852,"SymbolTable":"/","SymbolCode":">","Speed":42.596000000000004,"Course":155,"Altitude":57.302400000000006,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"14.3V 27C HDOP01.0 SATS09","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"G4EUM-9","destination":"APOTC1","path":[{"address":"G4EUM","repeated":true},{"address":"WIDE2-2","repeated":false},{"address":"qAS","repeated":false},{"address":"M3SXA-10","repeated":false}]},"payload":{"type":"position","comment":" 14.3V 27C HDOP01.0 SATS09","messaging":false,"latitude_deg":51.573033333333335,"longitude_deg":-0.32459999999999994,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":23.0,"course_deg":155},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":188.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-450","title":"TestTimestampRawDHMLocal","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L81","packet":"G4EUM-9>APOTC1,G4EUM*,WIDE2-2,qAS,M3SXA-10:/060642/5134.38N/00019.47W>155/023!W26!/A=000188 14.3V 27C HDOP01.0 SATS09","outcome":"accept","source_expected":{"fap_header":{"source":"G4EUM-9","destination":"APOTC1","digipeaters":[{"Call":"G4EUM","WasDigied":true},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAS","WasDigied":false},{"Call":"M3SXA-10","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":51.573033333333335,"Longitude":-0.32459999999999994,"PosAmbiguity":0,"PosResolution":1.852,"SymbolTable":"/","SymbolCode":">","Speed":42.596000000000004,"Course":155,"Altitude":57.302400000000006,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"060642","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"14.3V 27C HDOP01.0 SATS09","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":true},"extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"G4EUM-9","destination":"APOTC1","path":[{"address":"G4EUM","repeated":true},{"address":"WIDE2-2","repeated":false},{"address":"qAS","repeated":false},{"address":"M3SXA-10","repeated":false}]},"payload":{"type":"position","comment":" 14.3V 27C HDOP01.0 SATS09","messaging":false,"latitude_deg":51.573033333333335,"longitude_deg":-0.32459999999999994,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":23.0,"course_deg":155},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":188.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-451","title":"TestTimestampDecodedDHMLocal","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L98","packet":"G4EUM-9>APOTC1,G4EUM*,WIDE2-2,qAS,M3SXA-10:/152011/5134.38N/00019.47W>155/023!W26!/A=000188 14.3V 27C HDOP01.0 SATS09","outcome":"accept","source_expected":{"fap_header":{"source":"G4EUM-9","destination":"APOTC1","digipeaters":[{"Call":"G4EUM","WasDigied":true},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAS","WasDigied":false},{"Call":"M3SXA-10","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":51.573033333333335,"Longitude":-0.32459999999999994,"PosAmbiguity":0,"PosResolution":1.852,"SymbolTable":"/","SymbolCode":">","Speed":42.596000000000004,"Course":155,"Altitude":57.302400000000006,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"14.3V 27C HDOP01.0 SATS09","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"G4EUM-9","destination":"APOTC1","path":[{"address":"G4EUM","repeated":true},{"address":"WIDE2-2","repeated":false},{"address":"qAS","repeated":false},{"address":"M3SXA-10","repeated":false}]},"payload":{"type":"position","comment":" 14.3V 27C HDOP01.0 SATS09","messaging":false,"latitude_deg":51.573033333333335,"longitude_deg":-0.32459999999999994,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":23.0,"course_deg":155},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":188.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-452","title":"TestTimestampFutureRollback/DDHHMMz_UTC","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L201","packet":"KB3HVP-14>APU25N,N8TJG-10*,WIDE2-1,qAR,LANSNG:@162359z4231.16N/08449.88Wu227/052/A=000941 {UIV32N}","outcome":"accept","source_expected":{"fap_header":{"source":"KB3HVP-14","destination":"APU25N","digipeaters":[{"Call":"N8TJG-10","WasDigied":true},{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"LANSNG","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":42.519333333333336,"Longitude":-84.83133333333333,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"u","Speed":96.304,"Course":227,"Altitude":286.8168,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"{UIV32N}","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"KB3HVP-14","destination":"APU25N","path":[{"address":"N8TJG-10","repeated":true},{"address":"WIDE2-1","repeated":false},{"address":"qAR","repeated":false},{"address":"LANSNG","repeated":false}]},"payload":{"type":"position","comment":" {UIV32N}","messaging":true,"latitude_deg":42.519333333333336,"longitude_deg":-84.83133333333333,"ambiguity":0,"symbol":{"table_id":"/","code":"u"},"extensions":{"motion":{"speed_knots":52.0,"course_deg":227},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":941.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-453","title":"TestTimestampFutureRollback/DDHHMM/_local","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L201","packet":"G4EUM-9>APOTC1,G4EUM*,WIDE2-2,qAS,M3SXA-10:/162359/5134.38N/00019.47W>155/023!W26!/A=000188 14.3V 27C HDOP01.0 SATS09","outcome":"accept","source_expected":{"fap_header":{"source":"G4EUM-9","destination":"APOTC1","digipeaters":[{"Call":"G4EUM","WasDigied":true},{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAS","WasDigied":false},{"Call":"M3SXA-10","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":51.573033333333335,"Longitude":-0.32459999999999994,"PosAmbiguity":0,"PosResolution":1.852,"SymbolTable":"/","SymbolCode":">","Speed":42.596000000000004,"Course":155,"Altitude":57.302400000000006,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"14.3V 27C HDOP01.0 SATS09","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"G4EUM-9","destination":"APOTC1","path":[{"address":"G4EUM","repeated":true},{"address":"WIDE2-2","repeated":false},{"address":"qAS","repeated":false},{"address":"M3SXA-10","repeated":false}]},"payload":{"type":"position","comment":" 14.3V 27C HDOP01.0 SATS09","messaging":false,"latitude_deg":51.573033333333335,"longitude_deg":-0.32459999999999994,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":23.0,"course_deg":155},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":188.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-454","title":"TestTimestampInvalidLocation","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L224","packet":"KB3HVP-14>APU25N,N8TJG-10*,WIDE2-1,qAR,LANSNG:@000000z4231.16N/08449.88Wu227/052/A=000941 {UIV32N}","outcome":"accept","source_expected":{"fap_header":{"source":"KB3HVP-14","destination":"APU25N","digipeaters":[{"Call":"N8TJG-10","WasDigied":true},{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"LANSNG","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":42.519333333333336,"Longitude":-84.83133333333333,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"u","Speed":96.304,"Course":227,"Altitude":286.8168,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"{UIV32N}","Warnings":[{"Code":"timestamp_inv","Msg":"invalid timestamp: invalid day: 00"}]}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"KB3HVP-14>APU25N,N8TJG-10*,WIDE2-1,qAR,LANSNG:@000000z4231.16N/08449.88Wu227/052/A=000941 {UIV32N}","type":"malformed"},"unmapped":[],"divergence":["Day 00 is not a valid timestamp, so the packet is Malformed and Malformed.recovered keeps the other fields; FAP decodes them with a warning. TIM-011 allows either."]} +{"id":"FAP-455","title":"TestTimestampInvalidObject","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L247","packet":"SRC>APRS,TCPIP*:;TestObj *000000z4903.50N/07201.75W-Test","outcome":"accept","source_expected":{"fap_header":{"source":"SRC","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"object","Format":"uncompressed","Latitude":49.05833333333333,"Longitude":-72.02916666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"-","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"TestObj ","ItemName":"","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"Test","Warnings":[{"Code":"timestamp_inv","Msg":"invalid object timestamp: invalid day: 00"}]}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"SRC>APRS,TCPIP*:;TestObj *000000z4903.50N/07201.75W-Test","type":"malformed"},"unmapped":[],"divergence":["Day 00 is not a valid timestamp, so the packet is Malformed and Malformed.recovered keeps the other fields; FAP decodes them with a warning. TIM-011 allows either."]} +{"id":"FAP-456","title":"TestTimestampInvalidStatus","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/timestamp_test.go#L270","packet":"SRC>APRS,TCPIP*:>000000zStatus text here","outcome":"accept","source_expected":{"fap_header":{"source":"SRC","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"status","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"Status text here","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":[{"Code":"timestamp_inv","Msg":"invalid timestamp: invalid day: 00"}]}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"original_wire":"SRC>APRS,TCPIP*:>000000zStatus text here","type":"malformed"},"unmapped":[],"divergence":["Day 00 is not a valid timestamp, so the packet is Malformed and Malformed.recovered keeps the other fields; FAP decodes them with a warning. TIM-011 allows either."]} +{"id":"FAP-457","title":"TestUncompressedMoving","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_moving_test.go#L16","packet":"OH7FDN>APZMDR,OH7AA-1*,WIDE2-1,qAR,OH7AA:!6253.52N/02739.47E>036/010/A=000465 |!!!!!!!!!!!!!!|","outcome":"accept","source_expected":{"fap_header":{"source":"OH7FDN","destination":"APZMDR","digipeaters":[{"Call":"OH7AA-1","WasDigied":true},{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"OH7AA","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":62.892,"Longitude":27.657833333333333,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":18.52,"Course":36,"Altitude":141.732,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":0,"Vals":[0,0,0,0,0],"Bits":"00000000"},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"extension_tags":["base91-comment-telemetry"],"expected":{"type":"packet","header":{"source":"OH7FDN","destination":"APZMDR","path":[{"address":"OH7AA-1","repeated":true},{"address":"WIDE2-1","repeated":false},{"address":"qAR","repeated":false},{"address":"OH7AA","repeated":false}]},"payload":{"type":"position","comment":" ","messaging":false,"latitude_deg":62.892,"longitude_deg":27.657833333333333,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":9.999999999999998,"course_deg":36},"telemetry":{"sequence":0,"analog":[0,0,0,0,0],"digital":[false,false,false,false,false,false,false,false]},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":465.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-458","title":"TestUncompressedNortheast","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L14","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:!6028.51N/02505.68E#PHG7220/RELAY,WIDE, OH2AP Jarvenpaa","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"7220","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"RELAY,WIDE, OH2AP Jarvenpaa","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"OH2RDG","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"position","comment":"RELAY,WIDE, OH2AP Jarvenpaa","messaging":false,"latitude_deg":60.47516666666667,"longitude_deg":25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-459","title":"TestUncompressedSouthwest","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L64","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:!6028.51S/02505.68W#PHG7220RELAY,WIDE, OH2AP Jarvenpaa","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":-60.47516666666667,"Longitude":-25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"7220","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"RELAY,WIDE, OH2AP Jarvenpaa","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"OH2RDG","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"position","comment":"RELAY,WIDE, OH2AP Jarvenpaa","messaging":false,"latitude_deg":-60.47516666666667,"longitude_deg":-25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-460","title":"TestUncompressedAmbiguity3","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L82","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:!602 . S/0250 . W#PHG7220RELAY,WIDE, OH2AP Jarvenpaa","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":-60.416666666666664,"Longitude":-25.083333333333332,"PosAmbiguity":3,"PosResolution":18520,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"7220","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"RELAY,WIDE, OH2AP Jarvenpaa","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"OH2RDG","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"position","comment":"RELAY,WIDE, OH2AP Jarvenpaa","messaging":false,"latitude_deg":-60.416666666666664,"longitude_deg":-25.083333333333332,"ambiguity":3,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-461","title":"TestUncompressedAmbiguity4","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L103","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:!60 . S/025 . W#PHG7220RELAY,WIDE, OH2AP Jarvenpaa","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":-60.5,"Longitude":-25.5,"PosAmbiguity":4,"PosResolution":111120,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"7220","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"RELAY,WIDE, OH2AP Jarvenpaa","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"OH2RDG","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"position","comment":"RELAY,WIDE, OH2AP Jarvenpaa","messaging":false,"latitude_deg":-60.5,"longitude_deg":-25.5,"ambiguity":4,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-462","title":"TestUncompressedAmbiguityUnbalanced","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L124","packet":"SRC>APRS,TCPIP*,qAC,T2POLAND:;SPBLTZ *010020z5210. N/021 . E? Comment","outcome":"reject","source_expected":{"fap_header":{"source":"SRC","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"T2POLAND","WasDigied":false}]},"fap_fields":{"Type":"object","Format":"uncompressed","Latitude":52.175,"Longitude":null,"PosAmbiguity":2,"PosResolution":null,"SymbolTable":"/","SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"SPBLTZ ","ItemName":"","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: loc_amb_inv: invalid position ambiguity: longitude has spaces in non-ambiguous digits"},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"original_wire":"SRC>APRS,TCPIP*,qAC,T2POLAND:;SPBLTZ *010020z5210. N/021 . E? Comment"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-463","title":"TestUncompressedAmbiguityLonMoreDigits","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L139","packet":"OH2RDP-1>BEACON-15:!5210.5 N/02101.73E#Comment here","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":52.17583333333334,"Longitude":21.029166666666665,"PosAmbiguity":1,"PosResolution":185.2,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"Comment here","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[]},"payload":{"type":"position","comment":"Comment here","messaging":false,"latitude_deg":52.17583333333334,"longitude_deg":21.029166666666665,"ambiguity":1,"symbol":{"table_id":"/","code":"#"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-464","title":"TestUncompressedLastResort","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L163","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:hoponassualku!6028.51S/02505.68W#PHG7220RELAY,WIDE, OH2AP Jarvenpaa","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":-60.47516666666667,"Longitude":-25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"7220","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"RELAY,WIDE, OH2AP Jarvenpaa","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"OH2RDG","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"legacy_position","prefix":"hoponassualku","position":{"comment":"RELAY,WIDE, OH2AP Jarvenpaa","messaging":false,"latitude_deg":-60.47516666666667,"longitude_deg":-25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-465","title":"TestUncompressedWxSymbolComment","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L185","packet":"A0RID-1>KC0PID-7,WIDE1,qAR,NX0R-6:=3851.38N/09908.75W_Home of KA0RID","outcome":"accept","source_expected":{"fap_header":{"source":"A0RID-1","destination":"KC0PID-7","digipeaters":[{"Call":"WIDE1","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"NX0R-6","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"uncompressed","Latitude":38.85633333333333,"Longitude":-99.14583333333333,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"_","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":null,"WindSpeed":null,"WindGust":null,"Temp":null,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"A0RID-1","destination":"KC0PID-7","path":[{"address":"WIDE1","repeated":false},{"address":"qAR","repeated":false},{"address":"NX0R-6","repeated":false}]},"payload":{"type":"position","comment":"Home of KA0RID","messaging":true,"latitude_deg":38.85633333333333,"longitude_deg":-99.14583333333333,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["A weather-station symbol with no weather fields is a position with a comment; FAP reports an empty weather report and discards the comment."]} +{"id":"FAP-466","title":"TestUncompressedWhitespaceTrimming","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L207","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:!6028.51N/02505.68E#PHG7220 RELAY,WIDE, OH2AP Jarvenpaa \t ","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"7220","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"RELAY,WIDE, OH2AP Jarvenpaa","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"OH2RDG","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"position","comment":"RELAY,WIDE, OH2AP Jarvenpaa","messaging":false,"latitude_deg":60.47516666666667,"longitude_deg":25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-467","title":"TestPHGRA","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L223","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:!6028.51N/02505.68E#PHG72205/RELAY,WIDE, OH2AP Jarvenpaa","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"72205","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"RELAY,WIDE, OH2AP Jarvenpaa","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"OH2RDG","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"position","comment":"RELAY,WIDE, OH2AP Jarvenpaa","messaging":false,"latitude_deg":60.47516666666667,"longitude_deg":25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null,"rate_per_hour":5}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-468","title":"TestPHGRALetterSuffix","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L239","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:!6028.51N/02505.68E#PHG7220Z/some comment","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"7220Z","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"some comment","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"OH2RDG","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"position","comment":"some comment","messaging":false,"latitude_deg":60.47516666666667,"longitude_deg":25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null,"rate_per_hour":35}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-469","title":"TestPHGInvalidNotParsed","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L255","packet":"OH2RDP-1>BEACON-15,OH2RDG*,WIDE:!6028.51N/02505.68E#PHG7/20some comment","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"OH2RDG","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"PHG7/20some comment","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"OH2RDG","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"position","comment":"PHG7/20some comment","messaging":false,"latitude_deg":60.47516666666667,"longitude_deg":25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-470","title":"TestRNG","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L267","packet":"OH2RDP-1>BEACON-15:!6028.51N/02505.68E#RNG0050some comment","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":80.4672,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"some comment","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[]},"payload":{"type":"position","comment":"some comment","messaging":false,"latitude_deg":60.47516666666667,"longitude_deg":25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"range":{"miles":50.0}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-471","title":"TestUncompressedTimestampAltitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L286","packet":"YB1RUS-9>APOTC1,WIDE2-2,qAS,YC0GIN-1:/180000z0609.31S/10642.85E>058/010/A=000079 13.8V 15CYB1RUS-9 Mobile Tracker","outcome":"accept","source_expected":{"fap_header":{"source":"YB1RUS-9","destination":"APOTC1","digipeaters":[{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAS","WasDigied":false},{"Call":"YC0GIN-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":-6.155166666666666,"Longitude":106.71416666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":18.52,"Course":58,"Altitude":24.0792,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"13.8V 15CYB1RUS-9 Mobile Tracker","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"YB1RUS-9","destination":"APOTC1","path":[{"address":"WIDE2-2","repeated":false},{"address":"qAS","repeated":false},{"address":"YC0GIN-1","repeated":false}]},"payload":{"type":"position","comment":" 13.8V 15CYB1RUS-9 Mobile Tracker","messaging":false,"latitude_deg":-6.155166666666666,"longitude_deg":106.71416666666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":9.999999999999998,"course_deg":58},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":79.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-472","title":"TestUncompressedNegativeAltitude","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L308","packet":"YB1RUS-9>APOTC1,WIDE2-2,qAS,YC0GIN-1:/180000z0609.31S/10642.85E>058/010/A=-00079 13.8V 15CYB1RUS-9 Mobile Tracker","outcome":"accept","source_expected":{"fap_header":{"source":"YB1RUS-9","destination":"APOTC1","digipeaters":[{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAS","WasDigied":false},{"Call":"YC0GIN-1","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":-6.155166666666666,"Longitude":106.71416666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":18.52,"Course":58,"Altitude":-24.0792,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"13.8V 15CYB1RUS-9 Mobile Tracker","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"YB1RUS-9","destination":"APOTC1","path":[{"address":"WIDE2-2","repeated":false},{"address":"qAS","repeated":false},{"address":"YC0GIN-1","repeated":false}]},"payload":{"type":"position","comment":" 13.8V 15CYB1RUS-9 Mobile Tracker","messaging":false,"latitude_deg":-6.155166666666666,"longitude_deg":106.71416666666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":9.999999999999998,"course_deg":58},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":-79.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"],"divergence":["Comment text keeps its leading and trailing spaces exactly as transmitted; FAP trims them."]} +{"id":"FAP-473","title":"TestUncompressedBasicYC0SHR","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/uncompressed_test.go#L324","packet":"YC0SHR>APU25N,TCPIP*,qAC,ALDIMORI:=0606.23S/10644.61E-GW SAHARA PENJARINGAN JAKARTA 147.880 MHz","outcome":"accept","source_expected":{"fap_header":{"source":"YC0SHR","destination":"APU25N","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"ALDIMORI","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":-6.103833333333333,"Longitude":106.7435,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"-","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"GW SAHARA PENJARINGAN JAKARTA 147.880 MHz","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"YC0SHR","destination":"APU25N","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"ALDIMORI","repeated":false}]},"payload":{"type":"position","comment":"GW SAHARA PENJARINGAN JAKARTA 147.880 MHz","messaging":true,"latitude_deg":-6.103833333333333,"longitude_deg":106.7435,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-474","title":"TestWxBasic","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L13","packet":"OH2RDP-1>BEACON-15,WIDE2-1,qAo,OH2MQK-1:=6030.35N/02443.91E_150/002g004t039r001P002p004h00b10125XRSW","outcome":"accept","source_expected":{"fap_header":{"source":"OH2RDP-1","destination":"BEACON-15","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH2MQK-1","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"uncompressed","Latitude":60.505833333333335,"Longitude":24.731833333333334,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"_","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":150,"WindSpeed":0.89408,"WindGust":1.78816,"Temp":3.888888888888889,"TempIn":null,"Humidity":100,"HumidityIn":null,"Pressure":1012.5,"Rain1h":0.254,"Rain24h":1.016,"RainMidnight":0.508,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":"XRSW"},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"OH2RDP-1","destination":"BEACON-15","path":[{"address":"WIDE2-1","repeated":false},{"address":"qAo","repeated":false},{"address":"OH2MQK-1","repeated":false}]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":60.505833333333335,"longitude_deg":24.731833333333334,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"wind_direction":{"value":150,"unit":"degrees"},"wind_speed":{"value":2.0,"unit":"disputed_knots_or_mph"},"gust":{"value":4.0,"unit":"mph"},"temperature":{"value":39.0,"unit":"fahrenheit"},"humidity":{"value":100,"unit":"percent"},"pressure":{"value":1012.5,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.04,"unit":"inches"},"rain_since_midnight":{"value":0.02,"unit":"inches"}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"],"divergence":["The uncompressed wind-speed unit is disputed between the specifications and stays marked as disputed; FAP assumes mph."]} +{"id":"FAP-475","title":"TestWxWithComment","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L77","packet":"OH2GAX>APU25N,TCPIP*,qAC,OH2GAX:@101317z6024.78N/02503.97E_156/001g005t038r000p000P000h91b10093/type ?sade for more wx info","outcome":"accept","source_expected":{"fap_header":{"source":"OH2GAX","destination":"APU25N","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"OH2GAX","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"uncompressed","Latitude":60.413,"Longitude":25.066166666666668,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"_","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":156,"WindSpeed":0.44704,"WindGust":2.2352,"Temp":3.3333333333333335,"TempIn":null,"Humidity":91,"HumidityIn":null,"Pressure":1009.3,"Rain1h":0,"Rain24h":0,"RainMidnight":0,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"/type ?sade for more wx info","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"OH2GAX","destination":"APU25N","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"OH2GAX","repeated":false}]},"payload":{"type":"position","comment":"/type ?sade for more wx info","messaging":true,"latitude_deg":60.413,"longitude_deg":25.066166666666668,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"wind_direction":{"value":156,"unit":"degrees"},"wind_speed":{"value":1.0,"unit":"disputed_knots_or_mph"},"gust":{"value":5.0,"unit":"mph"},"temperature":{"value":38.0,"unit":"fahrenheit"},"humidity":{"value":91,"unit":"percent"},"pressure":{"value":1009.3,"unit":"hPa"},"rain_1h":{"value":0.0,"unit":"inches"},"rain_24h":{"value":0.0,"unit":"inches"},"rain_since_midnight":{"value":0.0,"unit":"inches"}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"],"divergence":["The uncompressed wind-speed unit is disputed between the specifications and stays marked as disputed; FAP assumes mph."]} +{"id":"FAP-476","title":"TestWxThirdWithComment","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L134","packet":"JH9YVX>APU25N,TCPIP*,qAC,T2TOKYO3:@011241z3558.58N/13629.67E_068/001g001t033r000p020P020b09860h98Oregon WMR100N Weather Station {UIV32N}","outcome":"accept","source_expected":{"fap_header":{"source":"JH9YVX","destination":"APU25N","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"T2TOKYO3","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"uncompressed","Latitude":35.976333333333336,"Longitude":136.4945,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"_","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":68,"WindSpeed":0.44704,"WindGust":0.44704,"Temp":0.5555555555555556,"TempIn":null,"Humidity":98,"HumidityIn":null,"Pressure":986,"Rain1h":0,"Rain24h":5.08,"RainMidnight":5.08,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"Oregon WMR100N Weather Station {UIV32N}","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"JH9YVX","destination":"APU25N","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"T2TOKYO3","repeated":false}]},"payload":{"type":"position","comment":"Oregon WMR100N Weather Station {UIV32N}","messaging":true,"latitude_deg":35.976333333333336,"longitude_deg":136.4945,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"wind_direction":{"value":68,"unit":"degrees"},"wind_speed":{"value":1.0,"unit":"disputed_knots_or_mph"},"gust":{"value":1.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"},"humidity":{"value":98,"unit":"percent"},"pressure":{"value":986,"unit":"hPa"},"rain_1h":{"value":0.0,"unit":"inches"},"rain_24h":{"value":0.2,"unit":"inches"},"rain_since_midnight":{"value":0.2,"unit":"inches"}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"],"divergence":["The uncompressed wind-speed unit is disputed between the specifications and stays marked as disputed; FAP assumes mph."]} +{"id":"FAP-477","title":"TestWxNoWindDirectionCourse","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L191","packet":"N0CALL>APU25N,TCPIP*,qAC,T2TOKYO3:@011241z3558.58N/13629.67E_.../...g001t033r000p020P020b09860h98Oregon WMR100N Weather Station {UIV32N}","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APU25N","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"T2TOKYO3","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"uncompressed","Latitude":35.976333333333336,"Longitude":136.4945,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"_","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":null,"WindSpeed":null,"WindGust":0.44704,"Temp":0.5555555555555556,"TempIn":null,"Humidity":98,"HumidityIn":null,"Pressure":986,"Rain1h":0,"Rain24h":5.08,"RainMidnight":5.08,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"Oregon WMR100N Weather Station {UIV32N}","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APU25N","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"T2TOKYO3","repeated":false}]},"payload":{"type":"position","comment":"Oregon WMR100N Weather Station {UIV32N}","messaging":true,"latitude_deg":35.976333333333336,"longitude_deg":136.4945,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"gust":{"value":1.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"},"humidity":{"value":98,"unit":"percent"},"pressure":{"value":986,"unit":"hPa"},"rain_1h":{"value":0.0,"unit":"inches"},"rain_24h":{"value":0.2,"unit":"inches"},"rain_since_midnight":{"value":0.2,"unit":"inches"}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-478","title":"TestWxNoWindNoTemp","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L209","packet":"N0CALL>APJLSX,TCPIP*,qAS,KG4EXY:@061750z3849.10N/07725.10W_.../...g...t...r008p011P011b.....h..","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APJLSX","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAS","WasDigied":false},{"Call":"KG4EXY","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"uncompressed","Latitude":38.818333333333335,"Longitude":-77.41833333333334,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"_","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":null,"WindSpeed":null,"WindGust":null,"Temp":null,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":2.032,"Rain24h":2.794,"RainMidnight":2.794,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APJLSX","path":[{"address":"TCPIP","repeated":true},{"address":"qAS","repeated":false},{"address":"KG4EXY","repeated":false}]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":38.818333333333335,"longitude_deg":-77.41833333333334,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"rain_1h":{"value":0.08,"unit":"inches"},"rain_24h":{"value":0.11,"unit":"inches"},"rain_since_midnight":{"value":0.11,"unit":"inches"}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-479","title":"TestWxSpaceInWindGust","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L227","packet":"N0CALL>APU25N,TCPIP*,qAC,T2TOKYO3:@011241z3558.58N/13629.67E_.../...g t033r000p020P020b09860h98Oregon WMR100N Weather Station {UIV32N}","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APU25N","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"T2TOKYO3","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"uncompressed","Latitude":35.976333333333336,"Longitude":136.4945,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"_","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":null,"WindSpeed":null,"WindGust":null,"Temp":0.5555555555555556,"TempIn":null,"Humidity":98,"HumidityIn":null,"Pressure":986,"Rain1h":0,"Rain24h":5.08,"RainMidnight":5.08,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"Oregon WMR100N Weather Station {UIV32N}","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"note":"The wall-clock-derived Timestamp is deliberately not asserted. Use the raw packet time and a caller-supplied clock/date policy; all other captured fields retain their original values.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APU25N","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"T2TOKYO3","repeated":false}]},"payload":{"type":"position","comment":"Oregon WMR100N Weather Station {UIV32N}","messaging":true,"latitude_deg":35.976333333333336,"longitude_deg":136.4945,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"temperature":{"value":33.0,"unit":"fahrenheit"},"humidity":{"value":98,"unit":"percent"},"pressure":{"value":986,"unit":"hPa"},"rain_1h":{"value":0.0,"unit":"inches"},"rain_24h":{"value":0.2,"unit":"inches"},"rain_since_midnight":{"value":0.2,"unit":"inches"}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-480","title":"TestWxWaterLevel/positive_water_level","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L268","packet":"N0CALL>APRS,TCPIP*:_12032359c000s000g000t033F0123","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":0,"WindSpeed":0,"WindGust":0,"Temp":0.5555555555555556,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":3.7490400000000004,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"weather","comment":"","wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"mph"},"gust":{"value":0.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"},"water_height":{"measurement":{"value":12.3,"unit":"feet"}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-481","title":"TestWxWaterLevel/negative_water_level","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L268","packet":"N0CALL>APRS,TCPIP*:_12032359c000s000g000t033F-042","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":0,"WindSpeed":0,"WindGust":0,"Temp":0.5555555555555556,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":-1.2801600000000002,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"weather","comment":"","wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"mph"},"gust":{"value":0.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"},"water_height":{"measurement":{"value":-4.2,"unit":"feet"}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-482","title":"TestWxWaterLevel/missing_water_level","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L268","packet":"N0CALL>APRS,TCPIP*:_12032359c000s000g000t033F....","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":0,"WindSpeed":0,"WindGust":0,"Temp":0.5555555555555556,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"weather","comment":"","wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"mph"},"gust":{"value":0.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-483","title":"TestWxRadiation/12_microsieverts/hr","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L326","packet":"N0CALL>APRS,TCPIP*:_12032359c000s000g000t033X123","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":0,"WindSpeed":0,"WindGust":0,"Temp":0.5555555555555556,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":12000,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"weather","comment":"","wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"mph"},"gust":{"value":0.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"},"radiation":{"value":12000,"unit":"nSv/h"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-484","title":"TestWxRadiation/45_millisieverts/hr","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L326","packet":"N0CALL>APRS,TCPIP*:_12032359c000s000g000t033X456","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":0,"WindSpeed":0,"WindGust":0,"Temp":0.5555555555555556,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":45000000,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"weather","comment":"","wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"mph"},"gust":{"value":0.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"},"radiation":{"value":45000000,"unit":"nSv/h"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-485","title":"TestWxRadiation/zero_exponent","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L326","packet":"N0CALL>APRS,TCPIP*:_12032359c000s000g000t033X100","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":0,"WindSpeed":0,"WindGust":0,"Temp":0.5555555555555556,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":10,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"weather","comment":"","wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"mph"},"gust":{"value":0.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"},"radiation":{"value":10,"unit":"nSv/h"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-486","title":"TestWxRadiation/missing_radiation","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L326","packet":"N0CALL>APRS,TCPIP*:_12032359c000s000g000t033X...","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":0,"WindSpeed":0,"WindGust":0,"Temp":0.5555555555555556,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"weather","comment":"","wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"mph"},"gust":{"value":0.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-487","title":"TestWxBatteryVoltage/battery_voltage","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L374","packet":"N0CALL>APRS,TCPIP*:_12032359c000s000g000t033V128","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":0,"WindSpeed":0,"WindGust":0,"Temp":0.5555555555555556,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":12.8,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"weather","comment":"","wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"mph"},"gust":{"value":0.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"},"battery_voltage":{"value":12.8,"unit":"volts"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-488","title":"TestWxBatteryVoltage/missing_battery_voltage","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L374","packet":"N0CALL>APRS,TCPIP*:_12032359c000s000g000t033V...","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":0,"WindSpeed":0,"WindGust":0,"Temp":0.5555555555555556,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"weather","comment":"","wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0.0,"unit":"mph"},"gust":{"value":0.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-489","title":"TestWxAllFieldsMissing","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L435","packet":"N0CALL>APRS,TCPIP*:_12032359c...s...g...t...r...p...P...h..b.....#...Os...L...F....X...V...","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":null,"WindSpeed":null,"WindGust":null,"Temp":null,"TempIn":null,"Humidity":null,"HumidityIn":null,"Pressure":null,"Rain1h":null,"Rain24h":null,"RainMidnight":null,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true}]},"payload":{"type":"weather","comment":"Os...L...F....X...V..."}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"],"divergence":["'O' is not a weather field in APRS101, the APRS 1.1 clarification or the APRS 1.2 proposal, so the report ends there and the rest stays in the comment; FAP skips it."]} +{"id":"FAP-490","title":"TestWxPositionlessWithSnowfall","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_basic_test.go#L492","packet":"JH9YVX>APU25N,TCPIP*,qAC,T2TOKYO3:_12032359c180s001g002t033r010p040P080#456b09860h98Os010L500","outcome":"accept","source_expected":{"fap_header":{"source":"JH9YVX","destination":"APU25N","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"T2TOKYO3","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":180,"WindSpeed":0.44704,"WindGust":0.89408,"Temp":0.5555555555555556,"TempIn":null,"Humidity":98,"HumidityIn":null,"Pressure":986,"Rain1h":2.54,"Rain24h":10.16,"RainMidnight":20.32,"Snow24h":2.54,"Luminosity":500,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"JH9YVX","destination":"APU25N","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"T2TOKYO3","repeated":false}]},"payload":{"type":"weather","comment":"Os010L500","wind_direction":{"value":180,"unit":"degrees"},"wind_speed":{"value":1.0,"unit":"mph"},"gust":{"value":2.0,"unit":"mph"},"temperature":{"value":33.0,"unit":"fahrenheit"},"humidity":{"value":98,"unit":"percent"},"pressure":{"value":986,"unit":"hPa"},"rain_1h":{"value":0.1,"unit":"inches"},"rain_24h":{"value":0.4,"unit":"inches"},"rain_since_midnight":{"value":0.8,"unit":"inches"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"],"divergence":["'O' is not a weather field in APRS101, the APRS 1.1 clarification or the APRS 1.2 proposal, so the report ends there and the rest stays in the comment; FAP skips it."]} +{"id":"FAP-491","title":"TestULTW","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_ultw_test.go#L13","packet":"N0CALL-14>APN391,WIDE2-1,qAo,IGATE-3:$ULTW0053002D028D02FA2813000D87BD000103E8015703430010000C","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-14","destination":"APN391","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"IGATE-3","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":64,"WindSpeed":0.3,"WindGust":2.3,"Temp":18.5,"TempIn":null,"Humidity":100,"HumidityIn":null,"Pressure":1025.9,"Rain1h":null,"Rain24h":null,"RainMidnight":4.1,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL-14","destination":"APN391","path":[{"address":"WIDE2-1","repeated":false},{"address":"qAo","repeated":false},{"address":"IGATE-3","repeated":false}]},"payload":{"type":"raw_weather","format":"ultimeter_2000","information":"$ULTW0053002D028D02FA2813000D87BD000103E8015703430010000C","weather":{"comment":"","wind_direction":{"value":64,"unit":"degrees"},"wind_speed":{"value":0.3,"unit":"m/s"},"gust":{"value":2.3,"unit":"m/s"},"temperature":{"value":18.5,"unit":"celsius"},"humidity":{"value":100,"unit":"percent"},"pressure":{"value":1025.9,"unit":"hPa"},"rain_since_midnight":{"value":4.1,"unit":"mm"}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-492","title":"TestULTWBelowZero","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_ultw_test.go#L61","packet":"N0CALL>APN391,qAo,IGATE-1:$ULTW00000000FFEA0000296F000A9663000103E80016025D","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APN391","digipeaters":[{"Call":"qAo","WasDigied":false},{"Call":"IGATE-1","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":0,"WindSpeed":null,"WindGust":0,"Temp":-19,"TempIn":null,"Humidity":100,"HumidityIn":null,"Pressure":1060.7,"Rain1h":null,"Rain24h":null,"RainMidnight":0,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APN391","path":[{"address":"qAo","repeated":false},{"address":"IGATE-1","repeated":false}]},"payload":{"type":"raw_weather","format":"ultimeter_2000","information":"$ULTW00000000FFEA0000296F000A9663000103E80016025D","weather":{"comment":"","wind_direction":{"value":0,"unit":"degrees"},"gust":{"value":0,"unit":"m/s"},"temperature":{"value":-19,"unit":"celsius"},"humidity":{"value":100,"unit":"percent"},"pressure":{"value":1060.7,"unit":"hPa"},"rain_since_midnight":{"value":0,"unit":"mm"}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-493","title":"TestULTWLogging","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_ultw_test.go#L109","packet":"N0CALL>APRS,TCPIP*,qAC,APRSUK2:!!00000066013D000028710166--------0158053201200210","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"APRSUK2","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":144,"WindSpeed":14.7,"WindGust":null,"Temp":-0.2,"TempIn":2.1,"Humidity":null,"HumidityIn":null,"Pressure":1035.3,"Rain1h":null,"Rain24h":null,"RainMidnight":73.2,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"APRSUK2","repeated":false}]},"payload":{"type":"raw_weather","format":"ultimeter_2000","information":"!!00000066013D000028710166--------0158053201200210","weather":{"comment":"","wind_direction":{"value":144,"unit":"degrees"},"wind_speed":{"value":14.7,"unit":"m/s"},"temperature":{"value":-0.2,"unit":"celsius"},"pressure":{"value":1035.3,"unit":"hPa"},"rain_since_midnight":{"value":73.2,"unit":"mm"}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-494","title":"TestULTWLoggingHumidity","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/wx_ultw_test.go#L165","packet":"N0CALL>APRS,TCPIP*,qAC,APRSUK2:!!00000066013D00002871016602BC031E0158053201200210","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":[{"Call":"TCPIP","WasDigied":true},{"Call":"qAC","WasDigied":false},{"Call":"APRSUK2","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":144,"WindSpeed":14.7,"WindGust":null,"Temp":-0.2,"TempIn":2.1,"Humidity":70,"HumidityIn":79,"Pressure":1035.3,"Rain1h":null,"Rain24h":null,"RainMidnight":73.2,"Snow24h":null,"Luminosity":null,"WaterLevel":null,"Radiation":null,"BatteryVoltage":null,"Software":""},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"accept_broken_mice":false,"ax25":false,"raw_timestamp":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"TCPIP","repeated":true},{"address":"qAC","repeated":false},{"address":"APRSUK2","repeated":false}]},"payload":{"type":"raw_weather","format":"ultimeter_2000","information":"!!00000066013D00002871016602BC031E0158053201200210","weather":{"comment":"","wind_direction":{"value":144,"unit":"degrees"},"wind_speed":{"value":14.7,"unit":"m/s"},"temperature":{"value":-0.2,"unit":"celsius"},"humidity":{"value":70,"unit":"percent"},"pressure":{"value":1035.3,"unit":"hPa"},"rain_since_midnight":{"value":73.2,"unit":"mm"}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"]} +{"id":"FAP-495","title":"Supplementary literal / literal","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/cmd/aprs-decode-single/main_test.go#L33","packet":"N0CALL-1>APRS,DIGI1,DIGI2*:)AID #2!4903.50N/07201.75WA","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":[{"Call":"DIGI1","WasDigied":false},{"Call":"DIGI2","WasDigied":true}]},"fap_fields":{"Type":"item","Format":"uncompressed","Latitude":49.05833333333333,"Longitude":-72.02916666666667,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"A","Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"AID #2","Alive":true,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"literal. This supplemental decode is observed behavior; source test assertions cover only their original fields.","expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"APRS","path":[{"address":"DIGI1","repeated":false},{"address":"DIGI2","repeated":true}]},"payload":{"type":"item","comment":"","name":"AID #2","alive":true,"latitude_deg":49.05833333333333,"longitude_deg":-72.02916666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"A"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-496","title":"Supplementary literal / literal","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/cmd/aprs-decode-single/main_test.go#L41","packet":"N0CALL>APRS:T#324,000,038,255,.12,50.12,01000001","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"telemetry","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":{"Seq":324,"Vals":[0,38,255,0.12,50.12],"Bits":"01000001"},"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"literal. This supplemental decode is observed behavior; source test assertions cover only their original fields.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"","sequence":324,"analog":[0,38,255,0.12,50.12],"digital":[false,true,false,false,false,false,false,true]}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-497","title":"Supplementary literal / literal","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/cmd/aprs-decode-single/main_test.go#L50","packet":"N0CALL-1>BEACON-15,WIDE2-1,qAo,N0CALL-2:=6030.35N/02443.91E_150/002g004t039r001P002p004h00b10125L500F0123X123V128XRSW","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"BEACON-15","digipeaters":[{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"N0CALL-2","WasDigied":false}]},"fap_fields":{"Type":"wx","Format":"uncompressed","Latitude":60.505833333333335,"Longitude":24.731833333333334,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"_","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":{"WindDirection":150,"WindSpeed":0.89408,"WindGust":1.78816,"Temp":3.888888888888889,"TempIn":null,"Humidity":100,"HumidityIn":null,"Pressure":1012.5,"Rain1h":0.254,"Rain24h":1.016,"RainMidnight":0.508,"Snow24h":null,"Luminosity":500,"WaterLevel":3.7490400000000004,"Radiation":12000,"BatteryVoltage":12.8,"Software":"XRSW"},"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"literal. This supplemental decode is observed behavior; source test assertions cover only their original fields.","expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"BEACON-15","path":[{"address":"WIDE2-1","repeated":false},{"address":"qAo","repeated":false},{"address":"N0CALL-2","repeated":false}]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":60.505833333333335,"longitude_deg":24.731833333333334,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"wind_direction":{"value":150,"unit":"degrees"},"wind_speed":{"value":2.0,"unit":"disputed_knots_or_mph"},"gust":{"value":4.0,"unit":"mph"},"temperature":{"value":39.0,"unit":"fahrenheit"},"humidity":{"value":100,"unit":"percent"},"pressure":{"value":1012.5,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.04,"unit":"inches"},"rain_since_midnight":{"value":0.02,"unit":"inches"},"luminosity":{"value":500,"unit":"W/m2"},"radiation":{"value":12000,"unit":"nSv/h"},"battery_voltage":{"value":12.8,"unit":"volts"},"water_height":{"measurement":{"value":12.3,"unit":"feet"}}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings","$.fap_fields.Wx.HumidityIn","$.fap_fields.Wx.Software","$.fap_fields.Wx.TempIn"],"divergence":["The uncompressed wind-speed unit is disputed between the specifications and stays marked as disputed; FAP assumes mph."]} +{"id":"FAP-498","title":"Supplementary literal / literal","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/cmd/aprs-decode-single/main_test.go#L99","packet":"N0CALL-14>APU25N,WIDE2-2,qAR,LANSNG:>051421>>Nashville,TN>>Toronto,ON","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-14","destination":"APU25N","digipeaters":[{"Call":"WIDE2-2","WasDigied":false},{"Call":"qAR","WasDigied":false},{"Call":"LANSNG","WasDigied":false}]},"fap_fields":{"Type":"status","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"051421>>Nashville,TN>>Toronto,ON","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"literal. This supplemental decode is observed behavior; source test assertions cover only their original fields.","expected":{"type":"packet","header":{"source":"N0CALL-14","destination":"APU25N","path":[{"address":"WIDE2-2","repeated":false},{"address":"qAR","repeated":false},{"address":"LANSNG","repeated":false}]},"payload":{"type":"status","text":"051421>>Nashville,TN>>Toronto,ON"}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosAmbiguity","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.SymbolCode","$.fap_fields.Warnings"]} +{"id":"FAP-499","title":"Supplementary literal / literal","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/cmd/aprs-decode-single/main_test.go#L121","packet":"N0CALL-1>BEACON-15,N0CALL-2*,WIDE:!6028.51N/02505.68E#PHG7220/RELAY,WIDE, OH2AP Jarvenpaa","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"BEACON-15","digipeaters":[{"Call":"N0CALL-2","WasDigied":true},{"Call":"WIDE","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":60.47516666666667,"Longitude":25.094666666666665,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"7220","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"RELAY,WIDE, OH2AP Jarvenpaa","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"literal. This supplemental decode is observed behavior; source test assertions cover only their original fields.","expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"BEACON-15","path":[{"address":"N0CALL-2","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"position","comment":"RELAY,WIDE, OH2AP Jarvenpaa","messaging":false,"latitude_deg":60.47516666666667,"longitude_deg":25.094666666666665,"ambiguity":0,"symbol":{"table_id":"/","code":"#"},"extensions":{"phg":{"power_w":49,"height_haat_ft":40,"gain_dbi":2,"directivity_deg":null}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-500","title":"Supplementary literal / removed CLI log timestamp","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/cmd/parse-speed-test/main_test.go#L12","packet":"N0CALL-1>APRS:;LEADER *000045z4903.50N/07201.75W>088/036","outcome":"reject","source_expected":{"fap_header":{"source":"N0CALL-1","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"object","Format":"","Latitude":null,"Longitude":null,"PosAmbiguity":null,"PosResolution":null,"SymbolTable":null,"SymbolCode":null,"Speed":null,"Course":null,"Altitude":null,"Messaging":null,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"LEADER *","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null},"fap_error":"fap: obj_inv: invalid object alive/killed indicator: 0"},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"removed CLI log timestamp. This supplemental decode is observed behavior; source test assertions cover only their original fields.","expected":{"original_wire":"N0CALL-1>APRS:;LEADER *000045z4903.50N/07201.75W>088/036"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"FAP-501","title":"Supplementary literal / literal","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/fap_test.go#L175","packet":"OH7LZB-2>APRS,WIDE1-1,WIDE2-1,qAo,OH7LZB:!6128.23N/02353.52E-PHG2360/Testing","outcome":"accept","source_expected":{"fap_header":{"source":"OH7LZB-2","destination":"APRS","digipeaters":[{"Call":"WIDE1-1","WasDigied":false},{"Call":"WIDE2-1","WasDigied":false},{"Call":"qAo","WasDigied":false},{"Call":"OH7LZB","WasDigied":false}]},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":61.4705,"Longitude":23.892,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"-","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"2360","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"Testing","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"literal. This supplemental decode is observed behavior; source test assertions cover only their original fields.","expected":{"type":"packet","header":{"source":"OH7LZB-2","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"WIDE2-1","repeated":false},{"address":"qAo","repeated":false},{"address":"OH7LZB","repeated":false}]},"payload":{"type":"position","comment":"Testing","messaging":false,"latitude_deg":61.4705,"longitude_deg":23.892,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"extensions":{"phg":{"power_w":4,"height_haat_ft":80,"gain_dbi":6,"directivity_deg":null}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-502","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L25","packet":"N0CALL>APRS:!6304.03N/02739.63E#","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":"#"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-503","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L30","packet":"N0CALL>APRS:!2338.56S/04647.82W#","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":-23.642666666666667,"Longitude":-46.797,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":-23.642666666666667,"longitude_deg":-46.797,"ambiguity":0,"symbol":{"table_id":"/","code":"#"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-504","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L35","packet":"N0CALL>APRS:!2259.99N/17759.99W#","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":22.999833333333335,"Longitude":-177.99983333333333,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":22.999833333333335,"longitude_deg":-177.99983333333333,"ambiguity":0,"symbol":{"table_id":"/","code":"#"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-505","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L40","packet":"N0CALL>APRS:!5221.84N/01406.27E>353/045/A=000314","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":52.364,"Longitude":14.1045,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":83.34,"Course":353,"Altitude":95.7072,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":52.364,"longitude_deg":14.1045,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":45.0,"course_deg":353},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":314.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-506","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L45","packet":"N0CALL>APRS:!5221.84N/01406.27E>/A=000314","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":52.364,"Longitude":14.1045,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":95.7072,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":52.364,"longitude_deg":14.1045,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":314.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-507","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L50","packet":"N0CALL>APRS:!5221.8 N/01406.2 E>","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":52.36416666666667,"Longitude":14.104166666666666,"PosAmbiguity":1,"PosResolution":185.2,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":52.36416666666667,"longitude_deg":14.104166666666666,"ambiguity":1,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-508","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L55","packet":"N0CALL>APRS:!5221. N/01406. E>","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":52.358333333333334,"Longitude":14.108333333333333,"PosAmbiguity":2,"PosResolution":1852,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":52.358333333333334,"longitude_deg":14.108333333333333,"ambiguity":2,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-509","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L60","packet":"N0CALL>APRS:!522 . N/0140 . E>","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":52.416666666666664,"Longitude":14.083333333333334,"PosAmbiguity":3,"PosResolution":18520,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":52.416666666666664,"longitude_deg":14.083333333333334,"ambiguity":3,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-510","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L65","packet":"N0CALL>APRS:!52 . N/014 . E>","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":52.5,"Longitude":14.5,"PosAmbiguity":4,"PosResolution":111120,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":52.5,"longitude_deg":14.5,"ambiguity":4,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-511","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L70","packet":"N0CALL>APRS:!3909.22N/08437.32W>!wjM!","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":39.153800366300366,"Longitude":-84.62208058608059,"PosAmbiguity":0,"PosResolution":0.1852,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":39.153800366300366,"longitude_deg":-84.62208058608059,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-512","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L75","packet":"N0CALL>APRS:!3959.99N/08459.99W>!w{{!","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":39.99999816849817,"Longitude":-84.99999816849817,"PosAmbiguity":0,"PosResolution":0.1852,"SymbolTable":"/","SymbolCode":">","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":39.99999816849817,"longitude_deg":-84.99999816849817,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-513","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L81","packet":"N0CALL>APRS:!4822.38N/01542.88E>321/034/A=000633Comment blah!wr^!","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":48.37314835164835,"Longitude":15.714778388278388,"PosAmbiguity":0,"PosResolution":0.1852,"SymbolTable":"/","SymbolCode":">","Speed":62.968,"Course":321,"Altitude":192.9384,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":"W","GPSFixStatus":null,"ChecksumOK":null,"Comment":"Comment blah","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","extension_tags":["DAO"],"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Comment blah","messaging":false,"latitude_deg":48.37314835164835,"longitude_deg":15.714778388278388,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":34.0,"course_deg":321},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":633.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-514","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L87","packet":"N0CALL>APRS:/123045h6304.03N/02739.63E#","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"123045","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":"#"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-515","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L93","packet":"N0CALL>APRS:/000000h5221.84N/01406.27E>353/045/A=000314","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":52.364,"Longitude":14.1045,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":">","Speed":83.34,"Course":353,"Altitude":95.7072,"Messaging":false,"PHG":"","RadioRange":null,"RawTimestamp":"000000","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":52.364,"longitude_deg":14.1045,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"speed_knots":45.0,"course_deg":353},"altitude":{"encoding":"feet_extension","measurement":{"unit":"feet","value":314.0}}}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-516","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L99","packet":"N0CALL>APRS:=6304.03N/02739.63E#","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":"#"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} +{"id":"FAP-517","title":"Supplementary literal / synthetic TNC2 header on expected encoder body","profile":"compatibility-fap","source":"https://github.com/hessu/go-aprs-fap/blob/94c7118ca94d251990382b9210112ddd5b260efa/position_encode_test.go#L105","packet":"N0CALL>APRS:@123045h6304.03N/02739.63E#","outcome":"accept","source_expected":{"fap_header":{"source":"N0CALL","destination":"APRS","digipeaters":null},"fap_fields":{"Type":"location","Format":"uncompressed","Latitude":63.067166666666665,"Longitude":27.6605,"PosAmbiguity":0,"PosResolution":18.52,"SymbolTable":"/","SymbolCode":"#","Speed":null,"Course":null,"Altitude":null,"Messaging":true,"PHG":"","RadioRange":null,"RawTimestamp":"123045","ObjectName":"","ItemName":"","Alive":null,"Message":null,"Status":"","Wx":null,"TelemetryData":null,"Capabilities":null,"MBits":"","MiceMangled":false,"DaoDatumByte":null,"GPSFixStatus":null,"ChecksumOK":null,"Comment":"","Warnings":null}},"options":{"ax25":false,"accept_broken_mice":false,"raw_timestamp":true},"note":"synthetic TNC2 header on expected encoder body. Encoder input coordinates are not asserted as the decoded coordinate; quantization and ambiguity change them.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":63.067166666666665,"longitude_deg":27.6605,"ambiguity":0,"symbol":{"table_id":"/","code":"#"}}},"unmapped":["$.fap_fields.Capabilities","$.fap_fields.ChecksumOK","$.fap_fields.DaoDatumByte","$.fap_fields.GPSFixStatus","$.fap_fields.MBits","$.fap_fields.MiceMangled","$.fap_fields.ObjectName","$.fap_fields.PosResolution","$.fap_fields.RawTimestamp","$.fap_fields.Warnings"]} diff --git a/packages/aprs/tests/vectors/hdr.jsonl b/packages/aprs/tests/vectors/hdr.jsonl new file mode 100644 index 0000000..4f4eb08 --- /dev/null +++ b/packages/aprs/tests/vectors/hdr.jsonl @@ -0,0 +1,51 @@ +{"id":"HDR-001","title":"No digipeaters","profile":"core-1.1","source":"APRS101 pp. 12, 83-85","packet":"N0CALL>APRS:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":[]} +{"id":"HDR-002","title":"Source SSID zero explicit","profile":"core-1.1","source":"APRS101 pp. 12, 83-85","packet":"N0CALL-0>APRS:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL-0","destination":"APRS","path":[]},"kind":"status","status_text":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL-0","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":[]} +{"id":"HDR-003","title":"Maximum source SSID","profile":"core-1.1","source":"APRS101 pp. 12, 83-85","packet":"N0CALL-15>APRS:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL-15","destination":"APRS","path":[]},"kind":"status","status_text":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL-15","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":[]} +{"id":"HDR-004","title":"One used and one unused digi","profile":"core-1.1","source":"APRS101 pp. 12, 83-85","packet":"N0CALL>APRS,W1ABC*,WIDE2-1:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"W1ABC","repeated_marker":true},{"address":"WIDE2-1","repeated_marker":false}]},"kind":"status","status_text":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"W1ABC","repeated":true},{"address":"WIDE2-1","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":[]} +{"id":"HDR-005","title":"Multiple explicit repeated markers","profile":"core-1.1","source":"APRS101 pp. 12, 83-85","packet":"N0CALL>APRS,W1ABC*,W2ABC*,WIDE2-1:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"W1ABC","repeated_marker":true},{"address":"W2ABC","repeated_marker":true},{"address":"WIDE2-1","repeated_marker":false}]},"kind":"status","status_text":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"W1ABC","repeated":true},{"address":"W2ABC","repeated":true},{"address":"WIDE2-1","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":[]} +{"id":"HDR-006","title":"Eight RF digipeaters","profile":"core-1.1","source":"APRS101 pp. 12, 83-85","packet":"N0CALL>APRS,D1,D2,D3,D4,D5,D6,D7,D8:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"D1","repeated_marker":false},{"address":"D2","repeated_marker":false},{"address":"D3","repeated_marker":false},{"address":"D4","repeated_marker":false},{"address":"D5","repeated_marker":false},{"address":"D6","repeated_marker":false},{"address":"D7","repeated_marker":false},{"address":"D8","repeated_marker":false}]},"kind":"status","status_text":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"D1","repeated":false},{"address":"D2","repeated":false},{"address":"D3","repeated":false},{"address":"D4","repeated":false},{"address":"D5","repeated":false},{"address":"D6","repeated":false},{"address":"D7","repeated":false},{"address":"D8","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":[]} +{"id":"HDR-007","title":"Colon belongs to payload after first separator","profile":"core-1.1","source":"APRS101 pp. 12, 83-85","packet":"N0CALL>APRS:>radio: ready > listening","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"radio: ready > listening"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"radio: ready > listening"}},"unmapped":[]} +{"id":"HDR-008","title":"Destination dispatch AIR1","profile":"historical-1.0","source":"APRS101 pp. 13-15","packet":"N0CALL>AIR1:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"AIR1","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"AIR1","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-009","title":"Destination dispatch ALL","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>ALL:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"ALL","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"ALL","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-010","title":"Destination dispatch APRS","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>APRS:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-011","title":"Destination dispatch BEACON","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>BEACON:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"BEACON","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"BEACON","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-012","title":"Destination dispatch CQ","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>CQ:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"CQ","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"CQ","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-013","title":"Destination dispatch GPS","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>GPS:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"GPS","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"GPS","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-014","title":"Destination dispatch DF1","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>DF1:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"DF1","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"DF1","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-015","title":"Destination dispatch DGPS","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>DGPS:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"DGPS","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"DGPS","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-016","title":"Destination dispatch DRILL","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>DRILL:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"DRILL","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"DRILL","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-017","title":"Destination dispatch DX","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>DX:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"DX","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"DX","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-018","title":"Destination dispatch ID","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>ID:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"ID","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"ID","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-019","title":"Destination dispatch JAVA","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>JAVA:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"JAVA","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"JAVA","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-020","title":"Destination dispatch MAIL","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>MAIL:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"MAIL","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"MAIL","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-021","title":"Destination dispatch MICE","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>MICE:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"MICE","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"MICE","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-022","title":"Destination dispatch QST","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>QST:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"QST","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"QST","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-023","title":"Destination dispatch QTH","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>QTH:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"QTH","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"QTH","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-024","title":"Destination dispatch RTCM","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>RTCM:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"RTCM","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"RTCM","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-025","title":"Destination dispatch SKY","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>SKY:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"SKY","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"SKY","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-026","title":"Destination dispatch SPACE","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>SPACE:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"SPACE","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"SPACE","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-027","title":"Destination dispatch SPCL","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>SPCL:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"SPCL","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"SPCL","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-028","title":"Destination dispatch SYM","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>SYM:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"SYM","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"SYM","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-029","title":"Destination dispatch TEL","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>TEL:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"TEL","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"TEL","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-030","title":"Destination dispatch TEST","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>TEST:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"TEST","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"TEST","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-031","title":"Destination dispatch TLM","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>TLM:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"TLM","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"TLM","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-032","title":"Destination dispatch WX","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>WX:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"WX","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"WX","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-033","title":"Destination dispatch ZIP1","profile":"historical-1.0","source":"APRS101 pp. 13-15","packet":"N0CALL>ZIP1:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"ZIP1","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"ZIP1","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-034","title":"Destination dispatch APM326","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>APM326:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APM326","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"APRS-address"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APM326","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-035","title":"Destination dispatch ALTNET","profile":"core-1.1","source":"APRS101 pp. 13-15","packet":"N0CALL>ALTNET:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"ALTNET","path":[]},"kind":"status","status_text":"Ready","destination_semantics":"alternate-net"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"ALTNET","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_semantics"]} +{"id":"HDR-036","title":"Historical destination SSID routing 0","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-0:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-0","path":[]},"kind":"status","status_text":"Ready","destination_ssid":0,"historical_generic_path":"VIA"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-0","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-037","title":"Historical destination SSID routing 1","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-1:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-1","path":[]},"kind":"status","status_text":"Ready","destination_ssid":1,"historical_generic_path":"WIDE1-1"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-1","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-038","title":"Historical destination SSID routing 2","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-2:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-2","path":[]},"kind":"status","status_text":"Ready","destination_ssid":2,"historical_generic_path":"WIDE2-2"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-2","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-039","title":"Historical destination SSID routing 3","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-3:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-3","path":[]},"kind":"status","status_text":"Ready","destination_ssid":3,"historical_generic_path":"WIDE3-3"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-3","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-040","title":"Historical destination SSID routing 4","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-4:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-4","path":[]},"kind":"status","status_text":"Ready","destination_ssid":4,"historical_generic_path":"WIDE4-4"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-4","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-041","title":"Historical destination SSID routing 5","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-5:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-5","path":[]},"kind":"status","status_text":"Ready","destination_ssid":5,"historical_generic_path":"WIDE5-5"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-5","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-042","title":"Historical destination SSID routing 6","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-6:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-6","path":[]},"kind":"status","status_text":"Ready","destination_ssid":6,"historical_generic_path":"WIDE6-6"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-6","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-043","title":"Historical destination SSID routing 7","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-7:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-7","path":[]},"kind":"status","status_text":"Ready","destination_ssid":7,"historical_generic_path":"WIDE7-7"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-7","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-044","title":"Historical destination SSID routing 8","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-8:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-8","path":[]},"kind":"status","status_text":"Ready","destination_ssid":8,"historical_generic_path":"North"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-8","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-045","title":"Historical destination SSID routing 9","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-9:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-9","path":[]},"kind":"status","status_text":"Ready","destination_ssid":9,"historical_generic_path":"South"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-9","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-046","title":"Historical destination SSID routing 10","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-10:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-10","path":[]},"kind":"status","status_text":"Ready","destination_ssid":10,"historical_generic_path":"East"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-10","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-047","title":"Historical destination SSID routing 11","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-11:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-11","path":[]},"kind":"status","status_text":"Ready","destination_ssid":11,"historical_generic_path":"West"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-11","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-048","title":"Historical destination SSID routing 12","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-12:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-12","path":[]},"kind":"status","status_text":"Ready","destination_ssid":12,"historical_generic_path":"North + WIDE"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-12","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-049","title":"Historical destination SSID routing 13","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-13:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-13","path":[]},"kind":"status","status_text":"Ready","destination_ssid":13,"historical_generic_path":"South + WIDE"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-13","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-050","title":"Historical destination SSID routing 14","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-14:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-14","path":[]},"kind":"status","status_text":"Ready","destination_ssid":14,"historical_generic_path":"East + WIDE"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-14","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} +{"id":"HDR-051","title":"Historical destination SSID routing 15","profile":"historical-1.0","source":"APRS101 pp. 15-16","packet":"N0CALL>APRS-15:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS-15","path":[]},"kind":"status","status_text":"Ready","destination_ssid":15,"historical_generic_path":"West + WIDE"},"note":"Decode the historical field; this is not a recommendation to transmit this path.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS-15","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_ssid","$.historical_generic_path"]} diff --git a/packages/aprs/tests/vectors/mic.jsonl b/packages/aprs/tests/vectors/mic.jsonl new file mode 100644 index 0000000..9e65ffa --- /dev/null +++ b/packages/aprs/tests/vectors/mic.jsonl @@ -0,0 +1,265 @@ +{"id":"MIC-001","title":"Standard position comment 000","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>332UVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"332UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"000","position_comment_set":"standard","position_comment":"Emergency","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"332UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"emergency","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-002","title":"Standard position comment 001","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>33RUVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"33RUVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"001","position_comment_set":"standard","position_comment":"Priority","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"33RUVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"priority","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-003","title":"Standard position comment 010","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>3S2UVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"3S2UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"010","position_comment_set":"standard","position_comment":"Special","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"3S2UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"special","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-004","title":"Standard position comment 011","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>3SRUVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"3SRUVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"011","position_comment_set":"standard","position_comment":"Committed","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"3SRUVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"committed","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-005","title":"Standard position comment 100","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-006","title":"Standard position comment 101","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>S3RUVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S3RUVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"101","position_comment_set":"standard","position_comment":"In Service","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S3RUVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"in_service","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-007","title":"Standard position comment 110","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>SS2UVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"SS2UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"110","position_comment_set":"standard","position_comment":"En Route","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"SS2UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"en_route","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-008","title":"Standard position comment 111","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>SSRUVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"SSRUVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"111","position_comment_set":"standard","position_comment":"Off Duty","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"SSRUVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"off_duty","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-009","title":"Custom position comment 001","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>33CUVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"33CUVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"001","position_comment_set":"custom","position_comment":"Custom-6","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"33CUVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"custom_6","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-010","title":"Custom position comment 010","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>3D2UVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"3D2UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"010","position_comment_set":"custom","position_comment":"Custom-5","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"3D2UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"custom_5","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-011","title":"Custom position comment 011","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>3DCUVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"3DCUVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"011","position_comment_set":"custom","position_comment":"Custom-4","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"3DCUVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"custom_4","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-012","title":"Custom position comment 100","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>D32UVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"D32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"custom","position_comment":"Custom-3","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"D32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"custom_3","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-013","title":"Custom position comment 101","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>D3CUVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"D3CUVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"101","position_comment_set":"custom","position_comment":"Custom-2","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"D3CUVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"custom_2","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-014","title":"Custom position comment 110","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>DD2UVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"DD2UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"110","position_comment_set":"custom","position_comment":"Custom-1","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"DD2UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"custom_1","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-015","title":"Custom position comment 111","profile":"core-1.1","source":"APRS101 pp. 43-46","packet":"N0CALL>DDCUVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"DDCUVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"111","position_comment_set":"custom","position_comment":"Custom-0","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"DDCUVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"custom_0","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-016","title":"Longitude degrees 000","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`v_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-0.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-0.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-017","title":"Longitude degrees 001","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`w_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-1.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-1.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-018","title":"Longitude degrees 002","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`x_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-2.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-2.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-019","title":"Longitude degrees 003","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`y_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-3.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-3.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-020","title":"Longitude degrees 004","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`z_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-4.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-4.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-021","title":"Longitude degrees 005","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`{_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-5.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-5.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-022","title":"Longitude degrees 006","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`|_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-6.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-6.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-023","title":"Longitude degrees 007","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`}_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-7.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-7.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-024","title":"Longitude degrees 008","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`~_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-8.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-8.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-025","title":"Longitude degrees 009","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`\u007f_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-9.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-9.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-026","title":"Longitude degrees 010","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`&_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-10.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-10.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-027","title":"Longitude degrees 011","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`'_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-11.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-11.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-028","title":"Longitude degrees 012","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-12.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-12.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-029","title":"Longitude degrees 013","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`)_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-13.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-13.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-030","title":"Longitude degrees 014","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`*_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-14.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-14.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-031","title":"Longitude degrees 015","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`+_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-15.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-15.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-032","title":"Longitude degrees 016","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`,_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-16.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-16.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-033","title":"Longitude degrees 017","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`-_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-17.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-17.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-034","title":"Longitude degrees 018","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`._f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-18.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-18.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-035","title":"Longitude degrees 019","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`/_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-19.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-19.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-036","title":"Longitude degrees 020","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`0_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-20.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-20.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-037","title":"Longitude degrees 021","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`1_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-21.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-21.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-038","title":"Longitude degrees 022","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`2_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-22.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-22.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-039","title":"Longitude degrees 023","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`3_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-23.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-23.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-040","title":"Longitude degrees 024","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`4_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-24.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-24.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-041","title":"Longitude degrees 025","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`5_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-25.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-25.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-042","title":"Longitude degrees 026","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`6_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-26.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-26.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-043","title":"Longitude degrees 027","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`7_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-27.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-27.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-044","title":"Longitude degrees 028","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`8_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-28.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-28.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-045","title":"Longitude degrees 029","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`9_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-29.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-29.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-046","title":"Longitude degrees 030","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`:_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-30.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-30.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-047","title":"Longitude degrees 031","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`;_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-31.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-31.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-048","title":"Longitude degrees 032","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`<_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-32.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-32.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-049","title":"Longitude degrees 033","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`=_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-33.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-33.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-050","title":"Longitude degrees 034","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`>_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-34.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-34.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-051","title":"Longitude degrees 035","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`?_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-35.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-35.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-052","title":"Longitude degrees 036","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`@_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-36.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-36.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-053","title":"Longitude degrees 037","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`A_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-37.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-37.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-054","title":"Longitude degrees 038","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`B_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-38.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-38.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-055","title":"Longitude degrees 039","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`C_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-39.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-39.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-056","title":"Longitude degrees 040","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`D_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-40.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-40.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-057","title":"Longitude degrees 041","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`E_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-41.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-41.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-058","title":"Longitude degrees 042","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`F_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-42.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-42.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-059","title":"Longitude degrees 043","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`G_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-43.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-43.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-060","title":"Longitude degrees 044","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`H_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-44.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-44.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-061","title":"Longitude degrees 045","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`I_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-45.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-45.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-062","title":"Longitude degrees 046","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`J_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-46.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-46.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-063","title":"Longitude degrees 047","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`K_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-47.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-47.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-064","title":"Longitude degrees 048","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`L_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-48.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-48.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-065","title":"Longitude degrees 049","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`M_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-49.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-49.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-066","title":"Longitude degrees 050","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`N_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-50.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-50.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-067","title":"Longitude degrees 051","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`O_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-51.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-51.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-068","title":"Longitude degrees 052","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`P_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-52.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-52.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-069","title":"Longitude degrees 053","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`Q_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-53.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-53.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-070","title":"Longitude degrees 054","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`R_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-54.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-54.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-071","title":"Longitude degrees 055","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`S_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-55.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-55.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-072","title":"Longitude degrees 056","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`T_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-56.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-56.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-073","title":"Longitude degrees 057","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`U_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-57.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-57.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-074","title":"Longitude degrees 058","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`V_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-58.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-58.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-075","title":"Longitude degrees 059","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`W_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-59.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-59.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-076","title":"Longitude degrees 060","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`X_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-60.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-60.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-077","title":"Longitude degrees 061","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`Y_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-61.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-61.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-078","title":"Longitude degrees 062","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`Z_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-62.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-62.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-079","title":"Longitude degrees 063","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`[_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-63.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-63.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-080","title":"Longitude degrees 064","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`\\_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-64.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-64.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-081","title":"Longitude degrees 065","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`]_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-65.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-65.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-082","title":"Longitude degrees 066","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`^_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-66.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-66.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-083","title":"Longitude degrees 067","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`__f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-67.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-67.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-084","title":"Longitude degrees 068","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:``_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-68.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-68.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-085","title":"Longitude degrees 069","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`a_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-69.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-69.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-086","title":"Longitude degrees 070","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`b_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-70.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-70.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-087","title":"Longitude degrees 071","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`c_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-71.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-71.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-088","title":"Longitude degrees 072","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`d_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-72.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-72.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-089","title":"Longitude degrees 073","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`e_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-73.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-73.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-090","title":"Longitude degrees 074","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`f_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-74.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-74.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-091","title":"Longitude degrees 075","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`g_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-75.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-75.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-092","title":"Longitude degrees 076","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`h_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-76.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-76.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-093","title":"Longitude degrees 077","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`i_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-77.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-77.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-094","title":"Longitude degrees 078","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`j_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-78.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-78.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-095","title":"Longitude degrees 079","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`k_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-79.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-79.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-096","title":"Longitude degrees 080","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`l_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-80.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-80.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-097","title":"Longitude degrees 081","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`m_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-81.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-81.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-098","title":"Longitude degrees 082","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`n_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-82.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-82.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-099","title":"Longitude degrees 083","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`o_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-83.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-83.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-100","title":"Longitude degrees 084","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`p_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-84.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-84.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-101","title":"Longitude degrees 085","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`q_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-85.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-85.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-102","title":"Longitude degrees 086","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`r_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-86.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-86.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-103","title":"Longitude degrees 087","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`s_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-87.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-87.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-104","title":"Longitude degrees 088","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`t_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-88.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-88.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-105","title":"Longitude degrees 089","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`u_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-89.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-89.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-106","title":"Longitude degrees 090","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`v_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-90.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-90.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-107","title":"Longitude degrees 091","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`w_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-91.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-91.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-108","title":"Longitude degrees 092","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`x_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-92.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-92.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-109","title":"Longitude degrees 093","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`y_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-93.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-93.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-110","title":"Longitude degrees 094","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`z_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-94.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-94.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-111","title":"Longitude degrees 095","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`{_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-95.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-95.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-112","title":"Longitude degrees 096","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`|_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-96.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-96.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-113","title":"Longitude degrees 097","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`}_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-97.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-97.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-114","title":"Longitude degrees 098","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`~_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-98.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-98.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-115","title":"Longitude degrees 099","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32U6T:`\u007f_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32U6T","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-99.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":0,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32U6T","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-99.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-116","title":"Longitude degrees 100","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`l_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-100.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-100.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-117","title":"Longitude degrees 101","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`m_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-101.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-101.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-118","title":"Longitude degrees 102","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`n_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-102.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-102.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-119","title":"Longitude degrees 103","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`o_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-103.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-103.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-120","title":"Longitude degrees 104","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`p_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-104.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-104.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-121","title":"Longitude degrees 105","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`q_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-105.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-105.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-122","title":"Longitude degrees 106","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`r_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-106.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-106.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-123","title":"Longitude degrees 107","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`s_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-107.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-107.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-124","title":"Longitude degrees 108","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`t_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-108.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-108.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-125","title":"Longitude degrees 109","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`u_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-109.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-109.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-126","title":"Longitude degrees 110","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`&_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-110.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-110.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-127","title":"Longitude degrees 111","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`'_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-111.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-111.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-128","title":"Longitude degrees 112","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-129","title":"Longitude degrees 113","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`)_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-113.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-113.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-130","title":"Longitude degrees 114","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`*_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-114.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-114.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-131","title":"Longitude degrees 115","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`+_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-115.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-115.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-132","title":"Longitude degrees 116","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`,_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-116.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-116.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-133","title":"Longitude degrees 117","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`-_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-117.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-117.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-134","title":"Longitude degrees 118","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`._f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-118.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-118.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-135","title":"Longitude degrees 119","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`/_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-119.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-119.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-136","title":"Longitude degrees 120","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`0_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-120.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-120.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-137","title":"Longitude degrees 121","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`1_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-121.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-121.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-138","title":"Longitude degrees 122","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`2_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-122.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-122.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-139","title":"Longitude degrees 123","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`3_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-123.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-123.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-140","title":"Longitude degrees 124","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`4_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-124.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-124.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-141","title":"Longitude degrees 125","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`5_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-125.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-125.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-142","title":"Longitude degrees 126","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`6_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-126.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-126.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-143","title":"Longitude degrees 127","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`7_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-127.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-127.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-144","title":"Longitude degrees 128","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`8_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-128.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-128.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-145","title":"Longitude degrees 129","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`9_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-129.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-129.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-146","title":"Longitude degrees 130","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`:_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-130.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-130.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-147","title":"Longitude degrees 131","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`;_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-131.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-131.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-148","title":"Longitude degrees 132","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`<_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-132.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-132.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-149","title":"Longitude degrees 133","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`=_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-133.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-133.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-150","title":"Longitude degrees 134","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`>_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-134.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-134.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-151","title":"Longitude degrees 135","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`?_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-135.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-135.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-152","title":"Longitude degrees 136","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`@_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-136.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-136.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-153","title":"Longitude degrees 137","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`A_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-137.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-137.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-154","title":"Longitude degrees 138","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`B_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-138.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-138.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-155","title":"Longitude degrees 139","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`C_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-139.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-139.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-156","title":"Longitude degrees 140","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`D_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-140.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-140.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-157","title":"Longitude degrees 141","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`E_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-141.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-141.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-158","title":"Longitude degrees 142","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`F_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-142.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-142.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-159","title":"Longitude degrees 143","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`G_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-143.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-143.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-160","title":"Longitude degrees 144","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`H_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-144.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-144.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-161","title":"Longitude degrees 145","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`I_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-145.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-145.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-162","title":"Longitude degrees 146","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`J_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-146.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-146.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-163","title":"Longitude degrees 147","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`K_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-147.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-147.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-164","title":"Longitude degrees 148","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`L_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-148.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-148.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-165","title":"Longitude degrees 149","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`M_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-149.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-149.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-166","title":"Longitude degrees 150","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`N_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-150.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-150.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-167","title":"Longitude degrees 151","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`O_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-151.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-151.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-168","title":"Longitude degrees 152","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`P_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-152.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-152.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-169","title":"Longitude degrees 153","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`Q_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-153.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-153.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-170","title":"Longitude degrees 154","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`R_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-154.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-154.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-171","title":"Longitude degrees 155","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`S_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-155.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-155.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-172","title":"Longitude degrees 156","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`T_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-156.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-156.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-173","title":"Longitude degrees 157","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`U_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-157.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-157.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-174","title":"Longitude degrees 158","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`V_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-158.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-158.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-175","title":"Longitude degrees 159","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`W_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-159.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-159.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-176","title":"Longitude degrees 160","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`X_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-160.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-160.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-177","title":"Longitude degrees 161","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`Y_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-161.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-161.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-178","title":"Longitude degrees 162","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`Z_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-162.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-162.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-179","title":"Longitude degrees 163","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`[_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-163.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-163.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-180","title":"Longitude degrees 164","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`\\_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-164.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-164.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-181","title":"Longitude degrees 165","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`]_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-165.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-165.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-182","title":"Longitude degrees 166","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`^_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-166.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-166.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-183","title":"Longitude degrees 167","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`__f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-167.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-167.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-184","title":"Longitude degrees 168","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:``_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-168.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-168.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-185","title":"Longitude degrees 169","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`a_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-169.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-169.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-186","title":"Longitude degrees 170","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`b_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-170.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-170.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-187","title":"Longitude degrees 171","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`c_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-171.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-171.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-188","title":"Longitude degrees 172","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`d_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-172.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-172.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-189","title":"Longitude degrees 173","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`e_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-173.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-173.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-190","title":"Longitude degrees 174","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`f_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-174.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-174.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-191","title":"Longitude degrees 175","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`g_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-175.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-175.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-192","title":"Longitude degrees 176","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`h_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-176.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-176.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-193","title":"Longitude degrees 177","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`i_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-177.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-177.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-194","title":"Longitude degrees 178","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`j_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-178.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-178.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-195","title":"Longitude degrees 179","profile":"core-1.1","source":"APRS101 pp. 47-48; A11: Mic-E longitude erratum","packet":"N0CALL>S32UVT:`k_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-179.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-179.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-196","title":"Longitude minutes 0","profile":"core-1.1","source":"APRS101 p. 48","packet":"N0CALL>S32UVT:`(Xf\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.012333333333,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.012333333333,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-197","title":"Longitude minutes 1","profile":"core-1.1","source":"APRS101 p. 48","packet":"N0CALL>S32UVT:`(Yf\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.029,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.029,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-198","title":"Longitude minutes 8","profile":"core-1.1","source":"APRS101 p. 48","packet":"N0CALL>S32UVT:`(`f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.145666666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.145666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-199","title":"Longitude minutes 9","profile":"core-1.1","source":"APRS101 p. 48","packet":"N0CALL>S32UVT:`(af\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.162333333333,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.162333333333,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-200","title":"Longitude minutes 10","profile":"core-1.1","source":"APRS101 p. 48","packet":"N0CALL>S32UVT:`(&f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.179,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.179,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-201","title":"Longitude minutes 11","profile":"core-1.1","source":"APRS101 p. 48","packet":"N0CALL>S32UVT:`('f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.195666666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.195666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-202","title":"Longitude minutes 58","profile":"core-1.1","source":"APRS101 p. 48","packet":"N0CALL>S32UVT:`(Vf\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.979,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.979,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-203","title":"Longitude minutes 59","profile":"core-1.1","source":"APRS101 p. 48","packet":"N0CALL>S32UVT:`(Wf\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.995666666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.995666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-204","title":"Longitude hundredths 0","profile":"core-1.1","source":"APRS101 p. 49","packet":"N0CALL>S32UVT:`(_\u001c\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.116666666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.116666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-205","title":"Longitude hundredths 1","profile":"core-1.1","source":"APRS101 p. 49","packet":"N0CALL>S32UVT:`(_\u001d\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.116833333333,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.116833333333,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-206","title":"Longitude hundredths 2","profile":"core-1.1","source":"APRS101 p. 49","packet":"N0CALL>S32UVT:`(_\u001e\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.117,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.117,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-207","title":"Longitude hundredths 3","profile":"core-1.1","source":"APRS101 p. 49","packet":"N0CALL>S32UVT:`(_\u001f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.117166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.117166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-208","title":"Longitude hundredths 4","profile":"core-1.1","source":"APRS101 p. 49","packet":"N0CALL>S32UVT:`(_ \u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.117333333333,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.117333333333,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-209","title":"Longitude hundredths 95","profile":"core-1.1","source":"APRS101 p. 49","packet":"N0CALL>S32UVT:`(_{\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.1325,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.1325,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-210","title":"Longitude hundredths 96","profile":"core-1.1","source":"APRS101 p. 49","packet":"N0CALL>S32UVT:`(_|\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.132666666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.132666666667,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-211","title":"Longitude hundredths 97","profile":"core-1.1","source":"APRS101 p. 49","packet":"N0CALL>S32UVT:`(_}\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.132833333333,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.132833333333,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-212","title":"Longitude hundredths 98","profile":"core-1.1","source":"APRS101 p. 49","packet":"N0CALL>S32UVT:`(_~\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.133,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.133,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-213","title":"Longitude hundredths 99","profile":"core-1.1","source":"APRS101 p. 49","packet":"N0CALL>S32UVT:`(_\u007f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.133166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.133166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-214","title":"Movement 0 kt / 0 deg / alternate=False","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_f\u001c\u001c\u001cj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":0,"speed_kmh":0.0,"course_code":0,"course_deg":0},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":0,"speed_knots":0,"course_code":0}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-215","title":"Movement 0 kt / 0 deg / alternate=True","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_fl \u001cj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":0,"speed_kmh":0.0,"course_code":0,"course_deg":0},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":0,"speed_knots":0,"course_code":0}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-216","title":"Movement 0 kt / 1 deg / alternate=False","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_f\u001c\u001c\u001dj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":0,"speed_kmh":0.0,"course_code":1,"course_deg":1},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":1,"speed_knots":0,"course_code":1}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-217","title":"Movement 0 kt / 1 deg / alternate=True","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_fl \u001dj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":0,"speed_kmh":0.0,"course_code":1,"course_deg":1},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":1,"speed_knots":0,"course_code":1}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-218","title":"Movement 9 kt / 99 deg / alternate=False","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_f\u001cv\u007fj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":9,"speed_kmh":16.668,"course_code":99,"course_deg":99},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":99,"speed_knots":9,"course_code":99}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-219","title":"Movement 9 kt / 99 deg / alternate=True","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_flz\u007fj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":9,"speed_kmh":16.668,"course_code":99,"course_deg":99},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":99,"speed_knots":9,"course_code":99}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-220","title":"Movement 10 kt / 100 deg / alternate=False","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_f\u001d\u001d\u001cj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":10,"speed_kmh":18.52,"course_code":100,"course_deg":100},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":100,"speed_knots":10,"course_code":100}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-221","title":"Movement 10 kt / 100 deg / alternate=True","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_fm!\u001cj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":10,"speed_kmh":18.52,"course_code":100,"course_deg":100},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":100,"speed_knots":10,"course_code":100}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-222","title":"Movement 73 kt / 294 deg / alternate=False","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_f#S32UVT:`(_fs@zj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":73,"speed_kmh":135.196,"course_code":294,"course_deg":294},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":294,"speed_knots":73,"course_code":294}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-224","title":"Movement 86 kt / 194 deg / alternate=False","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_f$Yzj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":86,"speed_kmh":159.272,"course_code":194,"course_deg":194},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":194,"speed_knots":86,"course_code":194}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-225","title":"Movement 86 kt / 194 deg / alternate=True","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_ft]zj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":86,"speed_kmh":159.272,"course_code":194,"course_deg":194},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":194,"speed_knots":86,"course_code":194}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-226","title":"Movement 199 kt / 199 deg / alternate=False","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_f/w\u007fj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":199,"speed_kmh":368.548,"course_code":199,"course_deg":199},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":199,"speed_knots":199,"course_code":199}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-227","title":"Movement 199 kt / 199 deg / alternate=True","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_f\u007f{\u007fj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":199,"speed_kmh":368.548,"course_code":199,"course_deg":199},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":199,"speed_knots":199,"course_code":199}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-228","title":"Movement 200 kt / 200 deg / alternate=False","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_f0\u001e\u001cj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":200,"speed_kmh":370.4,"course_code":200,"course_deg":200},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":200,"speed_knots":200,"course_code":200}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-229","title":"Movement 200 kt / 200 deg / alternate=True","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_f0\"\u001cj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":200,"speed_kmh":370.4,"course_code":200,"course_deg":200},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":200,"speed_knots":200,"course_code":200}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-230","title":"Movement 799 kt / 360 deg / alternate=False","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_fkyXj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":799,"speed_kmh":1479.748,"course_code":360,"course_deg":360},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":360,"speed_knots":799,"course_code":360}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-231","title":"Movement 799 kt / 360 deg / alternate=True","profile":"core-1.1","source":"APRS101 pp. 49-53","packet":"N0CALL>S32UVT:`(_fk}Xj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":799,"speed_kmh":1479.748,"course_code":360,"course_deg":360},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":360,"speed_knots":799,"course_code":360}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-232","title":"Hemisphere NE","profile":"core-1.1","source":"APRS101 pp. 43-49","packet":"N0CALL>S32UV4:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UV4","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UV4","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-233","title":"Hemisphere NW","profile":"core-1.1","source":"APRS101 pp. 43-49","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-234","title":"Hemisphere SE","profile":"core-1.1","source":"APRS101 pp. 43-49","packet":"N0CALL>S325V4:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S325V4","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":-33.427333333333,"longitude_deg":112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S325V4","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":-33.427333333333,"longitude_deg":112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-235","title":"Hemisphere SW","profile":"core-1.1","source":"APRS101 pp. 43-49","packet":"N0CALL>S325VT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S325VT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":-33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S325VT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":-33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-236","title":"Position ambiguity 1","profile":"core-1.1","source":"APRS101 pp. 53-54","packet":"N0CALL>S32UVZ:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVZ","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.4275,"longitude_deg":-112.129166666667,"ambiguity_digits":1,"cell_bounds_deg":{"latitude":[33.426666666667,33.428333333333],"longitude":[-112.13,-112.128333333333]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVZ","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.4275,"longitude_deg":-112.129166666667,"ambiguity":1,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-237","title":"Position ambiguity 2","profile":"core-1.1","source":"APRS101 pp. 53-54","packet":"N0CALL>S32UZZ:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UZZ","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.425,"longitude_deg":-112.125,"ambiguity_digits":2,"cell_bounds_deg":{"latitude":[33.416666666667,33.433333333333],"longitude":[-112.133333333333,-112.116666666667]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UZZ","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.425,"longitude_deg":-112.125,"ambiguity":2,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-238","title":"Position ambiguity 3","profile":"core-1.1","source":"APRS101 pp. 53-54","packet":"N0CALL>S32ZZZ:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32ZZZ","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.416666666667,"longitude_deg":-112.083333333333,"ambiguity_digits":3,"cell_bounds_deg":{"latitude":[33.333333333333,33.5],"longitude":[-112.166666666667,-112.0]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32ZZZ","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.416666666667,"longitude_deg":-112.083333333333,"ambiguity":3,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-239","title":"Position ambiguity 4","profile":"core-1.1","source":"APRS101 pp. 53-54","packet":"N0CALL>S3LZZZ:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S3LZZZ","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.5,"longitude_deg":-112.5,"ambiguity_digits":4,"cell_bounds_deg":{"latitude":[33.0,34.0],"longitude":[-113.0,-112.0]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S3LZZZ","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.5,"longitude_deg":-112.5,"ambiguity":4,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-240","title":"DTI / equipment '`'","profile":"core-1.1","source":"APRS101 pp. 46, 55","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":null},"comment":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-241","title":"DTI / equipment \"'\"","profile":"core-1.1","source":"APRS101 pp. 46, 55","packet":"N0CALL>S32UVT:'(_f\u001e\u001eOj/Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"old","type_marker":null},"comment":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"old","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-242","title":"DTI / equipment \"']\"","profile":"core-1.1","source":"APRS101 pp. 46, 55","packet":"N0CALL>S32UVT:'(_f\u001e\u001eOj/]Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current-for-TM-D700","type_marker":"]"},"comment":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-243","title":"DTI / equipment '`>'","profile":"core-1.1","source":"APRS101 pp. 46, 55","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":">"},"comment":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-244","title":"DTI / equipment '\\x1c'","profile":"historical-1.0","source":"APRS101 pp. 46, 55","packet":"N0CALL>S32UVT:\u001c(_f\u001e\u001eOj/Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":null},"comment":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-245","title":"DTI / equipment '\\x1d'","profile":"historical-1.0","source":"APRS101 pp. 46, 55","packet":"N0CALL>S32UVT:\u001d(_f\u001e\u001eOj/Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"old","type_marker":null},"comment":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"old","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-246","title":"Altitude -10000 m / marker ''","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/!!!}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":null},"comment":"Ready","altitude":{"meters":-10000,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":-10000,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-247","title":"Altitude 0 m / marker ''","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/\"3r}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":null},"comment":"Ready","altitude":{"meters":0,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":0,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-248","title":"Altitude 61 m / marker ''","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/\"4T}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":null},"comment":"Ready","altitude":{"meters":61,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":61,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-249","title":"Altitude 10000 m / marker ''","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/#Fh}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":null},"comment":"Ready","altitude":{"meters":10000,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":10000,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-250","title":"Altitude 743570 m / marker ''","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/{{{}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":null},"comment":"Ready","altitude":{"meters":743570,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":743570,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-251","title":"Altitude -10000 m / marker '>'","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/>!!!}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":">"},"comment":"Ready","altitude":{"meters":-10000,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":-10000,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-252","title":"Altitude 0 m / marker '>'","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/>\"3r}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":">"},"comment":"Ready","altitude":{"meters":0,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":0,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-253","title":"Altitude 61 m / marker '>'","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/>\"4T}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":">"},"comment":"Ready","altitude":{"meters":61,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":61,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-254","title":"Altitude 10000 m / marker '>'","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/>#Fh}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":">"},"comment":"Ready","altitude":{"meters":10000,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":10000,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-255","title":"Altitude 743570 m / marker '>'","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/>{{{}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":">"},"comment":"Ready","altitude":{"meters":743570,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":743570,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-256","title":"Altitude -10000 m / marker ']'","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/]!!!}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":"]"},"comment":"Ready","altitude":{"meters":-10000,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":-10000,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-257","title":"Altitude 0 m / marker ']'","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/]\"3r}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":"]"},"comment":"Ready","altitude":{"meters":0,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":0,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-258","title":"Altitude 61 m / marker ']'","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/]\"4T}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":"]"},"comment":"Ready","altitude":{"meters":61,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":61,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-259","title":"Altitude 10000 m / marker ']'","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/]#Fh}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":"]"},"comment":"Ready","altitude":{"meters":10000,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":10000,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-260","title":"Altitude 743570 m / marker ']'","profile":"core-1.1","source":"APRS101 pp. 55-56; A11: altitude placement","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/]{{{}Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":"]"},"comment":"Ready","altitude":{"meters":743570,"encoding":"mic-e-base91"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"altitude":{"measurement":{"value":743570,"unit":"meters"},"encoding":"mic_e"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.mic_e.type_marker","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-261","title":"Telemetry flag '`'","profile":"core-1.1","source":"APRS101 p. 54","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/`1020","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":"","telemetry":{"analog_raw":[16,null,32,null,null],"encoding":"mic-e-hex"}},"note":"The two-channel form transmits channels 1 and 3. An absent channel 2 is not an observed zero.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"telemetry":{"analog":[16,null,32,null,null],"encoding":"mic_e_hex"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-262","title":"Telemetry flag \"'\"","profile":"core-1.1","source":"APRS101 p. 54","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/'102030FFff","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":"","telemetry":{"analog_raw":[16,32,48,255,255],"encoding":"mic-e-hex"}},"note":"The two-channel form transmits channels 1 and 3. An absent channel 2 is not an observed zero.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"telemetry":{"analog":[16,32,48,255,255],"encoding":"mic_e_hex"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-263","title":"Telemetry flag '\\x1d'","profile":"historical-1.0","source":"APRS101 p. 54","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/\u001d\u0000\u0001\u007f\u0080\u00ff","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current"},"comment":"","telemetry":{"analog_raw":[0,1,127,128,255],"encoding":"mic-e-binary"}},"note":"The two-channel form transmits channels 1 and 3. An absent channel 2 is not an observed zero.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251},"telemetry":{"analog":[0,1,127,128,255],"encoding":"mic_e_binary"}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-264","title":"Mixed standard/custom bits","profile":"core-1.1","source":"APRS101 p. 45","packet":"N0CALL>D3RUVT:`(_f\u001e\u001eOj/","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"D3RUVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"101","position_comment_set":"mixed","position_comment":"unknown","longitude_offset":100,"dti_fix":"current"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"D3RUVT","path":[]},"payload":{"type":"mic_e","comment":"","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"unknown","fix":"current","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} +{"id":"MIC-265","title":"Grid locator in Mic-E status","profile":"core-1.1","source":"APRS101 p. 55","packet":"N0CALL>S32UVT:`(_f\u001e\u001eOj/>IO91SX/G Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"S32UVT","path":[]},"kind":"position","format":"mic-e","position":{"latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"motion":{"speed_knots":20,"speed_kmh":37.04,"course_code":251,"course_deg":251},"mic_e":{"position_comment_bits":"100","position_comment_set":"standard","position_comment":"Returning","longitude_offset":100,"dti_fix":"current","type_marker":">"},"comment":" Ready","grid_locator":"IO91SX","grid_symbol":{"table_id_raw":"/","table":"primary","code":"G","overlay":null}},"note":"Retain the encoded Mic-E position and grid independently; do not silently replace the higher-resolution coordinate by a grid center.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"S32UVT","path":[]},"payload":{"type":"mic_e","comment":"IO91SX/G Ready","latitude_deg":33.427333333333,"longitude_deg":-112.129,"ambiguity":0,"symbol":{"table_id":"/","code":"j"},"message":"returning","fix":"current","device_code":">","extensions":{"motion":{"course_deg":251,"speed_knots":20,"course_code":251}}}},"unmapped":["$.grid_symbol.overlay","$.grid_symbol.table","$.mic_e.longitude_offset","$.mic_e.position_comment_bits","$.mic_e.position_comment_set","$.motion.speed_kmh","$.symbol.overlay","$.symbol.table"]} diff --git a/packages/aprs/tests/vectors/msg.jsonl b/packages/aprs/tests/vectors/msg.jsonl new file mode 100644 index 0000000..986e17d --- /dev/null +++ b/packages/aprs/tests/vectors/msg.jsonl @@ -0,0 +1,45 @@ +{"id":"MSG-001","title":"Ordinary message / ID None / length 0","profile":"core-1.1","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"","message_id":null,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-002","title":"Ordinary message / ID None / length 5","profile":"core-1.1","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Hello","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"Hello","message_id":null,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"Hello","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-003","title":"Ordinary message / ID 1 / length 5","profile":"core-1.1","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Hello{1","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"Hello","message_id":"1","ack_requested":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"Hello","message_id":"1"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-004","title":"Ordinary message / ID Ab9Z0 / length 5","profile":"core-1.1","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :Hello{Ab9Z0","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"Hello","message_id":"Ab9Z0","ack_requested":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"Hello","message_id":"Ab9Z0"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-005","title":"Ordinary message / ID None / length 22","profile":"core-1.1","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW : Leading and trailing ","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":" Leading and trailing ","message_id":null,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":" Leading and trailing ","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-006","title":"Ordinary message / ID 01 / length 24","profile":"core-1.1","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :radio: ready > listening{01","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"radio: ready > listening","message_id":"01","ack_requested":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"radio: ready > listening","message_id":"01"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-007","title":"Ordinary message / ID 99999 / length 67","profile":"core-1.1","source":"APRS101 p. 71","packet":"N0CALL>APRS::W1AW :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx{99999","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","message_id":"99999","ack_requested":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","message_id":"99999"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-008","title":"Addressee W1AW","profile":"core-1.1","source":"APRS101 pp. 71-73","packet":"N0CALL>APRS::W1AW :Hello","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"Hello","message_id":null,"ack_requested":false,"group_address":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"Hello","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.group_address"]} +{"id":"MSG-009","title":"Addressee KB2ICI-14","profile":"core-1.1","source":"APRS101 pp. 71-73","packet":"N0CALL>APRS::KB2ICI-14:Hello","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"KB2ICI-14","addressee_raw":"KB2ICI-14","text":"Hello","message_id":null,"ack_requested":false,"group_address":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"KB2ICI-14","text":"Hello","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.group_address"]} +{"id":"MSG-010","title":"Addressee CQ","profile":"core-1.1","source":"APRS101 pp. 71-73","packet":"N0CALL>APRS::CQ :Hello","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"CQ","addressee_raw":"CQ ","text":"Hello","message_id":null,"ack_requested":false,"group_address":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"CQ","text":"Hello","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.group_address"]} +{"id":"MSG-011","title":"Addressee ALL","profile":"core-1.1","source":"APRS101 pp. 71-73","packet":"N0CALL>APRS::ALL :Hello","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"ALL","addressee_raw":"ALL ","text":"Hello","message_id":null,"ack_requested":false,"group_address":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"ALL","text":"Hello","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.group_address"]} +{"id":"MSG-012","title":"Addressee QST","profile":"core-1.1","source":"APRS101 pp. 71-73","packet":"N0CALL>APRS::QST :Hello","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"QST","addressee_raw":"QST ","text":"Hello","message_id":null,"ack_requested":false,"group_address":true}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"QST","text":"Hello","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.group_address"]} +{"id":"MSG-013","title":"ack 1","profile":"core-1.1","source":"APRS101 p. 72","packet":"N0CALL>APRS::W1AW :ack1","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","subtype":"ack","ack_id":"1","ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"W1AW","message_id":"1","rejected":false}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-014","title":"ack 003","profile":"core-1.1","source":"APRS101 p. 72","packet":"N0CALL>APRS::W1AW :ack003","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","subtype":"ack","ack_id":"003","ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"W1AW","message_id":"003","rejected":false}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-015","title":"ack Ab9Z0","profile":"core-1.1","source":"APRS101 p. 72","packet":"N0CALL>APRS::W1AW :ackAb9Z0","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","subtype":"ack","ack_id":"Ab9Z0","ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"W1AW","message_id":"Ab9Z0","rejected":false}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-016","title":"rej 1","profile":"core-1.1","source":"APRS101 p. 72","packet":"N0CALL>APRS::W1AW :rej1","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","subtype":"rej","reject_id":"1","ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"W1AW","message_id":"1","rejected":true}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-017","title":"rej 003","profile":"core-1.1","source":"APRS101 p. 72","packet":"N0CALL>APRS::W1AW :rej003","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","subtype":"rej","reject_id":"003","ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"W1AW","message_id":"003","rejected":true}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-018","title":"rej Ab9Z0","profile":"core-1.1","source":"APRS101 p. 72","packet":"N0CALL>APRS::W1AW :rejAb9Z0","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","subtype":"rej","reject_id":"Ab9Z0","ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"W1AW","message_id":"Ab9Z0","rejected":true}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-019","title":"Ack-like ordinary text acknowledge this please","profile":"core-1.1","source":"APRS101 pp. 71-72","packet":"N0CALL>APRS::W1AW :acknowledge this please","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"acknowledge this please","message_id":null,"ack_requested":false}},"note":"Only exact ack/rej control syntax with a valid ID is a control message. FAP uses a looser prefix test.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"acknowledge this please","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-020","title":"Ack-like ordinary text reject?","profile":"core-1.1","source":"APRS101 pp. 71-72","packet":"N0CALL>APRS::W1AW :reject?","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"reject?","message_id":null,"ack_requested":false}},"note":"Only exact ack/rej control syntax with a valid ID is a control message. FAP uses a looser prefix test.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"reject?","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-021","title":"Ack-like ordinary text ACK003","profile":"core-1.1","source":"APRS101 pp. 71-72","packet":"N0CALL>APRS::W1AW :ACK003","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"ACK003","message_id":null,"ack_requested":false}},"note":"Only exact ack/rej control syntax with a valid ID is a control message. FAP uses a looser prefix test.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"ACK003","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-022","title":"Ack-like ordinary text REJ003","profile":"core-1.1","source":"APRS101 pp. 71-72","packet":"N0CALL>APRS::W1AW :REJ003","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"REJ003","message_id":null,"ack_requested":false}},"note":"Only exact ack/rej control syntax with a valid ID is a control message. FAP uses a looser prefix test.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"REJ003","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-023","title":"Reply-ack {01}","profile":"core-1.1","source":"A11 REPLY-ACK","packet":"N0CALL>APRS::W1AW :Reply{01}","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"Reply","message_id":"01","ack_requested":true,"reply_ack_capable":true,"reply_ack_id":null,"message_id_raw":"01}"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"Reply","message_id":"01","reply_ack":""}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.message_id_raw"]} +{"id":"MSG-024","title":"Reply-ack {01}02","profile":"core-1.1","source":"A11 REPLY-ACK","packet":"N0CALL>APRS::W1AW :Reply{01}02","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"Reply","message_id":"01","ack_requested":true,"reply_ack_capable":true,"reply_ack_id":"02","message_id_raw":"01}02"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"Reply","message_id":"01","reply_ack":"02"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.message_id_raw"]} +{"id":"MSG-025","title":"Standalone ack echoes reply-ack ID","profile":"core-1.1","source":"A11 REPLY-ACK","packet":"N0CALL>APRS::W1AW :ack01}02","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","subtype":"ack","ack_id_raw":"01}02","ack_id":"01","embedded_reply_ack_id":"02","ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"acknowledgment","addressee":"W1AW","message_id":"01","rejected":false}},"unmapped":["$.message.ack_id_raw","$.message.ack_requested","$.message.addressee_raw","$.message.embedded_reply_ack_id"]} +{"id":"MSG-026","title":"Automatic answer AA:Away from keyboard","profile":"core-1.1","source":"A11 auto-answer","packet":"N0CALL>APRS::W1AW :AA:Away from keyboard","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"AA:Away from keyboard","message_id":null,"ack_requested":false,"auto_answer":true}},"note":"Auto-answer has no message ID and does not request an ack. Power-up/cancel/retry rules are stateful, not inferred from this packet alone.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"auto_answer","addressee":"W1AW","text":"Away from keyboard","previous_ack":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-027","title":"Automatic answer AA:Away from keyboard}02","profile":"core-1.1","source":"A11 auto-answer","packet":"N0CALL>APRS::W1AW :AA:Away from keyboard}02","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"AA:Away from keyboard","message_id":null,"ack_requested":false,"auto_answer":true,"reply_ack_id":"02"}},"note":"Auto-answer has no message ID and does not request an ack. Power-up/cancel/retry rules are stateful, not inferred from this packet alone.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"auto_answer","addressee":"W1AW","text":"Away from keyboard","previous_ack":"02"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-028","title":"bulletin BLN0","profile":"core-1.1","source":"APRS101 pp. 73-74","packet":"N0CALL>APRS::BLN0 :Test notice","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"bulletin","message":{"addressee":"BLN0","addressee_raw":"BLN0 ","text":"Test notice","message_id":null,"ack_requested":false,"bulletin_id":"0","group":null}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"bulletin","identifier":"0","text":"Test notice","group":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-029","title":"bulletin BLN9","profile":"core-1.1","source":"APRS101 pp. 73-74","packet":"N0CALL>APRS::BLN9 :Test notice","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"bulletin","message":{"addressee":"BLN9","addressee_raw":"BLN9 ","text":"Test notice","message_id":null,"ack_requested":false,"bulletin_id":"9","group":null}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"bulletin","identifier":"9","text":"Test notice","group":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-030","title":"announcement BLNA","profile":"core-1.1","source":"APRS101 pp. 73-74","packet":"N0CALL>APRS::BLNA :Test notice","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"announcement","message":{"addressee":"BLNA","addressee_raw":"BLNA ","text":"Test notice","message_id":null,"ack_requested":false,"bulletin_id":"A","group":null}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"bulletin","identifier":"A","text":"Test notice","group":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-031","title":"announcement BLNZ","profile":"core-1.1","source":"APRS101 pp. 73-74","packet":"N0CALL>APRS::BLNZ :Test notice","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"announcement","message":{"addressee":"BLNZ","addressee_raw":"BLNZ ","text":"Test notice","message_id":null,"ack_requested":false,"bulletin_id":"Z","group":null}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"bulletin","identifier":"Z","text":"Test notice","group":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-032","title":"group-bulletin BLN4WX","profile":"core-1.1","source":"APRS101 pp. 73-74","packet":"N0CALL>APRS::BLN4WX :Test notice","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"group-bulletin","message":{"addressee":"BLN4WX","addressee_raw":"BLN4WX ","text":"Test notice","message_id":null,"ack_requested":false,"bulletin_id":"4","group":"WX"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"bulletin","identifier":"4","text":"Test notice","group":"WX"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-033","title":"group-bulletin BLN1ABCDE","profile":"core-1.1","source":"APRS101 pp. 73-74","packet":"N0CALL>APRS::BLN1ABCDE:Test notice","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"group-bulletin","message":{"addressee":"BLN1ABCDE","addressee_raw":"BLN1ABCDE","text":"Test notice","message_id":null,"ack_requested":false,"bulletin_id":"1","group":"ABCDE"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"bulletin","identifier":"1","text":"Test notice","group":"ABCDE"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-034","title":"NWS reference is not an ack request","profile":"core-1.1","source":"APRS101 p. 74","packet":"N0CALL>APRS::NWS-WARN :092010z,THUNDER_STORM,AR_ASHLEY,{S9JbA","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nws-bulletin","message":{"addressee":"NWS-WARN","addressee_raw":"NWS-WARN ","text":"092010z,THUNDER_STORM,AR_ASHLEY,","message_id":"S9JbA","ack_requested":false,"reference_id":"S9JbA"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"nws_bulletin","addressee":"NWS-WARN","text":"092010z,THUNDER_STORM,AR_ASHLEY,","reference_id":"S9JbA"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.reference_id"]} +{"id":"MSG-035","title":"NTS N#","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :N#\\12\\R\\HXA\\N0CALL\\5\\REDMOND WA\\1800\\OCT 15{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"N#\\12\\R\\HXA\\N0CALL\\5\\REDMOND WA\\1800\\OCT 15","message_id":"001","ack_requested":true},"nts":{"record_type":"N#","fields":["12","R","HXA","N0CALL","5","REDMOND WA","1800","OCT 15"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_header","number":"12","precedence":"R","handling":"HXA","originator":"N0CALL","check":"5","place":"REDMOND WA","time":"1800","date":"OCT 15"},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-036","title":"NTS NA","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :NA\\ADAM\\123 MAIN ST\\REDMOND WA\\98052{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"NA\\ADAM\\123 MAIN ST\\REDMOND WA\\98052","message_id":"001","ack_requested":true},"nts":{"record_type":"NA","fields":["ADAM","123 MAIN ST","REDMOND WA","98052"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_address","lines":["ADAM","123 MAIN ST","REDMOND WA","98052"]},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-037","title":"NTS NP","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :NP\\5550100{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"NP\\5550100","message_id":"001","ack_requested":true},"nts":{"record_type":"NP","fields":["5550100"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_phone","number":"5550100"},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-038","title":"NTS N1","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :N1\\LINE 1 TEXT{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"N1\\LINE 1 TEXT","message_id":"001","ack_requested":true},"nts":{"record_type":"N1","fields":["LINE 1 TEXT"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_text","text":"LINE 1 TEXT","line":1},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-039","title":"NTS N2","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :N2\\LINE 2 TEXT{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"N2\\LINE 2 TEXT","message_id":"001","ack_requested":true},"nts":{"record_type":"N2","fields":["LINE 2 TEXT"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_text","text":"LINE 2 TEXT","line":2},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-040","title":"NTS N3","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :N3\\LINE 3 TEXT{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"N3\\LINE 3 TEXT","message_id":"001","ack_requested":true},"nts":{"record_type":"N3","fields":["LINE 3 TEXT"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_text","text":"LINE 3 TEXT","line":3},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-041","title":"NTS N4","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :N4\\LINE 4 TEXT{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"N4\\LINE 4 TEXT","message_id":"001","ack_requested":true},"nts":{"record_type":"N4","fields":["LINE 4 TEXT"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_text","text":"LINE 4 TEXT","line":4},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-042","title":"NTS N5","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :N5\\LINE 5 TEXT{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"N5\\LINE 5 TEXT","message_id":"001","ack_requested":true},"nts":{"record_type":"N5","fields":["LINE 5 TEXT"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_text","text":"LINE 5 TEXT","line":5},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-043","title":"NTS N6","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :N6\\LINE 6 TEXT{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"N6\\LINE 6 TEXT","message_id":"001","ack_requested":true},"nts":{"record_type":"N6","fields":["LINE 6 TEXT"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_text","text":"LINE 6 TEXT","line":6},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-044","title":"NTS NS","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :NS\\TEST SENDER{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"NS\\TEST SENDER","message_id":"001","ack_requested":true},"nts":{"record_type":"NS","fields":["TEST SENDER"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_signature","text":"TEST SENDER"},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"MSG-045","title":"NTS NR","profile":"core-1.1","source":"APRS101 p. 75","packet":"N0CALL>APRS::W1AW :NR\\W1AW\\151800Z\\N0CALL\\151805Z{001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"NR\\W1AW\\151800Z\\N0CALL\\151805Z","message_id":"001","ack_requested":true},"nts":{"record_type":"NR","fields":["W1AW","151800Z","N0CALL","151805Z"]}},"note":"Generic APRS implementations may leave NTS as message text. Structured NTS decoding is an optional capability.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"radiogram","addressee":"W1AW","record":{"type":"nts_routing","received_from":"W1AW","received_at":"151800Z","sent_to":"N0CALL","sent_at":"151805Z"},"message_id":"001"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} diff --git a/packages/aprs/tests/vectors/net.jsonl b/packages/aprs/tests/vectors/net.jsonl new file mode 100644 index 0000000..e660145 --- /dev/null +++ b/packages/aprs/tests/vectors/net.jsonl @@ -0,0 +1,15 @@ +{"id":"NET-001","title":"Third-party message","profile":"core-1.1","source":"APRS101 pp. 83-86","packet":"N0GATE>APRS,WIDE2-1:}W1AW>APRS,TCPIP,N0GATE*::N0CALL :Hello{01","outcome":"accept","source_expected":{"header":{"source":"N0GATE","destination":"APRS","path":[{"address":"WIDE2-1","repeated_marker":false}]},"kind":"third-party","inner_packet":"W1AW>APRS,TCPIP,N0GATE*::N0CALL :Hello{01","inner":{"header":{"source":"W1AW","destination":"APRS","path":[{"address":"TCPIP","repeated_marker":false},{"address":"N0GATE","repeated_marker":true}]},"kind":"message","message":{"addressee":"N0CALL","addressee_raw":"N0CALL ","text":"Hello","message_id":"01","ack_requested":true}},"message_origin":"W1AW"},"note":"The outer transmitter is N0GATE; the message origin and ack recipient are W1AW. Do not discard either envelope.","expected":{"type":"packet","header":{"source":"N0GATE","destination":"APRS","path":[{"address":"WIDE2-1","repeated":false}]},"payload":{"type":"third_party","packet":{"header":{"source":"W1AW","destination":"APRS","path":[{"address":"TCPIP","repeated":false},{"address":"N0GATE","repeated":true}]},"payload":{"type":"message","addressee":"N0CALL","text":"Hello","message_id":"01"}}}},"unmapped":["$.inner.message.ack_requested","$.inner.message.addressee_raw","$.inner_packet","$.message_origin"]} +{"id":"NET-002","title":"Third-party position","profile":"core-1.1","source":"APRS101 pp. 83-86","packet":"N0GATE>APRS:}W1AW>APRS,TCPIP,N0GATE*:!4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0GATE","destination":"APRS","path":[]},"kind":"third-party","inner_packet":"W1AW>APRS,TCPIP,N0GATE*:!4903.50N/07201.75W-","inner":{"header":{"source":"W1AW","destination":"APRS","path":[{"address":"TCPIP","repeated_marker":false},{"address":"N0GATE","repeated_marker":true}]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""}},"expected":{"type":"packet","header":{"source":"N0GATE","destination":"APRS","path":[]},"payload":{"type":"third_party","packet":{"header":{"source":"W1AW","destination":"APRS","path":[{"address":"TCPIP","repeated":false},{"address":"N0GATE","repeated":true}]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}}}},"unmapped":["$.inner.symbol.overlay","$.inner.symbol.table","$.inner_packet"]} +{"id":"NET-003","title":"RF gate suppression NOGATE","profile":"network-policy","source":"A11 APRS-IS","packet":"N0CALL>APRS,WIDE1-1,NOGATE:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated_marker":false},{"address":"NOGATE","repeated_marker":false}]},"kind":"status","status_text":"Ready","policy":{"forward_to_aprs_is":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"NOGATE","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.policy.forward_to_aprs_is"]} +{"id":"NET-004","title":"RF gate suppression RFONLY","profile":"network-policy","source":"A11 APRS-IS","packet":"N0CALL>APRS,WIDE1-1,RFONLY:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated_marker":false},{"address":"RFONLY","repeated_marker":false}]},"kind":"status","status_text":"Ready","policy":{"forward_to_aprs_is":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"RFONLY","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.policy.forward_to_aprs_is"]} +{"id":"NET-005","title":"No-archive in status","profile":"network-policy","source":"A11 APRS-IS","packet":"N0CALL>APRS:>Ready!x!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready!x!","policy":{"archive_allowed":false}},"note":"This is a retention flag. Preserve the literal text; it does not invalidate the packet.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready!x!"}},"unmapped":["$.policy.archive_allowed"]} +{"id":"NET-006","title":"No-archive in position","profile":"network-policy","source":"A11 APRS-IS","packet":"N0CALL>APRS:!4903.50N/07201.75W-!x!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"!x!","policy":{"archive_allowed":false}},"note":"This is a retention flag. Preserve the literal text; it does not invalidate the packet.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"!x!","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.policy.archive_allowed","$.symbol.overlay","$.symbol.table"]} +{"id":"NET-007","title":"No-archive in message","profile":"network-policy","source":"A11 APRS-IS","packet":"N0CALL>APRS::W1AW :Do not archive !x!","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"Do not archive !x!","message_id":null,"ack_requested":false},"policy":{"archive_allowed":false}},"note":"This is a retention flag. Preserve the literal text; it does not invalidate the packet.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"message","addressee":"W1AW","text":"Do not archive !x!","message_id":null}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.policy.archive_allowed"]} +{"id":"NET-008","title":"Preserve APRS-IS q token qAR","profile":"aprs-is","source":"A11 APRS-IS; FAP aprsis_paths_test.go","packet":"N0CALL>APRS,WIDE1-1,qAR,IGATE:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated_marker":false},{"address":"qAR","repeated_marker":false},{"address":"IGATE","repeated_marker":false}]},"kind":"status","status_text":"Ready","aprs_is":{"q_construct_raw":"qAR","following_path":["IGATE"]}},"note":"q token case is significant. This case asserts preservation, not server-side q validation or RF address validity.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"qAR","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.aprs_is.following_path","$.aprs_is.q_construct_raw"]} +{"id":"NET-009","title":"Preserve APRS-IS q token qAO","profile":"aprs-is","source":"A11 APRS-IS; FAP aprsis_paths_test.go","packet":"N0CALL>APRS,WIDE1-1,qAO,IGATE:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated_marker":false},{"address":"qAO","repeated_marker":false},{"address":"IGATE","repeated_marker":false}]},"kind":"status","status_text":"Ready","aprs_is":{"q_construct_raw":"qAO","following_path":["IGATE"]}},"note":"q token case is significant. This case asserts preservation, not server-side q validation or RF address validity.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"qAO","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.aprs_is.following_path","$.aprs_is.q_construct_raw"]} +{"id":"NET-010","title":"Preserve APRS-IS q token qAC","profile":"aprs-is","source":"A11 APRS-IS; FAP aprsis_paths_test.go","packet":"N0CALL>APRS,WIDE1-1,qAC,IGATE:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated_marker":false},{"address":"qAC","repeated_marker":false},{"address":"IGATE","repeated_marker":false}]},"kind":"status","status_text":"Ready","aprs_is":{"q_construct_raw":"qAC","following_path":["IGATE"]}},"note":"q token case is significant. This case asserts preservation, not server-side q validation or RF address validity.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"qAC","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.aprs_is.following_path","$.aprs_is.q_construct_raw"]} +{"id":"NET-011","title":"Preserve APRS-IS q token qAI","profile":"aprs-is","source":"A11 APRS-IS; FAP aprsis_paths_test.go","packet":"N0CALL>APRS,WIDE1-1,qAI,IGATE:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated_marker":false},{"address":"qAI","repeated_marker":false},{"address":"IGATE","repeated_marker":false}]},"kind":"status","status_text":"Ready","aprs_is":{"q_construct_raw":"qAI","following_path":["IGATE"]}},"note":"q token case is significant. This case asserts preservation, not server-side q validation or RF address validity.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"qAI","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.aprs_is.following_path","$.aprs_is.q_construct_raw"]} +{"id":"NET-012","title":"Preserve APRS-IS q token qAS","profile":"aprs-is","source":"A11 APRS-IS; FAP aprsis_paths_test.go","packet":"N0CALL>APRS,WIDE1-1,qAS,IGATE:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated_marker":false},{"address":"qAS","repeated_marker":false},{"address":"IGATE","repeated_marker":false}]},"kind":"status","status_text":"Ready","aprs_is":{"q_construct_raw":"qAS","following_path":["IGATE"]}},"note":"q token case is significant. This case asserts preservation, not server-side q validation or RF address validity.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"qAS","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.aprs_is.following_path","$.aprs_is.q_construct_raw"]} +{"id":"NET-013","title":"Preserve APRS-IS q token qAo","profile":"aprs-is","source":"A11 APRS-IS; FAP aprsis_paths_test.go","packet":"N0CALL>APRS,WIDE1-1,qAo,IGATE:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated_marker":false},{"address":"qAo","repeated_marker":false},{"address":"IGATE","repeated_marker":false}]},"kind":"status","status_text":"Ready","aprs_is":{"q_construct_raw":"qAo","following_path":["IGATE"]}},"note":"q token case is significant. This case asserts preservation, not server-side q validation or RF address validity.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"WIDE1-1","repeated":false},{"address":"qAo","repeated":false},{"address":"IGATE","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.aprs_is.following_path","$.aprs_is.q_construct_raw"]} +{"id":"NET-014","title":"AEA transport adapter","profile":"aea-transport","source":"APRS101 pp. 83-85","packet":"N0CALL>DIGI1*>WIDE>APRS:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[{"address":"DIGI1","repeated_marker":true},{"address":"WIDE","repeated_marker":false}]},"kind":"status","status_text":"Ready","normalized_tnc2":"N0CALL>APRS,DIGI1*,WIDE:>Ready"},"note":"Parse this through an AEA adapter, not by interpreting the entire remainder as a TNC2 destination.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"DIGI1","repeated":true},{"address":"WIDE","repeated":false}]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.normalized_tnc2"]} +{"id":"NET-015","title":"Third-party opaque payload","profile":"core-1.1","source":"APRS101 pp.85,87-88","packet":"N0GATE>APRS:}W1AW>APRS:{{zopaque","outcome":"accept","source_expected":{"header":{"source":"N0GATE","destination":"APRS","path":[]},"kind":"third-party","inner_packet":"W1AW>APRS:{{zopaque","inner":{"header":{"source":"W1AW","destination":"APRS","path":[]},"kind":"user-defined","user_id":"{","user_type":"z","data":"opaque"}},"expected":{"type":"packet","header":{"source":"N0GATE","destination":"APRS","path":[]},"payload":{"type":"third_party","packet":{"header":{"source":"W1AW","destination":"APRS","path":[]},"payload":{"type":"user_defined","user_id":"{","user_type":"z","data":"opaque"}}}},"unmapped":["$.inner_packet"]} diff --git a/packages/aprs/tests/vectors/nme.jsonl b/packages/aprs/tests/vectors/nme.jsonl new file mode 100644 index 0000000..cfb4ef7 --- /dev/null +++ b/packages/aprs/tests/vectors/nme.jsonl @@ -0,0 +1,36 @@ +{"id":"NME-001","title":"GPGGA with correct checksum","profile":"nmea-supported","source":"APRS101 pp. 25,34; FAP nmea.go; A11 WPL correction","packet":"N0CALL>APRS:$GPGGA,102705,5157.9762,N,00029.3256,W,1,04,2.0,75.7,M,47.6,M,,*62","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGGA","fields_raw":["102705","5157.9762","N","00029.3256","W","1","04","2.0","75.7","M","47.6","M","",""],"checksum_supplied":"62","checksum_valid":true,"time_utc_raw":"102705","fix_quality":1,"satellites":4,"hdop":2.0,"geoid_separation_m":47.6,"dgps_age_raw":"","dgps_station_raw":""},"position":{"latitude_deg":51.96627,"longitude_deg":-0.48876},"altitude":{"meters":75.7,"reference":"mean-sea-level"}},"note":"All raw sentence fields are included. NMEA field interpretation is the optional NMEA capability; VTG has no position, and WPL describes a waypoint rather than the transmitting station.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"nmea","sentence":{"type":"gga","time_utc":"102705","dgps_age":null,"dgps_station":null,"fix_quality":1,"satellites":4,"hdop":2.0,"geoid_separation_m":47.6,"coordinates":{"latitude_deg":51.96627,"longitude_deg":-0.48876},"altitude_msl_m":75.7},"metadata":{"talker":"GP","checksum_supplied":"62","checksum_valid":true,"fields_raw":["102705","5157.9762","N","00029.3256","W","1","04","2.0","75.7","M","47.6","M","",""]}}},"unmapped":["$.altitude.reference"]} +{"id":"NME-002","title":"GPGLL with correct checksum","profile":"nmea-supported","source":"APRS101 pp. 25,34; FAP nmea.go; A11 WPL correction","packet":"N0CALL>APRS:$GPGLL,2554.459,N,08020.187,W,154027.281,A*22","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["2554.459","N","08020.187","W","154027.281","A"],"checksum_supplied":"22","checksum_valid":true,"time_utc_raw":"154027.281","fix_status":"A"},"position":{"latitude_deg":25.90765,"longitude_deg":-80.33645}},"note":"All raw sentence fields are included. NMEA field interpretation is the optional NMEA capability; VTG has no position, and WPL describes a waypoint rather than the transmitting station.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"nmea","sentence":{"type":"gll","time_utc":"154027.281","fix_status":"A","coordinates":{"latitude_deg":25.90765,"longitude_deg":-80.33645}},"metadata":{"talker":"GP","checksum_supplied":"22","checksum_valid":true,"fields_raw":["2554.459","N","08020.187","W","154027.281","A"]}}},"unmapped":[]} +{"id":"NME-003","title":"GPRMC with correct checksum","profile":"nmea-supported","source":"APRS101 pp. 25,34; FAP nmea.go; A11 WPL correction","packet":"N0CALL>APRS:$GPRMC,063909,A,3349.4302,N,11700.3721,W,43.022,89.3,291099,13.6,E*52","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPRMC","fields_raw":["063909","A","3349.4302","N","11700.3721","W","43.022","89.3","291099","13.6","E"],"checksum_supplied":"52","checksum_valid":true,"time_utc_raw":"063909","fix_status":"A","date_ddmmyy_raw":"291099","magnetic_variation_raw":"13.6","magnetic_variation_direction":"E"},"position":{"latitude_deg":33.823836666667,"longitude_deg":-117.006201666667},"motion":{"speed_knots":43.022,"speed_kmh":79.676744,"course_deg":89.3}},"note":"All raw sentence fields are included. NMEA field interpretation is the optional NMEA capability; VTG has no position, and WPL describes a waypoint rather than the transmitting station.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"nmea","sentence":{"type":"rmc","time_utc":"063909","date_ddmmyy":"291099","fix_status":"A","magnetic_variation_direction":"E","magnetic_variation":13.6,"coordinates":{"latitude_deg":33.823836666667,"longitude_deg":-117.006201666667},"speed_knots":43.022,"course_deg":89.3},"metadata":{"talker":"GP","checksum_supplied":"52","checksum_valid":true,"fields_raw":["063909","A","3349.4302","N","11700.3721","W","43.022","89.3","291099","13.6","E"]}}},"unmapped":["$.motion.speed_kmh"]} +{"id":"NME-004","title":"GPVTG with correct checksum","profile":"nmea-supported","source":"APRS101 pp. 25,34; FAP nmea.go; A11 WPL correction","packet":"N0CALL>APRS:$GPVTG,318.7,T,,M,35.1,N,65.0,K*69","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPVTG","fields_raw":["318.7","T","","M","35.1","N","65.0","K"],"checksum_supplied":"69","checksum_valid":true},"motion":{"course_true_deg":318.7,"course_magnetic_deg":null,"speed_knots":35.1,"speed_kmh_reported":65.0}},"note":"All raw sentence fields are included. NMEA field interpretation is the optional NMEA capability; VTG has no position, and WPL describes a waypoint rather than the transmitting station.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"nmea","sentence":{"type":"vtg","speed_knots":35.1,"course_true_deg":318.7,"course_magnetic_deg":null,"speed_kmh_reported":65.0},"metadata":{"talker":"GP","checksum_supplied":"69","checksum_valid":true,"fields_raw":["318.7","T","","M","35.1","N","65.0","K"]}}},"unmapped":[]} +{"id":"NME-005","title":"GPWPL with correct checksum","profile":"nmea-supported","source":"APRS101 pp. 25,34; FAP nmea.go; A11 WPL correction","packet":"N0CALL>APRS:$GPWPL,4903.50,N,07201.75,W,AID2*2A","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPWPL","fields_raw":["4903.50","N","07201.75","W","AID2"],"checksum_supplied":"2A","checksum_valid":true},"waypoint":{"name":"AID2","latitude_deg":49.058333333333,"longitude_deg":-72.029166666667}},"note":"All raw sentence fields are included. NMEA field interpretation is the optional NMEA capability; VTG has no position, and WPL describes a waypoint rather than the transmitting station.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"nmea","sentence":{"type":"wpl","name":"AID2","coordinates":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667}},"metadata":{"talker":"GP","checksum_supplied":"2A","checksum_valid":true,"fields_raw":["4903.50","N","07201.75","W","AID2"]}}},"unmapped":[]} +{"id":"NME-006","title":"GPGGA with correct checksum","profile":"nmea-supported","source":"APRS101 pp. 25,34; FAP nmea.go; A11 WPL correction","packet":"N0CALL>APRS:$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,47.0,M,,*4F","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGGA","fields_raw":["123519","4807.038","N","01131.000","E","1","08","0.9","545.4","M","47.0","M","",""],"checksum_supplied":"4F","checksum_valid":true,"time_utc_raw":"123519","fix_quality":1,"satellites":8,"hdop":0.9,"geoid_separation_m":47.0,"dgps_age_raw":"","dgps_station_raw":""},"position":{"latitude_deg":48.1173,"longitude_deg":11.516666666667},"altitude":{"meters":545.4,"reference":"mean-sea-level"}},"note":"All raw sentence fields are included. NMEA field interpretation is the optional NMEA capability; VTG has no position, and WPL describes a waypoint rather than the transmitting station.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"nmea","sentence":{"type":"gga","time_utc":"123519","dgps_age":null,"dgps_station":null,"fix_quality":1,"satellites":8,"hdop":0.9,"geoid_separation_m":47.0,"coordinates":{"latitude_deg":48.1173,"longitude_deg":11.516666666667},"altitude_msl_m":545.4},"metadata":{"talker":"GP","checksum_supplied":"4F","checksum_valid":true,"fields_raw":["123519","4807.038","N","01131.000","E","1","08","0.9","545.4","M","47.0","M","",""]}}},"unmapped":["$.altitude.reference"]} +{"id":"NME-007","title":"GPGLL with correct checksum","profile":"nmea-supported","source":"APRS101 pp. 25,34; FAP nmea.go; A11 WPL correction","packet":"N0CALL>APRS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"note":"All raw sentence fields are included. NMEA field interpretation is the optional NMEA capability; VTG has no position, and WPL describes a waypoint rather than the transmitting station.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"nmea","sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":[]} +{"id":"NME-008","title":"GPRMC with correct checksum","profile":"nmea-supported","source":"APRS101 pp. 25,34; FAP nmea.go; A11 WPL correction","packet":"N0CALL>APRS:$GPRMC,180000.50,A,3350.000,S,15112.000,E,0.0,0.0,151026,0.0,E*4B","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPRMC","fields_raw":["180000.50","A","3350.000","S","15112.000","E","0.0","0.0","151026","0.0","E"],"checksum_supplied":"4B","checksum_valid":true,"time_utc_raw":"180000.50","fix_status":"A","date_ddmmyy_raw":"151026","magnetic_variation_raw":"0.0","magnetic_variation_direction":"E"},"position":{"latitude_deg":-33.833333333333,"longitude_deg":151.2},"motion":{"speed_knots":0.0,"speed_kmh":0.0,"course_deg":0.0}},"note":"All raw sentence fields are included. NMEA field interpretation is the optional NMEA capability; VTG has no position, and WPL describes a waypoint rather than the transmitting station.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"nmea","sentence":{"type":"rmc","time_utc":"180000.50","date_ddmmyy":"151026","fix_status":"A","magnetic_variation_direction":"E","magnetic_variation":0.0,"coordinates":{"latitude_deg":-33.833333333333,"longitude_deg":151.2},"speed_knots":0.0,"course_deg":0.0},"metadata":{"talker":"GP","checksum_supplied":"4B","checksum_valid":true,"fields_raw":["180000.50","A","3350.000","S","15112.000","E","0.0","0.0","151026","0.0","E"]}}},"unmapped":["$.motion.speed_kmh"]} +{"id":"NME-009","title":"GLL without optional checksum","profile":"nmea-supported","source":"APRS101 p. 34; FAP nmea_test.go","packet":"N0CALL>APRS:$GPGLL,4916.45,N,12311.12,W,225444,A","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":null,"checksum_valid":null,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"nmea","sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":null,"checksum_valid":null,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":[]} +{"id":"NME-010","title":"GLL checksum bad","profile":"nmea-supported","source":"FAP nmea_test.go","packet":"N0CALL>APRS:$GPGLL,4916.45,N,12311.12,W,225444,A*00","outcome":"reject-fix","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"nmea-checksum","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:$GPGLL,4916.45,N,12311.12,W,225444,A*00"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"NME-011","title":"GLL checksum empty","profile":"nmea-supported","source":"FAP nmea_test.go","packet":"N0CALL>APRS:$GPGLL,4916.45,N,12311.12,W,225444,A*","outcome":"reject-fix","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"nmea-checksum","position_usable":false},"expected":{"original_wire":"N0CALL>APRS:$GPGLL,4916.45,N,12311.12,W,225444,A*"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"NME-012","title":"Invalid fix GPRMC","profile":"nmea-supported","source":"FAP nmea_test.go; APRS101 p. 25","packet":"N0CALL>APRS:$GPRMC,041518,V,,,,,,,230309,,*33","outcome":"reject-fix","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPRMC","fields_raw":["041518","V","","","","","","","230309","",""],"checksum_supplied":"33","checksum_valid":true,"time_utc_raw":"041518","fix_status":"V","date_ddmmyy_raw":"230309","magnetic_variation_raw":"","magnetic_variation_direction":""},"position_usable":false},"note":"Checksum is deliberately correct, so this case isolates invalid fix status from checksum failure.","expected":{"original_wire":"N0CALL>APRS:$GPRMC,041518,V,,,,,,,230309,,*33"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"NME-013","title":"Invalid fix GPGLL","profile":"nmea-supported","source":"FAP nmea_test.go; APRS101 p. 25","packet":"N0CALL>APRS:$GPGLL,4916.45,N,12311.12,W,225444,V*26","outcome":"reject-fix","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","V"],"checksum_supplied":"26","checksum_valid":true,"time_utc_raw":"225444","fix_status":"V"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"position_usable":false},"note":"Checksum is deliberately correct, so this case isolates invalid fix status from checksum failure.","expected":{"original_wire":"N0CALL>APRS:$GPGLL,4916.45,N,12311.12,W,225444,V*26"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"NME-014","title":"Invalid fix GPGGA","profile":"nmea-supported","source":"FAP nmea_test.go; APRS101 p. 25","packet":"N0CALL>APRS:$GPGGA,123519,4807.038,N,01131.000,E,0,08,0.9,545.4,M,47.0,M,,*4E","outcome":"reject-fix","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGGA","fields_raw":["123519","4807.038","N","01131.000","E","0","08","0.9","545.4","M","47.0","M","",""],"checksum_supplied":"4E","checksum_valid":true,"time_utc_raw":"123519","fix_quality":0,"satellites":8,"hdop":0.9,"geoid_separation_m":47.0,"dgps_age_raw":"","dgps_station_raw":""},"position":{"latitude_deg":48.1173,"longitude_deg":11.516666666667},"altitude":{"meters":545.4,"reference":"mean-sea-level"},"position_usable":false},"note":"Checksum is deliberately correct, so this case isolates invalid fix status from checksum failure.","expected":{"original_wire":"N0CALL>APRS:$GPGGA,123519,4807.038,N,01131.000,E,0,08,0.9,545.4,M,47.0,M,,*4E"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"NME-015","title":"Destination symbol GPSC30","profile":"nmea-supported","source":"APRS101 pp. 90-93, Appendix 2","packet":"N0CALL-7>GPSC30:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-7","destination":"GPSC30","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null}},"expected":{"type":"packet","header":{"source":"N0CALL-7","destination":"GPSC30","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":">"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-016","title":"Destination symbol GPSE30","profile":"nmea-supported","source":"APRS101 pp. 90-93, Appendix 2","packet":"N0CALL-7>GPSE30:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-7","destination":"GPSE30","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"\\","table":"alternate","code":">","overlay":null}},"expected":{"type":"packet","header":{"source":"N0CALL-7","destination":"GPSE30","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"\\","code":">"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-017","title":"Destination symbol GPSMV","profile":"nmea-supported","source":"APRS101 pp. 90-93, Appendix 2","packet":"N0CALL-7>GPSMV:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-7","destination":"GPSMV","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null}},"expected":{"type":"packet","header":{"source":"N0CALL-7","destination":"GPSMV","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":">"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-018","title":"Destination symbol GPSNV3","profile":"nmea-supported","source":"APRS101 pp. 90-93, Appendix 2","packet":"N0CALL-7>GPSNV3:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-7","destination":"GPSNV3","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"3","table":"alternate","code":">","overlay":"3"}},"expected":{"type":"packet","header":{"source":"N0CALL-7","destination":"GPSNV3","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"3","code":">"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-019","title":"Destination symbol GPSBM","profile":"nmea-supported","source":"APRS101 pp. 90-93, Appendix 2","packet":"N0CALL-7>GPSBM:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-7","destination":"GPSBM","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":",","overlay":null}},"expected":{"type":"packet","header":{"source":"N0CALL-7","destination":"GPSBM","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":","},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-020","title":"Destination symbol GPSE12","profile":"nmea-supported","source":"APRS101 pp. 90-93, Appendix 2","packet":"N0CALL-7>GPSE12:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-7","destination":"GPSE12","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"\\","table":"alternate","code":",","overlay":null}},"expected":{"type":"packet","header":{"source":"N0CALL-7","destination":"GPSE12","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"\\","code":","},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-021","title":"Information symbol wins over destination and SSID","profile":"core-1.1","source":"APRS101 p. 93","packet":"N0CALL-7>GPSMV:!0123.45N/01234.56Wj","outcome":"accept","source_expected":{"header":{"source":"N0CALL-7","destination":"GPSMV","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":1.390833333333,"longitude_deg":-12.576,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL-7","destination":"GPSMV","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":1.390833333333,"longitude_deg":-12.576,"ambiguity":0,"symbol":{"table_id":"/","code":"j"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-022","title":"Historical source-SSID icon 1","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-1>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-1","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"a","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-1","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"a"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-023","title":"Historical source-SSID icon 2","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-2>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-2","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"U","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-2","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"U"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-024","title":"Historical source-SSID icon 3","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-3>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-3","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"f","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-3","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"f"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-025","title":"Historical source-SSID icon 4","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-4>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-4","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"b","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-4","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"b"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-026","title":"Historical source-SSID icon 5","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-5>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-5","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"Y","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-5","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"Y"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-027","title":"Historical source-SSID icon 6","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-6>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-6","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"X","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-6","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"X"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-028","title":"Historical source-SSID icon 7","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-7>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-7","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"'","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-7","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"'"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-029","title":"Historical source-SSID icon 8","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-8>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-8","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"s","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-8","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"s"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-030","title":"Historical source-SSID icon 9","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-9>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-9","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-9","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":">"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-031","title":"Historical source-SSID icon 10","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-10>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-10","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"<","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-10","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"<"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-032","title":"Historical source-SSID icon 11","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-11>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-11","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"O","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-11","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"O"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-033","title":"Historical source-SSID icon 12","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-12>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-12","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"j","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-12","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"j"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-034","title":"Historical source-SSID icon 13","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-13>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-13","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"R","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-13","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"R"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-035","title":"Historical source-SSID icon 14","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-14>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-14","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"k","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-14","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"k"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"NME-036","title":"Historical source-SSID icon 15","profile":"historical-1.0","source":"APRS101 p. 93; A11 SSIDs","packet":"N0CALL-15>GPS:$GPGLL,4916.45,N,12311.12,W,225444,A*31","outcome":"accept","source_expected":{"header":{"source":"N0CALL-15","destination":"GPS","path":[]},"kind":"nmea","format":"nmea","nmea":{"sentence":"GPGLL","fields_raw":["4916.45","N","12311.12","W","225444","A"],"checksum_supplied":"31","checksum_valid":true,"time_utc_raw":"225444","fix_status":"A"},"position":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333},"symbol":{"table_id_raw":"/","table":"primary","code":"v","overlay":null}},"note":"The current linked SSID recommendations explicitly make this legacy icon inference optional/obsolete; do not require it in the modern core.","expected":{"type":"packet","header":{"source":"N0CALL-15","destination":"GPS","path":[]},"payload":{"type":"nmea","symbol":{"table_id":"/","code":"v"},"sentence":{"type":"gll","time_utc":"225444","fix_status":"A","coordinates":{"latitude_deg":49.274166666667,"longitude_deg":-123.185333333333}},"metadata":{"talker":"GP","checksum_supplied":"31","checksum_valid":true,"fields_raw":["4916.45","N","12311.12","W","225444","A"]}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} diff --git a/packages/aprs/tests/vectors/obj.jsonl b/packages/aprs/tests/vectors/obj.jsonl new file mode 100644 index 0000000..043418f --- /dev/null +++ b/packages/aprs/tests/vectors/obj.jsonl @@ -0,0 +1,53 @@ +{"id":"OBJ-001","title":"Object LEADER alive=True","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:;LEADER *092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"LEADER","name_raw":"LEADER ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"LEADER","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-002","title":"Object LEADER alive=False","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:;LEADER _092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"LEADER","name_raw":"LEADER ","alive":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"LEADER","alive":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-003","title":"Object leader alive=True","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:;leader *092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"leader","name_raw":"leader ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"leader","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-004","title":"Object leader alive=False","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:;leader _092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"leader","name_raw":"leader ","alive":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"leader","alive":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-005","title":"Object A alive=True","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:;A *092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"A","name_raw":"A ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"A","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-006","title":"Object A alive=False","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:;A _092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"A","name_raw":"A ","alive":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"A","alive":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-007","title":"Object ABCDEFGHI alive=True","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:;ABCDEFGHI*092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"ABCDEFGHI","name_raw":"ABCDEFGHI","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"ABCDEFGHI","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-008","title":"Object ABCDEFGHI alive=False","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:;ABCDEFGHI_092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"ABCDEFGHI","name_raw":"ABCDEFGHI","alive":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"ABCDEFGHI","alive":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-009","title":"Object AID #2 alive=True","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:;AID #2 *092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AID #2","name_raw":"AID #2 ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AID #2","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-010","title":"Object AID #2 alive=False","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:;AID #2 _092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AID #2","name_raw":"AID #2 ","alive":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AID #2","alive":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-011","title":"Compressed object","profile":"core-1.1","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:;MOBILE *092345z/5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"MOBILE","name_raw":"MOBILE ","alive":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"note":"Defined format; the addendum discourages its use on RF, which is not a syntax prohibition.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"MOBILE","alive":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-012","title":"Moving object","profile":"core-1.1","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:;MOBILE *092345z4903.50N/07201.75W>088/036Moving","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"MOBILE","name_raw":"MOBILE ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"Moving","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"Moving","name":"MOBILE","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"motion":{"course_deg":88,"speed_knots":36}}}},"unmapped":["$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-013","title":"Item AID #2 alive=True","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:)AID #2!4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"AID #2","name_raw":"AID #2","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"AID #2","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-014","title":"Item AID #2 alive=False","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:)AID #2_4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"AID #2","name_raw":"AID #2","alive":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"AID #2","alive":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-015","title":"Item abc alive=True","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:)abc!4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"abc","name_raw":"abc","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"abc","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-016","title":"Item abc alive=False","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:)abc_4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"abc","name_raw":"abc","alive":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"abc","alive":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-017","title":"Item ABCDEFGHI alive=True","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:)ABCDEFGHI!4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"ABCDEFGHI","name_raw":"ABCDEFGHI","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"ABCDEFGHI","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-018","title":"Item ABCDEFGHI alive=False","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:)ABCDEFGHI_4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"ABCDEFGHI","name_raw":"ABCDEFGHI","alive":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"ABCDEFGHI","alive":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-019","title":"Item MixedCase alive=True","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:)MixedCase!4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"MixedCase","name_raw":"MixedCase","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"MixedCase","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-020","title":"Item MixedCase alive=False","profile":"core-1.1","source":"APRS101 pp. 57-59; A11 names","packet":"N0CALL>APRS:)MixedCase_4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"MixedCase","name_raw":"MixedCase","alive":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"MixedCase","alive":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-021","title":"Compressed item","profile":"core-1.1","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:)MOBILE!/5L!!<*e7>7P[","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"MOBILE","name_raw":"MOBILE","alive":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"motion":{"course_deg":88,"speed_knots":36.232012168838,"speed_kmh":67.101686536688},"comment":""},"note":"Defined format; the addendum discourages its use on RF, which is not a syntax prohibition.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"MOBILE","alive":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":">"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"motion":{"course_deg":88,"speed_knots":36.232012168838}}}},"unmapped":["$.compression.type_value","$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-022","title":"Moving item","profile":"core-1.1","source":"APRS101 pp. 58-59","packet":"N0CALL>APRS:)MOBILE!4903.50N/07201.75W>088/036Moving","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"MOBILE","name_raw":"MOBILE","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":"Moving","motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"Moving","name":"MOBILE","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"extensions":{"motion":{"course_deg":88,"speed_knots":36}}}},"unmapped":["$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-023","title":"Area shape 0","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;AREA *092345z4903.50N\\07201.75Wl010/310","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AREA","name_raw":"AREA ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":0,"shape":"open-circle","color_code":3,"color":"cyan","intensity":"high","latitude_offset_code":10,"longitude_offset_code":10,"latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.066666666667,"transmitted_anchor":"center"}},"note":"Use offset_code^2/1500 degrees. The transmitted coordinate is the lower reference point (circle center), not the upper offset-reference point. See ambiguity register for triangles/ellipses.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AREA","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":0,"color_code":3,"latitude_offset_code":10,"longitude_offset_code":10}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-024","title":"Area shape 1","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;AREA *092345z4903.50N\\07201.75Wl110/310{5}","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AREA","name_raw":"AREA ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":1,"shape":"line-down-right","color_code":3,"color":"cyan","intensity":"high","latitude_offset_code":10,"longitude_offset_code":10,"latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.066666666667,"transmitted_anchor":"lower-right","corridor_half_width_miles":5}},"note":"Use offset_code^2/1500 degrees. The transmitted coordinate is the lower reference point (circle center), not the upper offset-reference point. See ambiguity register for triangles/ellipses.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AREA","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":1,"color_code":3,"latitude_offset_code":10,"longitude_offset_code":10,"corridor_half_width_miles":5}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-025","title":"Area shape 2","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;AREA *092345z4903.50N\\07201.75Wl210/310","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AREA","name_raw":"AREA ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":2,"shape":"open-ellipse","color_code":3,"color":"cyan","intensity":"high","latitude_offset_code":10,"longitude_offset_code":10,"latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.066666666667,"transmitted_anchor":"lower-right"}},"note":"Use offset_code^2/1500 degrees. The transmitted coordinate is the lower reference point (circle center), not the upper offset-reference point. See ambiguity register for triangles/ellipses.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AREA","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":2,"color_code":3,"latitude_offset_code":10,"longitude_offset_code":10}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-026","title":"Area shape 3","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;AREA *092345z4903.50N\\07201.75Wl310/310","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AREA","name_raw":"AREA ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":3,"shape":"open-triangle","color_code":3,"color":"cyan","intensity":"high","latitude_offset_code":10,"longitude_offset_code":10,"latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.066666666667,"transmitted_anchor":"lower-right"}},"note":"Use offset_code^2/1500 degrees. The transmitted coordinate is the lower reference point (circle center), not the upper offset-reference point. See ambiguity register for triangles/ellipses.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AREA","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":3,"color_code":3,"latitude_offset_code":10,"longitude_offset_code":10}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-027","title":"Area shape 4","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;AREA *092345z4903.50N\\07201.75Wl410/310","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AREA","name_raw":"AREA ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":3,"color":"cyan","intensity":"high","latitude_offset_code":10,"longitude_offset_code":10,"latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.066666666667,"transmitted_anchor":"lower-right"}},"note":"Use offset_code^2/1500 degrees. The transmitted coordinate is the lower reference point (circle center), not the upper offset-reference point. See ambiguity register for triangles/ellipses.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AREA","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":3,"latitude_offset_code":10,"longitude_offset_code":10}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-028","title":"Area shape 5","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;AREA *092345z4903.50N\\07201.75Wl510/310","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AREA","name_raw":"AREA ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":5,"shape":"filled-circle","color_code":3,"color":"cyan","intensity":"high","latitude_offset_code":10,"longitude_offset_code":10,"latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.066666666667,"transmitted_anchor":"center"}},"note":"Use offset_code^2/1500 degrees. The transmitted coordinate is the lower reference point (circle center), not the upper offset-reference point. See ambiguity register for triangles/ellipses.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AREA","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":5,"color_code":3,"latitude_offset_code":10,"longitude_offset_code":10}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-029","title":"Area shape 6","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;AREA *092345z4903.50N\\07201.75Wl610/310{5}","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AREA","name_raw":"AREA ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":6,"shape":"line-down-left","color_code":3,"color":"cyan","intensity":"high","latitude_offset_code":10,"longitude_offset_code":10,"latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.066666666667,"transmitted_anchor":"lower-left","corridor_half_width_miles":5}},"note":"Use offset_code^2/1500 degrees. The transmitted coordinate is the lower reference point (circle center), not the upper offset-reference point. See ambiguity register for triangles/ellipses.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AREA","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":6,"color_code":3,"latitude_offset_code":10,"longitude_offset_code":10,"corridor_half_width_miles":5}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-030","title":"Area shape 7","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;AREA *092345z4903.50N\\07201.75Wl710/310","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AREA","name_raw":"AREA ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":7,"shape":"filled-ellipse","color_code":3,"color":"cyan","intensity":"high","latitude_offset_code":10,"longitude_offset_code":10,"latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.066666666667,"transmitted_anchor":"lower-right"}},"note":"Use offset_code^2/1500 degrees. The transmitted coordinate is the lower reference point (circle center), not the upper offset-reference point. See ambiguity register for triangles/ellipses.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AREA","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":7,"color_code":3,"latitude_offset_code":10,"longitude_offset_code":10}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-031","title":"Area shape 8","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;AREA *092345z4903.50N\\07201.75Wl810/310","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AREA","name_raw":"AREA ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":8,"shape":"filled-triangle","color_code":3,"color":"cyan","intensity":"high","latitude_offset_code":10,"longitude_offset_code":10,"latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.066666666667,"transmitted_anchor":"lower-right"}},"note":"Use offset_code^2/1500 degrees. The transmitted coordinate is the lower reference point (circle center), not the upper offset-reference point. See ambiguity register for triangles/ellipses.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AREA","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":8,"color_code":3,"latitude_offset_code":10,"longitude_offset_code":10}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-032","title":"Area shape 9","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;AREA *092345z4903.50N\\07201.75Wl910/310","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"AREA","name_raw":"AREA ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":9,"shape":"filled-box","color_code":3,"color":"cyan","intensity":"high","latitude_offset_code":10,"longitude_offset_code":10,"latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.066666666667,"transmitted_anchor":"lower-right"}},"note":"Use offset_code^2/1500 degrees. The transmitted coordinate is the lower reference point (circle center), not the upper offset-reference point. See ambiguity register for triangles/ellipses.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"AREA","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":9,"color_code":3,"latitude_offset_code":10,"longitude_offset_code":10}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-033","title":"Area color 0","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl410/020","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":0,"color":"black","intensity":"high","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":0}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-034","title":"Area color 1","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl410/120","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":1,"color":"blue","intensity":"high","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":1}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-035","title":"Area color 2","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl410/220","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":2,"color":"green","intensity":"high","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":2}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-036","title":"Area color 3","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl410/320","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":3,"color":"cyan","intensity":"high","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":3}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-037","title":"Area color 4","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl410/420","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":4,"color":"red","intensity":"high","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":4}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-038","title":"Area color 5","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl410/520","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":5,"color":"violet","intensity":"high","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":5}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-039","title":"Area color 6","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl410/620","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":6,"color":"yellow","intensity":"high","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":6}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-040","title":"Area color 7","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl410/720","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":7,"color":"gray","intensity":"high","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":7}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-041","title":"Area color 8","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl410/820","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":8,"color":"black","intensity":"low","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":8}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-042","title":"Area color 9","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl410/920","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":9,"color":"blue","intensity":"low","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":9}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-043","title":"Area color 10","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl4101020","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":10,"color":"green","intensity":"low","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":10}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-044","title":"Area color 11","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl4101120","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":11,"color":"cyan","intensity":"low","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":11}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-045","title":"Area color 12","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl4101220","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":12,"color":"red","intensity":"low","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":12}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-046","title":"Area color 13","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl4101320","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":13,"color":"violet","intensity":"low","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":13}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-047","title":"Area color 14","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl4101420","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":14,"color":"yellow","intensity":"low","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":14}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-048","title":"Area color 15","profile":"core-1.1","source":"APRS101 pp. 60-61; A11 AREA","packet":"N0CALL>APRS:;BOX *092345z4903.50N\\07201.75Wl4101520","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"BOX","name_raw":"BOX ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"l","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"area":{"shape_code":4,"shape":"open-box","color_code":15,"color":"gray","intensity":"low","latitude_offset_deg":0.066666666667,"longitude_offset_deg":0.266666666667,"transmitted_anchor":"lower-right"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"BOX","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"l"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"area":{"shape_code":4,"color_code":15}}}},"unmapped":["$.area.color","$.area.intensity","$.area.latitude_offset_deg","$.area.longitude_offset_deg","$.area.shape","$.area.transmitted_anchor","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-049","title":"Signpost 5","profile":"core-1.1","source":"APRS101 p. 61","packet":"N0CALL>APRS:)SIGN!4903.50N\\07201.75Wm{5}","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"SIGN","name_raw":"SIGN","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"m","overlay":null},"comment":"","signpost":{"label":"5"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"SIGN","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"m"},"extensions":{"signpost":{"label":"5"}}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-050","title":"Signpost 55","profile":"core-1.1","source":"APRS101 p. 61","packet":"N0CALL>APRS:)SIGN!4903.50N\\07201.75Wm{55}","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"SIGN","name_raw":"SIGN","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"m","overlay":null},"comment":"","signpost":{"label":"55"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"SIGN","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"m"},"extensions":{"signpost":{"label":"55"}}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-051","title":"Signpost ABC","profile":"core-1.1","source":"APRS101 p. 61","packet":"N0CALL>APRS:)SIGN!4903.50N\\07201.75Wm{ABC}","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"item","name":"SIGN","name_raw":"SIGN","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"m","overlay":null},"comment":"","signpost":{"label":"ABC"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"item","comment":"","name":"SIGN","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"m"},"extensions":{"signpost":{"label":"ABC"}}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table"]} +{"id":"OBJ-052","title":"Object name boundary 'STATION '","profile":"core-1.1","source":"A11 names","packet":"N0CALL>APRS:;STATION *092345z4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"STATION","name_raw":"STATION ","alive":true,"timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"STATION","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"OBJ-053","title":"Object name boundary ' STATION '","profile":"strict-validation","source":"A11 names","packet":"N0CALL>APRS:; STATION *092345z4903.50N/07201.75W>","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"leading-space-in-name"},"expected":{"original_wire":"N0CALL>APRS:; STATION *092345z4903.50N/07201.75W>"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} diff --git a/packages/aprs/tests/vectors/oth.jsonl b/packages/aprs/tests/vectors/oth.jsonl new file mode 100644 index 0000000..591498b --- /dev/null +++ b/packages/aprs/tests/vectors/oth.jsonl @@ -0,0 +1,38 @@ +{"id":"OTH-001","title":"Raw weather Ultimeter 2000 !!006","profile":"opaque-vendor","source":"APRS101 p. 62","packet":"N0CALL>APRS:!!006B005803500000----03E9--------002105140000005D","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"raw-weather","vendor":"Ultimeter 2000","raw_payload":"!!006B005803500000----03E9--------002105140000005D","decoded_measurements":null},"note":"APRS101 gives examples but not the vendor measurement layout. See FAP appendix for tested ULTW decoded measurements. Peet #/* needs a vendor specification before assigning measurements.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"raw_weather","information":"!!006B005803500000----03E9--------002105140000005D","format":"ultimeter_2000"}},"unmapped":["$.decoded_measurements"]} +{"id":"OTH-002","title":"Raw weather Peet Bros U-II #50B7","profile":"opaque-vendor","source":"APRS101 p. 62","packet":"N0CALL>APRS:#50B7500820082","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"raw-weather","vendor":"Peet Bros U-II","raw_payload":"#50B7500820082","decoded_measurements":null},"note":"APRS101 gives examples but not the vendor measurement layout. See FAP appendix for tested ULTW decoded measurements. Peet #/* needs a vendor specification before assigning measurements.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"raw_weather","information":"#50B7500820082"}},"unmapped":["$.decoded_measurements"]} +{"id":"OTH-003","title":"Raw weather Ultimeter 2000 $ULTW","profile":"opaque-vendor","source":"APRS101 p. 62","packet":"N0CALL>APRS:$ULTW0031003702CE0069----000086A00001----011901CC00000005","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"raw-weather","vendor":"Ultimeter 2000","raw_payload":"$ULTW0031003702CE0069----000086A00001----011901CC00000005","decoded_measurements":null},"note":"APRS101 gives examples but not the vendor measurement layout. See FAP appendix for tested ULTW decoded measurements. Peet #/* needs a vendor specification before assigning measurements.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"raw_weather","information":"$ULTW0031003702CE0069----000086A00001----011901CC00000005","format":"ultimeter_2000"}},"unmapped":["$.decoded_measurements"]} +{"id":"OTH-004","title":"Raw weather Peet Bros U-II *7007","profile":"opaque-vendor","source":"APRS101 p. 62","packet":"N0CALL>APRS:*7007600000000","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"raw-weather","vendor":"Peet Bros U-II","raw_payload":"*7007600000000","decoded_measurements":null},"note":"APRS101 gives examples but not the vendor measurement layout. See FAP appendix for tested ULTW decoded measurements. Peet #/* needs a vendor specification before assigning measurements.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"raw_weather","information":"*7007600000000"}},"unmapped":["$.decoded_measurements"]} +{"id":"OTH-005","title":"User-defined '{Q1'","profile":"core-1.1","source":"APRS101 pp. 87-88","packet":"N0CALL>APRS:{Q1qwerty","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"user-defined","user_id":"Q","user_type":"1","data":"qwerty"},"note":"Unknown user formats are safely ignored or exposed as opaque bytes; binary data is allowed even though printable ASCII is recommended.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"user_defined","user_id":"Q","user_type":"1","data":"qwerty"}},"unmapped":[]} +{"id":"OTH-006","title":"User-defined '{{z'","profile":"core-1.1","source":"APRS101 pp. 87-88","packet":"N0CALL>APRS:{{zasdfg","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"user-defined","user_id":"{","user_type":"z","data":"asdfg"},"note":"Unknown user formats are safely ignored or exposed as opaque bytes; binary data is allowed even though printable ASCII is recommended.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"user_defined","user_id":"{","user_type":"z","data":"asdfg"}},"unmapped":[]} +{"id":"OTH-007","title":"User-defined '{{z'","profile":"core-1.1","source":"APRS101 pp. 87-88","packet":"N0CALL>APRS:{{z\u0000\u00ff","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"user-defined","user_id":"{","user_type":"z","data":"\u0000\u00ff"},"note":"Unknown user formats are safely ignored or exposed as opaque bytes; binary data is allowed even though printable ASCII is recommended.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"user_defined","user_id":"{","user_type":"z","data":"\u0000\u00ff"}},"unmapped":[]} +{"id":"OTH-008","title":"Explicit invalid/test data","profile":"core-1.1","source":"APRS101 p. 89","packet":"N0CALL>APRS:,191146,V,4214.2466,N,07303.5181,W,417.238,114.5,091099,14.7,W/GPS FIX","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"invalid-or-test","data":"191146,V,4214.2466,N,07303.5181,W,417.238,114.5,091099,14.7,W/GPS FIX","position_usable":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"invalid","data":"191146,V,4214.2466,N,07303.5181,W,417.238,114.5,091099,14.7,W/GPS FIX"}},"unmapped":["$.position_usable"]} +{"id":"OTH-009","title":"Non-APRS / obsolete UIDIGI ready","profile":"core-1.1","source":"APRS101 pp. 61,75,89","packet":"N0CALL>APRS:UIDIGI ready","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"non-aprs-beacon","raw_text":"UIDIGI ready","status_fallback_permitted":true},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"beacon","text":"UIDIGI ready"}},"unmapped":["$.status_fallback_permitted"]} +{"id":"OTH-010","title":"Non-APRS / obsolete LEADER *09","profile":"core-1.1","source":"APRS101 pp. 61,75,89","packet":"N0CALL>APRS:LEADER *092345z4903.50N/07201.75W>","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"non-aprs-beacon","raw_text":"LEADER *092345z4903.50N/07201.75W>","status_fallback_permitted":true},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"beacon","text":"LEADER *092345z4903.50N/07201.75W>"}},"unmapped":["$.status_fallback_permitted"]} +{"id":"OTH-011","title":"Non-APRS / obsolete BLN1 :Ol","profile":"core-1.1","source":"APRS101 pp. 61,75,89","packet":"N0CALL>APRS:BLN1 :Old notice","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"non-aprs-beacon","raw_text":"BLN1 :Old notice","status_fallback_permitted":true},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"beacon","text":"BLN1 :Old notice"}},"unmapped":["$.status_fallback_permitted"]} +{"id":"OTH-012","title":"Obsolete bracket grid IO91","profile":"historical-1.0","source":"APRS101 pp. 25,33","packet":"N0CALL>APRS:[IO91]","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"legacy-grid-beacon","grid":{"locator":"IO91","bounds_deg":{"latitude":[51,52],"longitude":[-2,0]},"center_deg":[51.5,-1.0]}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"maidenhead","grid":{"locator":"IO91"}}},"unmapped":["$.grid.bounds_deg.latitude","$.grid.bounds_deg.longitude","$.grid.center_deg"]} +{"id":"OTH-013","title":"Obsolete bracket grid IO91SX","profile":"historical-1.0","source":"APRS101 pp. 25,33","packet":"N0CALL>APRS:[IO91SX]","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"legacy-grid-beacon","grid":{"locator":"IO91SX","bounds_deg":{"latitude":[51.958333333333,52.0],"longitude":[-0.5,-0.416666666667]},"center_deg":[51.979166666667,-0.458333333333]}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"maidenhead","grid":{"locator":"IO91SX"}}},"unmapped":["$.grid.bounds_deg.latitude","$.grid.bounds_deg.longitude","$.grid.center_deg"]} +{"id":"OTH-014","title":"Unspecified / reserved DTI '\"'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:\"TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"\"","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"\"TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-015","title":"Unspecified / reserved DTI '%'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:%TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"%","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"%TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-016","title":"Unspecified / reserved DTI '&'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:&TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"&","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"&TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-017","title":"Unspecified / reserved DTI '('","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:(TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"(","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"(TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-018","title":"Unspecified / reserved DTI '+'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:+TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"+","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"+TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-019","title":"Unspecified / reserved DTI '-'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:-TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"-","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"-TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-020","title":"Unspecified / reserved DTI '.'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:.TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":".","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":".TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-021","title":"Unspecified / reserved DTI '\\\\'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:\\TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"\\","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"\\TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-022","title":"Unspecified / reserved DTI ']'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:]TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"]","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"]TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-023","title":"Unspecified / reserved DTI '^'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:^TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"^","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"^TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-024","title":"Unspecified / reserved DTI 'A'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:ATEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"A","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"ATEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-025","title":"Unspecified / reserved DTI 'Z'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:ZTEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"Z","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"ZTEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-026","title":"Unspecified / reserved DTI 'a'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:aTEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"a","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"aTEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-027","title":"Unspecified / reserved DTI 'z'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:zTEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"z","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"zTEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-028","title":"Unspecified / reserved DTI '0'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:0TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"0","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"0TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-029","title":"Unspecified / reserved DTI '9'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:9TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"9","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"9TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-030","title":"Unspecified / reserved DTI '|'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:|TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"|","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"|TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-031","title":"Unspecified / reserved DTI '~'","profile":"core-1.1","source":"APRS101 pp. 17,89","packet":"N0CALL>APRS:~TEST","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"unsupported-or-reserved","dti":"~","raw_data":"TEST","position_usable":false},"note":"No invented subformat. % identifies Agrelo DFJr/MicroFinder, but these sources do not supply a sufficient payload grammar. Unsupported does not mean crash or accidental position fallback.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"opaque","information":"~TEST"}},"unmapped":["$.position_usable"]} +{"id":"OTH-032","title":"Modern exclamation offset 0","profile":"core-1.1","source":"APRS101 p. 18; A11 X1J deprecation","packet":"N0CALL>BEACON:!4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"BEACON","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"BEACON","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"OTH-033","title":"Modern exclamation offset 1","profile":"core-1.1","source":"APRS101 p. 18; A11 X1J deprecation","packet":"N0CALL>BEACON:X!4903.50N/07201.75W-","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"BEACON","path":[]},"kind":"non-aprs-beacon","raw_text":"X!4903.50N/07201.75W-","position_usable":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"BEACON","path":[]},"payload":{"type":"beacon","text":"X!4903.50N/07201.75W-"}},"unmapped":["$.position_usable"]} +{"id":"OTH-034","title":"Legacy X1J offset 1","profile":"historical-1.0","source":"APRS101 p. 18","packet":"N0CALL>BEACON:X!4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"BEACON","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"BEACON","path":[]},"payload":{"type":"legacy_position","prefix":"X","position":{"comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"OTH-035","title":"Modern exclamation offset 39","profile":"core-1.1","source":"APRS101 p. 18; A11 X1J deprecation","packet":"N0CALL>BEACON:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!4903.50N/07201.75W-","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"BEACON","path":[]},"kind":"non-aprs-beacon","raw_text":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!4903.50N/07201.75W-","position_usable":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"BEACON","path":[]},"payload":{"type":"beacon","text":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!4903.50N/07201.75W-"}},"unmapped":["$.position_usable"]} +{"id":"OTH-036","title":"Legacy X1J offset 39","profile":"historical-1.0","source":"APRS101 p. 18","packet":"N0CALL>BEACON:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"BEACON","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"BEACON","path":[]},"payload":{"type":"legacy_position","prefix":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","position":{"comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"OTH-037","title":"Modern exclamation offset 40","profile":"core-1.1","source":"APRS101 p. 18; A11 X1J deprecation","packet":"N0CALL>BEACON:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!4903.50N/07201.75W-","outcome":"opaque","source_expected":{"header":{"source":"N0CALL","destination":"BEACON","path":[]},"kind":"non-aprs-beacon","raw_text":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!4903.50N/07201.75W-","position_usable":false},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"BEACON","path":[]},"payload":{"type":"beacon","text":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!4903.50N/07201.75W-"}},"unmapped":["$.position_usable"]} +{"id":"OTH-038","title":"Historical grid locator in destination","profile":"historical-1.0","source":"APRS101 p.15","packet":"N0CALL>IO91SX:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"IO91SX","path":[]},"kind":"status","status_text":"Ready","destination_grid":{"locator":"IO91SX","bounds_deg":{"latitude":[51.958333333333,52.0],"longitude":[-0.5,-0.416666666667]},"center_deg":[51.979166666667,-0.458333333333]}},"note":"The six-character destination is a Maidenhead locator in this historical convention. Preserve its area independently of status text; do not treat its center as an exact position fix.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"IO91SX","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":["$.destination_grid.bounds_deg.latitude","$.destination_grid.bounds_deg.longitude","$.destination_grid.center_deg","$.destination_grid.locator"]} diff --git a/packages/aprs/tests/vectors/pos.jsonl b/packages/aprs/tests/vectors/pos.jsonl new file mode 100644 index 0000000..5a580d4 --- /dev/null +++ b/packages/aprs/tests/vectors/pos.jsonl @@ -0,0 +1,68 @@ +{"id":"POS-001","title":"DTI !","profile":"core-1.1","source":"APRS101 pp. 22-26, 32-33","packet":"N0CALL>APRS:!4903.50N/07201.75W-Test","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"Test"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Test","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-002","title":"DTI =","profile":"core-1.1","source":"APRS101 pp. 22-26, 32-33","packet":"N0CALL>APRS:=4903.50N/07201.75W-Test","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"Test"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Test","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-003","title":"DTI /","profile":"core-1.1","source":"APRS101 pp. 22-26, 32-33","packet":"N0CALL>APRS:/092345z4903.50N/07201.75W-Test","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"Test","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Test","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"POS-004","title":"DTI @","profile":"core-1.1","source":"APRS101 pp. 22-26, 32-33","packet":"N0CALL>APRS:@234517h4903.50N/07201.75W-Test","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"Test","timestamp":{"raw":"234517h","format":"HMS","zone":"UTC","hour":23,"minute":45,"second":17}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"Test","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"timestamp":{"kind":"hms_utc","hour":23,"minute":45,"second":17}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"POS-005","title":"Hemisphere NE","profile":"core-1.1","source":"APRS101 pp. 23-24","packet":"N0CALL>APRS:!4903.50N/07201.75E-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-006","title":"Hemisphere NW","profile":"core-1.1","source":"APRS101 pp. 23-24","packet":"N0CALL>APRS:!4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-007","title":"Hemisphere SE","profile":"core-1.1","source":"APRS101 pp. 23-24","packet":"N0CALL>APRS:!4903.50S/07201.75E-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":-49.058333333333,"longitude_deg":72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":-49.058333333333,"longitude_deg":72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-008","title":"Hemisphere SW","profile":"core-1.1","source":"APRS101 pp. 23-24","packet":"N0CALL>APRS:!4903.50S/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":-49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":-49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-009","title":"Coordinate boundary 0000.00N 00000.00E","profile":"core-1.1","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!0000.00N/00000.00E-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":0.0,"longitude_deg":0.0,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":0.0,"longitude_deg":0.0,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-010","title":"Coordinate boundary 9000.00N 18000.00E","profile":"core-1.1","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!9000.00N/18000.00E-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":90.0,"longitude_deg":180.0,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":90.0,"longitude_deg":180.0,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-011","title":"Coordinate boundary 9000.00S 18000.00W","profile":"core-1.1","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!9000.00S/18000.00W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":-90.0,"longitude_deg":-180.0,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":-90.0,"longitude_deg":-180.0,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-012","title":"Coordinate boundary 8959.99N 17959.99W","profile":"core-1.1","source":"APRS101 pp. 23-25","packet":"N0CALL>APRS:!8959.99N/17959.99W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":89.999833333333,"longitude_deg":-179.999833333333,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":89.999833333333,"longitude_deg":-179.999833333333,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-013","title":"Specified unknown-position convention","profile":"core-1.1","source":"APRS101 p. 25","packet":"N0CALL>APRS:!0000.00N\\00000.00W.","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":0.0,"longitude_deg":-0.0,"ambiguity_digits":0,"is_null_position":true},"symbol":{"table_id_raw":"\\","table":"alternate","code":".","overlay":null},"comment":""},"note":"Do not turn every numeric (0,0) coordinate into missing data; the null convention includes the indeterminate symbol.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":0.0,"longitude_deg":-0.0,"ambiguity":0,"symbol":{"table_id":"\\","code":"."}}},"unmapped":["$.position.is_null_position","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-014","title":"Ambiguity 1 NW","profile":"core-1.1","source":"APRS101 pp. 24-25","packet":"N0CALL>APRS:!4903.5 N/07201.7 W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.059166666667,"longitude_deg":-72.029166666667,"ambiguity_digits":1,"cell_bounds_deg":{"latitude":[49.058333333333,49.06],"longitude":[-72.03,-72.028333333333]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"note":"The cell is normative; the center is this corpus's deterministic representative, not a recovered exact fix.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.059166666667,"longitude_deg":-72.029166666667,"ambiguity":1,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-015","title":"Ambiguity 1 SE","profile":"core-1.1","source":"APRS101 pp. 24-25","packet":"N0CALL>APRS:!4903.5 S/07201.7 E-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":-49.059166666667,"longitude_deg":72.029166666667,"ambiguity_digits":1,"cell_bounds_deg":{"latitude":[-49.06,-49.058333333333],"longitude":[72.028333333333,72.03]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"note":"The cell is normative; the center is this corpus's deterministic representative, not a recovered exact fix.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":-49.059166666667,"longitude_deg":72.029166666667,"ambiguity":1,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-016","title":"Latitude-imposed ambiguity 1","profile":"core-1.1","source":"APRS101 p. 24","packet":"N0CALL>APRS:!4903.5 N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.059166666667,"longitude_deg":-72.029166666667,"ambiguity_digits":1,"cell_bounds_deg":{"latitude":[49.058333333333,49.06],"longitude":[-72.03,-72.028333333333]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.059166666667,"longitude_deg":-72.029166666667,"ambiguity":1,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-017","title":"Ambiguity 2 NW","profile":"core-1.1","source":"APRS101 pp. 24-25","packet":"N0CALL>APRS:!4903. N/07201. W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.025,"ambiguity_digits":2,"cell_bounds_deg":{"latitude":[49.05,49.066666666667],"longitude":[-72.033333333333,-72.016666666667]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"note":"The cell is normative; the center is this corpus's deterministic representative, not a recovered exact fix.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.025,"ambiguity":2,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-018","title":"Ambiguity 2 SE","profile":"core-1.1","source":"APRS101 pp. 24-25","packet":"N0CALL>APRS:!4903. S/07201. E-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":-49.058333333333,"longitude_deg":72.025,"ambiguity_digits":2,"cell_bounds_deg":{"latitude":[-49.066666666667,-49.05],"longitude":[72.016666666667,72.033333333333]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"note":"The cell is normative; the center is this corpus's deterministic representative, not a recovered exact fix.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":-49.058333333333,"longitude_deg":72.025,"ambiguity":2,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-019","title":"Latitude-imposed ambiguity 2","profile":"core-1.1","source":"APRS101 p. 24","packet":"N0CALL>APRS:!4903. N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.025,"ambiguity_digits":2,"cell_bounds_deg":{"latitude":[49.05,49.066666666667],"longitude":[-72.033333333333,-72.016666666667]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.025,"ambiguity":2,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-020","title":"Ambiguity 3 NW","profile":"core-1.1","source":"APRS101 pp. 24-25","packet":"N0CALL>APRS:!490 . N/0720 . W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.083333333333,"longitude_deg":-72.083333333333,"ambiguity_digits":3,"cell_bounds_deg":{"latitude":[49.0,49.166666666667],"longitude":[-72.166666666667,-72.0]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"note":"The cell is normative; the center is this corpus's deterministic representative, not a recovered exact fix.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.083333333333,"longitude_deg":-72.083333333333,"ambiguity":3,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-021","title":"Ambiguity 3 SE","profile":"core-1.1","source":"APRS101 pp. 24-25","packet":"N0CALL>APRS:!490 . S/0720 . E-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":-49.083333333333,"longitude_deg":72.083333333333,"ambiguity_digits":3,"cell_bounds_deg":{"latitude":[-49.166666666667,-49.0],"longitude":[72.0,72.166666666667]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"note":"The cell is normative; the center is this corpus's deterministic representative, not a recovered exact fix.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":-49.083333333333,"longitude_deg":72.083333333333,"ambiguity":3,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-022","title":"Latitude-imposed ambiguity 3","profile":"core-1.1","source":"APRS101 p. 24","packet":"N0CALL>APRS:!490 . N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.083333333333,"longitude_deg":-72.083333333333,"ambiguity_digits":3,"cell_bounds_deg":{"latitude":[49.0,49.166666666667],"longitude":[-72.166666666667,-72.0]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.083333333333,"longitude_deg":-72.083333333333,"ambiguity":3,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-023","title":"Ambiguity 4 NW","profile":"core-1.1","source":"APRS101 pp. 24-25","packet":"N0CALL>APRS:!49 . N/072 . W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.5,"longitude_deg":-72.5,"ambiguity_digits":4,"cell_bounds_deg":{"latitude":[49.0,50.0],"longitude":[-73.0,-72.0]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"note":"The cell is normative; the center is this corpus's deterministic representative, not a recovered exact fix.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.5,"ambiguity":4,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-024","title":"Ambiguity 4 SE","profile":"core-1.1","source":"APRS101 pp. 24-25","packet":"N0CALL>APRS:!49 . S/072 . E-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":-49.5,"longitude_deg":72.5,"ambiguity_digits":4,"cell_bounds_deg":{"latitude":[-50.0,-49.0],"longitude":[72.0,73.0]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"note":"The cell is normative; the center is this corpus's deterministic representative, not a recovered exact fix.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":-49.5,"longitude_deg":72.5,"ambiguity":4,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-025","title":"Latitude-imposed ambiguity 4","profile":"core-1.1","source":"APRS101 p. 24","packet":"N0CALL>APRS:!49 . N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.5,"longitude_deg":-72.5,"ambiguity_digits":4,"cell_bounds_deg":{"latitude":[49.0,50.0],"longitude":[-73.0,-72.0]},"representative":"cell-center"},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.5,"longitude_deg":-72.5,"ambiguity":4,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.position.cell_bounds_deg.latitude","$.position.cell_bounds_deg.longitude","$.position.representative","$.symbol.overlay","$.symbol.table"]} +{"id":"POS-026","title":"Comment preservation / length 0","profile":"core-1.1","source":"APRS101 pp. 20, 32","packet":"N0CALL>APRS:!4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":""},"note":"The raw comment is byte-preserving. Trimming is a separate presentation or compatibility choice.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-027","title":"Comment preservation / length 22","profile":"core-1.1","source":"APRS101 pp. 20, 32","packet":"N0CALL>APRS:!4903.50N/07201.75W- leading and trailing ","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":" leading and trailing "},"note":"The raw comment is byte-preserving. Trimming is a separate presentation or compatibility choice.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":" leading and trailing ","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-028","title":"Comment preservation / length 7","profile":"core-1.1","source":"APRS101 pp. 20, 32","packet":"N0CALL>APRS:!4903.50N/07201.75W-A:B > C","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"A:B > C"},"note":"The raw comment is byte-preserving. Trimming is a separate presentation or compatibility choice.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"A:B > C","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-029","title":"Comment preservation / length 22","profile":"core-1.1","source":"APRS101 pp. 20, 32","packet":"N0CALL>APRS:!4903.50N/07201.75W-A=001234 is plain text","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"A=001234 is plain text"},"note":"The raw comment is byte-preserving. Trimming is a separate presentation or compatibility choice.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"A=001234 is plain text","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-030","title":"Comment preservation / length 43","profile":"core-1.1","source":"APRS101 pp. 20, 32","packet":"N0CALL>APRS:!4903.50N/07201.75W-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"note":"The raw comment is byte-preserving. Trimming is a separate presentation or compatibility choice.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-031","title":"Symbol table / overlay /","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N/07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-032","title":"Symbol table / overlay \\","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N\\07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":">","overlay":null},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-033","title":"Symbol table / overlay 0","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N007201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"0","table":"alternate","code":">","overlay":"0"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"0","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-034","title":"Symbol table / overlay 1","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N107201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"1","table":"alternate","code":">","overlay":"1"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"1","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-035","title":"Symbol table / overlay 2","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N207201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"2","table":"alternate","code":">","overlay":"2"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"2","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-036","title":"Symbol table / overlay 3","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N307201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"3","table":"alternate","code":">","overlay":"3"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"3","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-037","title":"Symbol table / overlay 4","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N407201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"4","table":"alternate","code":">","overlay":"4"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"4","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-038","title":"Symbol table / overlay 5","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N507201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"5","table":"alternate","code":">","overlay":"5"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"5","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-039","title":"Symbol table / overlay 6","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N607201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"6","table":"alternate","code":">","overlay":"6"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"6","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-040","title":"Symbol table / overlay 7","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N707201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"7","table":"alternate","code":">","overlay":"7"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"7","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-041","title":"Symbol table / overlay 8","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N807201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"8","table":"alternate","code":">","overlay":"8"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"8","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-042","title":"Symbol table / overlay 9","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50N907201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"9","table":"alternate","code":">","overlay":"9"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"9","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-043","title":"Symbol table / overlay A","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NA07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"A","table":"alternate","code":">","overlay":"A"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"A","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-044","title":"Symbol table / overlay B","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NB07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"B","table":"alternate","code":">","overlay":"B"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"B","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-045","title":"Symbol table / overlay C","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NC07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"C","table":"alternate","code":">","overlay":"C"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"C","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-046","title":"Symbol table / overlay D","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50ND07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"D","table":"alternate","code":">","overlay":"D"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"D","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-047","title":"Symbol table / overlay E","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NE07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"E","table":"alternate","code":">","overlay":"E"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"E","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-048","title":"Symbol table / overlay F","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NF07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"F","table":"alternate","code":">","overlay":"F"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"F","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-049","title":"Symbol table / overlay G","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NG07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"G","table":"alternate","code":">","overlay":"G"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"G","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-050","title":"Symbol table / overlay H","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NH07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"H","table":"alternate","code":">","overlay":"H"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"H","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-051","title":"Symbol table / overlay I","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NI07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"I","table":"alternate","code":">","overlay":"I"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"I","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-052","title":"Symbol table / overlay J","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NJ07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"J","table":"alternate","code":">","overlay":"J"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"J","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-053","title":"Symbol table / overlay K","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NK07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"K","table":"alternate","code":">","overlay":"K"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"K","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-054","title":"Symbol table / overlay L","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NL07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"L","table":"alternate","code":">","overlay":"L"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"L","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-055","title":"Symbol table / overlay M","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NM07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"M","table":"alternate","code":">","overlay":"M"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"M","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-056","title":"Symbol table / overlay N","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NN07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"N","table":"alternate","code":">","overlay":"N"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"N","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-057","title":"Symbol table / overlay O","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NO07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"O","table":"alternate","code":">","overlay":"O"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"O","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-058","title":"Symbol table / overlay P","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NP07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"P","table":"alternate","code":">","overlay":"P"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"P","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-059","title":"Symbol table / overlay Q","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NQ07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"Q","table":"alternate","code":">","overlay":"Q"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"Q","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-060","title":"Symbol table / overlay R","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NR07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"R","table":"alternate","code":">","overlay":"R"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"R","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-061","title":"Symbol table / overlay S","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NS07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"S","table":"alternate","code":">","overlay":"S"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"S","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-062","title":"Symbol table / overlay T","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NT07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"T","table":"alternate","code":">","overlay":"T"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"T","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-063","title":"Symbol table / overlay U","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NU07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"U","table":"alternate","code":">","overlay":"U"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"U","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-064","title":"Symbol table / overlay V","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NV07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"V","table":"alternate","code":">","overlay":"V"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"V","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-065","title":"Symbol table / overlay W","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NW07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"W","table":"alternate","code":">","overlay":"W"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"W","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-066","title":"Symbol table / overlay X","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NX07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"X","table":"alternate","code":">","overlay":"X"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"X","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-067","title":"Symbol table / overlay Y","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NY07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"Y","table":"alternate","code":">","overlay":"Y"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"Y","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} +{"id":"POS-068","title":"Symbol table / overlay Z","profile":"core-1.1","source":"APRS101 pp. 90-93","packet":"N0CALL>APRS:!4903.50NZ07201.75W>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"Z","table":"alternate","code":">","overlay":"Z"},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"Z","code":">"}}},"unmapped":["$.symbol.overlay","$.symbol.table"]} diff --git a/packages/aprs/tests/vectors/qry.jsonl b/packages/aprs/tests/vectors/qry.jsonl new file mode 100644 index 0000000..9dc68f8 --- /dev/null +++ b/packages/aprs/tests/vectors/qry.jsonl @@ -0,0 +1,20 @@ +{"id":"QRY-001","title":"General APRS","profile":"core-1.1","source":"APRS101 pp. 77-78","packet":"N0CALL>APRS:?APRS?","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","query":{"type":"APRS","directed":false,"recognized":true,"ack_requested":false}},"note":"Unknown queries are ignored safely; no response is required.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"APRS"}},"unmapped":["$.query.ack_requested","$.query.directed","$.query.recognized"]} +{"id":"QRY-002","title":"General IGATE","profile":"core-1.1","source":"APRS101 pp. 77-78","packet":"N0CALL>APRS:?IGATE?","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","query":{"type":"IGATE","directed":false,"recognized":true,"ack_requested":false}},"note":"Unknown queries are ignored safely; no response is required.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"IGATE"}},"unmapped":["$.query.ack_requested","$.query.directed","$.query.recognized"]} +{"id":"QRY-003","title":"General WX","profile":"core-1.1","source":"APRS101 pp. 77-78","packet":"N0CALL>APRS:?WX?","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","query":{"type":"WX","directed":false,"recognized":true,"ack_requested":false}},"note":"Unknown queries are ignored safely; no response is required.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"WX"}},"unmapped":["$.query.ack_requested","$.query.directed","$.query.recognized"]} +{"id":"QRY-004","title":"General UNKNOWN","profile":"core-1.1","source":"APRS101 pp. 77-78","packet":"N0CALL>APRS:?UNKNOWN?","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","query":{"type":"UNKNOWN","directed":false,"recognized":false,"ack_requested":false}},"note":"Unknown queries are ignored safely; no response is required.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"UNKNOWN"}},"unmapped":["$.query.ack_requested","$.query.directed","$.query.recognized"]} +{"id":"QRY-005","title":"Target footprint 34.02,-117.15","profile":"core-1.1","source":"APRS101 p. 78","packet":"N0CALL>APRS:?APRS? 34.02,-117.15,0200","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","query":{"type":"APRS","directed":false,"latitude_deg":34.02,"longitude_deg":-117.15,"radius_miles":200,"radius_km":321.8688,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"APRS","footprint":{"center":{"latitude_deg":34.02,"longitude_deg":-117.15},"radius_miles":200}}},"unmapped":["$.query.ack_requested","$.query.directed","$.query.radius_km"]} +{"id":"QRY-006","title":"Target footprint -34.02, 117.15","profile":"core-1.1","source":"APRS101 p. 78","packet":"N0CALL>APRS:?APRS?-34.02, 117.15,0200","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","query":{"type":"APRS","directed":false,"latitude_deg":-34.02,"longitude_deg":117.15,"radius_miles":200,"radius_km":321.8688,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"APRS","footprint":{"center":{"latitude_deg":-34.02,"longitude_deg":117.15},"radius_miles":200}}},"unmapped":["$.query.ack_requested","$.query.directed","$.query.radius_km"]} +{"id":"QRY-007","title":"Directed APRSD","profile":"core-1.1","source":"APRS101 pp. 77,79","packet":"N0CALL>APRS::W1AW :?APRSD","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"?APRSD","message_id":null,"ack_requested":false},"query":{"type":"APRSD","directed":true,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"APRSD","addressee":"W1AW"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.message_id","$.message.text","$.query.ack_requested","$.query.directed"]} +{"id":"QRY-008","title":"Directed APRSH N0CALL ","profile":"core-1.1","source":"APRS101 pp. 77,79","packet":"N0CALL>APRS::W1AW :?APRSH N0CALL ","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"?APRSH N0CALL ","message_id":null,"ack_requested":false},"query":{"type":"APRSH","directed":true,"ack_requested":false,"heard_station":"N0CALL"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"APRSH","heard_station":"N0CALL","addressee":"W1AW"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.message_id","$.message.text","$.query.ack_requested","$.query.directed"]} +{"id":"QRY-009","title":"Directed APRSM","profile":"core-1.1","source":"APRS101 pp. 77,79","packet":"N0CALL>APRS::W1AW :?APRSM","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"?APRSM","message_id":null,"ack_requested":false},"query":{"type":"APRSM","directed":true,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"APRSM","addressee":"W1AW"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.message_id","$.message.text","$.query.ack_requested","$.query.directed"]} +{"id":"QRY-010","title":"Directed APRSO","profile":"core-1.1","source":"APRS101 pp. 77,79","packet":"N0CALL>APRS::W1AW :?APRSO","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"?APRSO","message_id":null,"ack_requested":false},"query":{"type":"APRSO","directed":true,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"APRSO","addressee":"W1AW"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.message_id","$.message.text","$.query.ack_requested","$.query.directed"]} +{"id":"QRY-011","title":"Directed APRSP","profile":"core-1.1","source":"APRS101 pp. 77,79","packet":"N0CALL>APRS::W1AW :?APRSP","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"?APRSP","message_id":null,"ack_requested":false},"query":{"type":"APRSP","directed":true,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"APRSP","addressee":"W1AW"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.message_id","$.message.text","$.query.ack_requested","$.query.directed"]} +{"id":"QRY-012","title":"Directed APRSS","profile":"core-1.1","source":"APRS101 pp. 77,79","packet":"N0CALL>APRS::W1AW :?APRSS","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"?APRSS","message_id":null,"ack_requested":false},"query":{"type":"APRSS","directed":true,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"APRSS","addressee":"W1AW"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.message_id","$.message.text","$.query.ack_requested","$.query.directed"]} +{"id":"QRY-013","title":"Directed APRST","profile":"core-1.1","source":"APRS101 pp. 77,79","packet":"N0CALL>APRS::W1AW :?APRST","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"?APRST","message_id":null,"ack_requested":false},"query":{"type":"APRST","directed":true,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"APRST","addressee":"W1AW"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.message_id","$.message.text","$.query.ack_requested","$.query.directed"]} +{"id":"QRY-014","title":"Directed PING?","profile":"core-1.1","source":"APRS101 pp. 77,79","packet":"N0CALL>APRS::W1AW :?PING?","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"query","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"?PING?","message_id":null,"ack_requested":false},"query":{"type":"PING","directed":true,"ack_requested":false}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"query","name":"PING","addressee":"W1AW"}},"unmapped":["$.message.ack_requested","$.message.addressee_raw","$.message.message_id","$.message.text","$.query.ack_requested","$.query.directed"]} +{"id":"QRY-015","title":"Query response Directs= W1AW W2ABC","profile":"core-1.1","source":"APRS101 p. 79","packet":"N0CALL>APRS::W1AW :Directs= W1AW W2ABC","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"Directs= W1AW W2ABC","message_id":null,"ack_requested":false}},"note":"Colons and greater-than signs inside the message do not begin a new outer envelope.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"response","addressee":"W1AW","response":{"type":"direct_stations","stations":["W1AW","W2ABC"]}}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"QRY-016","title":"Query response N0CALL HEARD: 1 3 2 . . 4 5 6","profile":"core-1.1","source":"APRS101 p. 79","packet":"N0CALL>APRS::W1AW :N0CALL HEARD: 1 3 2 . . 4 5 6","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"N0CALL HEARD: 1 3 2 . . 4 5 6","message_id":null,"ack_requested":false}},"note":"Colons and greater-than signs inside the message do not begin a new outer envelope.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"response","addressee":"W1AW","response":{"type":"heard_station","station":"N0CALL","counts":[1,3,2,null,null,4,5,6]}}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"QRY-017","title":"Query response N0CALL>APRS,DIGI1,WIDE*:","profile":"core-1.1","source":"APRS101 p. 79","packet":"N0CALL>APRS::W1AW :N0CALL>APRS,DIGI1,WIDE*:","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"message","message":{"addressee":"W1AW","addressee_raw":"W1AW ","text":"N0CALL>APRS,DIGI1,WIDE*:","message_id":null,"ack_requested":false}},"note":"Colons and greater-than signs inside the message do not begin a new outer envelope.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"response","addressee":"W1AW","response":{"type":"trace","header":{"source":"N0CALL","destination":"APRS","path":[{"address":"DIGI1","repeated":false},{"address":"WIDE","repeated":true}]}}}},"unmapped":["$.message.ack_requested","$.message.addressee_raw"]} +{"id":"QRY-018","title":"Capabilities IGATE,MSG_CNT=43,LOC_CNT=14","profile":"core-1.1","source":"APRS101 p. 77","packet":"N0CALL>APRS:APRS:APRS:APRS:;CHECKPT *151800z4903.50N/07201.75WA","outcome":"stateful","source_expected":{"name":"CHECKPT","owner":"W1AW","alive":true,"visible":true},"expected":{"type":"packet"},"state_expected":{"name":"CHECKPT","owner":"W1AW","alive":true,"visible":true}} +{"id":"SEQ-001.2","title":"Object ownership, kill and revival","profile":"stateful","source":"APRS101 p.57; A11 Objects/names","sequence":"SEQ-001","packet":"W2ABC>APRS:;CHECKPT *151801z4904.50N/07201.75WA","outcome":"stateful","source_expected":{"name":"CHECKPT","owner":"W2ABC","alive":true,"visible":true,"latitude_deg":49.075},"expected":{"type":"packet"},"state_expected":{"name":"CHECKPT","owner":"W2ABC","alive":true,"visible":true,"latitude_deg":49.075}} +{"id":"SEQ-001.3","title":"Object ownership, kill and revival","profile":"stateful","source":"APRS101 p.57; A11 Objects/names","sequence":"SEQ-001","packet":"W2ABC>APRS:;CHECKPT _151802z4904.50N/07201.75WA","outcome":"stateful","source_expected":{"name":"CHECKPT","owner":"W2ABC","alive":false,"visible":false,"record_retained":true},"expected":{"type":"packet"},"state_expected":{"name":"CHECKPT","owner":"W2ABC","alive":false,"visible":false,"record_retained":true}} +{"id":"SEQ-001.4","title":"Object ownership, kill and revival","profile":"stateful","source":"APRS101 p.57; A11 Objects/names","sequence":"SEQ-001","packet":"W2ABC>APRS:;CHECKPT *151803z4904.50N/07201.75WA","outcome":"stateful","source_expected":{"name":"CHECKPT","owner":"W2ABC","alive":true,"visible":true},"expected":{"type":"packet"},"state_expected":{"name":"CHECKPT","owner":"W2ABC","alive":true,"visible":true}} +{"id":"SEQ-002.1","title":"Name case and right padding","profile":"stateful","source":"APRS101 pp.58-59; A11 names","sequence":"SEQ-002","packet":"W1AW>APRS:;Leader *151800z4903.50N/07201.75W>","outcome":"stateful","source_expected":{"entity_key":"Leader","entity_count":1},"note":"One shared name namespace; strip right padding only. Do not uppercase object or item names.","expected":{"type":"packet"},"state_expected":{"entity_key":"Leader","entity_count":1}} +{"id":"SEQ-002.2","title":"Name case and right padding","profile":"stateful","source":"APRS101 pp.58-59; A11 names","sequence":"SEQ-002","packet":"W1AW>APRS:;LEADER *151801z4903.50N/07201.75W>","outcome":"stateful","source_expected":{"entity_key":"LEADER","entity_count":2},"note":"One shared name namespace; strip right padding only. Do not uppercase object or item names.","expected":{"type":"packet"},"state_expected":{"entity_key":"LEADER","entity_count":2}} +{"id":"SEQ-002.3","title":"Name case and right padding","profile":"stateful","source":"APRS101 pp.58-59; A11 names","sequence":"SEQ-002","packet":"W1AW>APRS:)Leader!4903.50N/07201.75W>","outcome":"stateful","source_expected":{"entity_key":"Leader","entity_count":2,"type_of_Leader":"item"},"note":"One shared name namespace; strip right padding only. Do not uppercase object or item names.","expected":{"type":"packet"},"state_expected":{"entity_key":"Leader","entity_count":2,"type_of_Leader":"item"}} +{"id":"SEQ-003.1","title":"Message duplication and reply acknowledgment","profile":"stateful","source":"APRS101 pp.71-72; A11 REPLY-ACK","sequence":"SEQ-003","packet":"W1AW>APRS::N0CALL :Hello{01}","outcome":"stateful","source_expected":{"deliveries":1,"ack_to":"W1AW","ack_payload":":W1AW :ack01}","pending_reply_ack":"01"},"note":"Receiver N0CALL has outbound message 02 pending. Deduplication uses sender + message ID/content, excluding the changing piggyback ACK; sending/retry timing is not executed by this corpus.","expected":{"type":"packet"},"state_expected":{"deliveries":1,"ack_to":"W1AW","ack_payload":":W1AW :ack01}","pending_reply_ack":"01"}} +{"id":"SEQ-003.2","title":"Message duplication and reply acknowledgment","profile":"stateful","source":"APRS101 pp.71-72; A11 REPLY-ACK","sequence":"SEQ-003","packet":"W1AW>APRS::N0CALL :Hello{01}02","outcome":"stateful","source_expected":{"deliveries":1,"ack_to":"W1AW","ack_payload":":W1AW :ack01}02","outbound_message_02_acked":true,"pending_reply_ack":"01"},"note":"Receiver N0CALL has outbound message 02 pending. Deduplication uses sender + message ID/content, excluding the changing piggyback ACK; sending/retry timing is not executed by this corpus.","expected":{"type":"packet"},"state_expected":{"deliveries":1,"ack_to":"W1AW","ack_payload":":W1AW :ack01}02","outbound_message_02_acked":true,"pending_reply_ack":"01"}} +{"id":"SEQ-003.3","title":"Message duplication and reply acknowledgment","profile":"stateful","source":"APRS101 pp.71-72; A11 REPLY-ACK","sequence":"SEQ-003","packet":"N0CALL>APRS::W1AW :Reply{03}01","outcome":"stateful","source_expected":{"message_id":"03","piggyback_ack":"01"},"note":"Receiver N0CALL has outbound message 02 pending. Deduplication uses sender + message ID/content, excluding the changing piggyback ACK; sending/retry timing is not executed by this corpus.","expected":{"type":"packet"},"state_expected":{"message_id":"03","piggyback_ack":"01"}} +{"id":"SEQ-004.1","title":"Telemetry calibration and bit sense","profile":"stateful","source":"APRS101 pp.68-70","sequence":"SEQ-004","packet":"N0CALL>APRS::N0CALL :PARM.Battery,Temp,,,,Camra,Chut","outcome":"stateful","source_expected":{"A1":"Battery","A2":"Temp","B1":"Camra","B2":"Chut"},"note":"Definition messages can arrive before or after values. Keep raw samples to permit recalculation. Do not invent coefficients for undefined channels.","expected":{"type":"packet"},"state_expected":{"A1":"Battery","A2":"Temp","B1":"Camra","B2":"Chut"}} +{"id":"SEQ-004.2","title":"Telemetry calibration and bit sense","profile":"stateful","source":"APRS101 pp.68-70","sequence":"SEQ-004","packet":"N0CALL>APRS::N0CALL :UNIT.v/100,deg.F,,,,Click,OPEN","outcome":"stateful","source_expected":{"A1_unit":"v/100","A2_unit":"deg.F","B1_label":"Click","B2_label":"OPEN"},"note":"Definition messages can arrive before or after values. Keep raw samples to permit recalculation. Do not invent coefficients for undefined channels.","expected":{"type":"packet"},"state_expected":{"A1_unit":"v/100","A2_unit":"deg.F","B1_label":"Click","B2_label":"OPEN"}} +{"id":"SEQ-004.3","title":"Telemetry calibration and bit sense","profile":"stateful","source":"APRS101 pp.68-70","sequence":"SEQ-004","packet":"N0CALL>APRS::N0CALL :EQNS.0,5.2,0,0,.53,-32","outcome":"stateful","source_expected":{"A1_coefficients":[0,5.2,0],"A2_coefficients":[0,0.53,-32]},"note":"Definition messages can arrive before or after values. Keep raw samples to permit recalculation. Do not invent coefficients for undefined channels.","expected":{"type":"packet"},"state_expected":{"A1_coefficients":[0,5.2,0],"A2_coefficients":[0,0.53,-32]}} +{"id":"SEQ-004.4","title":"Telemetry calibration and bit sense","profile":"stateful","source":"APRS101 pp.68-70","sequence":"SEQ-004","packet":"N0CALL>APRS::N0CALL :BITS.10110000,Balloon","outcome":"stateful","source_expected":{"sense_bits":"10110000","project":"Balloon"},"note":"Definition messages can arrive before or after values. Keep raw samples to permit recalculation. Do not invent coefficients for undefined channels.","expected":{"type":"packet"},"state_expected":{"sense_bits":"10110000","project":"Balloon"}} +{"id":"SEQ-004.5","title":"Telemetry calibration and bit sense","profile":"stateful","source":"APRS101 pp.68-70","sequence":"SEQ-004","packet":"N0CALL>APRS:T#005,199,100,255,073,123,10110000","outcome":"stateful","source_expected":{"raw_analog":[199,100,255,73,123],"A1_calibrated":1034.8,"A1_volts":10.348,"A2_fahrenheit":21,"B1_label_active":true,"B2_label_active":true},"note":"Definition messages can arrive before or after values. Keep raw samples to permit recalculation. Do not invent coefficients for undefined channels.","expected":{"type":"packet"},"state_expected":{"raw_analog":[199,100,255,73,123],"A1_calibrated":1034.8,"A1_volts":10.348,"A2_fahrenheit":21,"B1_label_active":true,"B2_label_active":true}} +{"id":"SEQ-005.1","title":"Bulletin replacement is source-scoped","profile":"stateful","source":"APRS101 p.76","sequence":"SEQ-005","packet":"W1AW>APRS::BLN1 :Road open","outcome":"stateful","source_expected":{"bulletins":{"W1AW/1":"Road open"}},"expected":{"type":"packet"},"state_expected":{"bulletins":{"W1AW/1":"Road open"}}} +{"id":"SEQ-005.2","title":"Bulletin replacement is source-scoped","profile":"stateful","source":"APRS101 p.76","sequence":"SEQ-005","packet":"W2ABC>APRS::BLN1 :Meeting at noon","outcome":"stateful","source_expected":{"bulletins":{"W1AW/1":"Road open","W2ABC/1":"Meeting at noon"}},"expected":{"type":"packet"},"state_expected":{"bulletins":{"W1AW/1":"Road open","W2ABC/1":"Meeting at noon"}}} +{"id":"SEQ-005.3","title":"Bulletin replacement is source-scoped","profile":"stateful","source":"APRS101 p.76","sequence":"SEQ-005","packet":"W1AW>APRS::BLN1 :Road closed","outcome":"stateful","source_expected":{"bulletins":{"W1AW/1":"Road closed","W2ABC/1":"Meeting at noon"}},"expected":{"type":"packet"},"state_expected":{"bulletins":{"W1AW/1":"Road closed","W2ABC/1":"Meeting at noon"}}} +{"id":"SEQ-006.1","title":"Non-APRS beacon cannot overwrite explicit status","profile":"stateful","source":"APRS101 p.89","sequence":"SEQ-006","packet":"N0CALL>ID:Starting","outcome":"stateful","source_expected":{"fallback_status":"Starting"},"expected":{"type":"packet"},"state_expected":{"fallback_status":"Starting"}} +{"id":"SEQ-006.2","title":"Non-APRS beacon cannot overwrite explicit status","profile":"stateful","source":"APRS101 p.89","sequence":"SEQ-006","packet":"N0CALL>APRS:>Operational","outcome":"stateful","source_expected":{"status":"Operational"},"expected":{"type":"packet"},"state_expected":{"status":"Operational"}} +{"id":"SEQ-006.3","title":"Non-APRS beacon cannot overwrite explicit status","profile":"stateful","source":"APRS101 p.89","sequence":"SEQ-006","packet":"N0CALL>ID:UIDIGI ready","outcome":"stateful","source_expected":{"status":"Operational","fallback_status_does_not_replace_explicit":true},"expected":{"type":"packet"},"state_expected":{"status":"Operational","fallback_status_does_not_replace_explicit":true}} +{"id":"SEQ-007.1","title":"Weather location association","profile":"stateful","source":"APRS101 p.65","sequence":"SEQ-007","packet":"N0CALL>APRS:!4903.50N/07201.75W_","outcome":"stateful","source_expected":{"station_latitude_deg":49.058333333333,"station_longitude_deg":-72.029166666667},"note":"Associate positionless weather with the same station identity, not with the immediately previous station in the input stream.","expected":{"type":"packet"},"state_expected":{"station_latitude_deg":49.058333333333,"station_longitude_deg":-72.029166666667}} +{"id":"SEQ-007.2","title":"Weather location association","profile":"stateful","source":"APRS101 p.65","sequence":"SEQ-007","packet":"N0CALL>APRS:_10151800c220s004g005t077","outcome":"stateful","source_expected":{"weather_latitude_deg":49.058333333333,"weather_longitude_deg":-72.029166666667,"temperature_c":25,"position_inherited_not_transmitted":true},"note":"Associate positionless weather with the same station identity, not with the immediately previous station in the input stream.","expected":{"type":"packet"},"state_expected":{"weather_latitude_deg":49.058333333333,"weather_longitude_deg":-72.029166666667,"temperature_c":25,"position_inherited_not_transmitted":true}} diff --git a/packages/aprs/tests/vectors/sta.jsonl b/packages/aprs/tests/vectors/sta.jsonl new file mode 100644 index 0000000..99f8729 --- /dev/null +++ b/packages/aprs/tests/vectors/sta.jsonl @@ -0,0 +1,29 @@ +{"id":"STA-001","title":"Status length 0","profile":"core-1.1","source":"APRS101 p. 80","packet":"N0CALL>APRS:>","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":""}},"unmapped":[]} +{"id":"STA-002","title":"Status length 5","profile":"core-1.1","source":"APRS101 p. 80","packet":"N0CALL>APRS:>Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready"}},"unmapped":[]} +{"id":"STA-003","title":"Status length 62","profile":"core-1.1","source":"APRS101 p. 80","packet":"N0CALL>APRS:>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}},"unmapped":[]} +{"id":"STA-004","title":"Status length 12","profile":"core-1.1","source":"APRS101 p. 80","packet":"N0CALL>APRS:> padded ","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":" padded "},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":" padded "}},"unmapped":[]} +{"id":"STA-005","title":"Status length 7","profile":"core-1.1","source":"APRS101 p. 80","packet":"N0CALL>APRS:>A:B > C","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"A:B > C"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"A:B > C"}},"unmapped":[]} +{"id":"STA-006","title":"Status length 23","profile":"core-1.1","source":"APRS101 p. 80","packet":"N0CALL>APRS:>1234567 not a timestamp","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"1234567 not a timestamp"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"1234567 not a timestamp"}},"unmapped":[]} +{"id":"STA-007","title":"Timed status","profile":"core-1.1","source":"APRS101 p. 80","packet":"N0CALL>APRS:>092345zxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"status_text":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"text":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}},"unmapped":["$.timestamp.raw"]} +{"id":"STA-008","title":"Grid IO91","profile":"core-1.1","source":"APRS101 pp. 81-82","packet":"N0CALL>APRS:>IO91/- Home","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","grid":{"locator":"IO91","bounds_deg":{"latitude":[51,52],"longitude":[-2,0]},"center_deg":[51.5,-1.0]},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"status_text":" Home"},"note":"Grid is an area. The reported center is a convention, not the precise station location; lowercase reception is explicitly supported.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","symbol":{"table_id":"/","code":"-"},"text":" Home","grid":{"locator":"IO91"}}},"unmapped":["$.grid.bounds_deg.latitude","$.grid.bounds_deg.longitude","$.grid.center_deg","$.symbol.overlay","$.symbol.table"]} +{"id":"STA-009","title":"Grid IO91SX","profile":"core-1.1","source":"APRS101 pp. 81-82","packet":"N0CALL>APRS:>IO91SX/- Home","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","grid":{"locator":"IO91SX","bounds_deg":{"latitude":[51.958333333333,52.0],"longitude":[-0.5,-0.416666666667]},"center_deg":[51.979166666667,-0.458333333333]},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"status_text":" Home"},"note":"Grid is an area. The reported center is a convention, not the precise station location; lowercase reception is explicitly supported.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","symbol":{"table_id":"/","code":"-"},"text":" Home","grid":{"locator":"IO91SX"}}},"unmapped":["$.grid.bounds_deg.latitude","$.grid.bounds_deg.longitude","$.grid.center_deg","$.symbol.overlay","$.symbol.table"]} +{"id":"STA-010","title":"Grid io91sx","profile":"core-1.1","source":"APRS101 pp. 81-82","packet":"N0CALL>APRS:>io91sx/- Home","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","grid":{"locator":"IO91SX","bounds_deg":{"latitude":[51.958333333333,52.0],"longitude":[-0.5,-0.416666666667]},"center_deg":[51.979166666667,-0.458333333333]},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"status_text":" Home"},"note":"Grid is an area. The reported center is a convention, not the precise station location; lowercase reception is explicitly supported.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","symbol":{"table_id":"/","code":"-"},"text":" Home","grid":{"locator":"IO91SX"}}},"unmapped":["$.grid.bounds_deg.latitude","$.grid.bounds_deg.longitude","$.grid.center_deg","$.symbol.overlay","$.symbol.table"]} +{"id":"STA-011","title":"Grid AA00AA","profile":"core-1.1","source":"APRS101 pp. 81-82","packet":"N0CALL>APRS:>AA00AA/- Home","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","grid":{"locator":"AA00AA","bounds_deg":{"latitude":[-90.0,-89.958333333333],"longitude":[-180.0,-179.916666666667]},"center_deg":[-89.979166666667,-179.958333333333]},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"status_text":" Home"},"note":"Grid is an area. The reported center is a convention, not the precise station location; lowercase reception is explicitly supported.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","symbol":{"table_id":"/","code":"-"},"text":" Home","grid":{"locator":"AA00AA"}}},"unmapped":["$.grid.bounds_deg.latitude","$.grid.bounds_deg.longitude","$.grid.center_deg","$.symbol.overlay","$.symbol.table"]} +{"id":"STA-012","title":"Grid RR99XX","profile":"core-1.1","source":"APRS101 pp. 81-82","packet":"N0CALL>APRS:>RR99XX/- Home","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","grid":{"locator":"RR99XX","bounds_deg":{"latitude":[89.958333333333,90.0],"longitude":[179.916666666667,180.0]},"center_deg":[89.979166666667,179.958333333333]},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"status_text":" Home"},"note":"Grid is an area. The reported center is a convention, not the precise station location; lowercase reception is explicitly supported.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","symbol":{"table_id":"/","code":"-"},"text":" Home","grid":{"locator":"RR99XX"}}},"unmapped":["$.grid.bounds_deg.latitude","$.grid.bounds_deg.longitude","$.grid.center_deg","$.symbol.overlay","$.symbol.table"]} +{"id":"STA-013","title":"Beam/ERP 01","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^01","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":0,"erp_w":10},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":0,"erp_w":10}}},"unmapped":[]} +{"id":"STA-014","title":"Beam/ERP 0:","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^0:","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":0,"erp_w":1000},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":0,"erp_w":1000}}},"unmapped":[]} +{"id":"STA-015","title":"Beam/ERP 0K","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^0K","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":0,"erp_w":7290},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":0,"erp_w":7290}}},"unmapped":[]} +{"id":"STA-016","title":"Beam/ERP 91","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^91","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":90,"erp_w":10},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":90,"erp_w":10}}},"unmapped":[]} +{"id":"STA-017","title":"Beam/ERP 9:","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^9:","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":90,"erp_w":1000},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":90,"erp_w":1000}}},"unmapped":[]} +{"id":"STA-018","title":"Beam/ERP 9K","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^9K","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":90,"erp_w":7290},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":90,"erp_w":7290}}},"unmapped":[]} +{"id":"STA-019","title":"Beam/ERP A1","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^A1","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":100,"erp_w":10},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":100,"erp_w":10}}},"unmapped":[]} +{"id":"STA-020","title":"Beam/ERP A:","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^A:","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":100,"erp_w":1000},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":100,"erp_w":1000}}},"unmapped":[]} +{"id":"STA-021","title":"Beam/ERP AK","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^AK","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":100,"erp_w":7290},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":100,"erp_w":7290}}},"unmapped":[]} +{"id":"STA-022","title":"Beam/ERP B1","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^B1","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":110,"erp_w":10},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":110,"erp_w":10}}},"unmapped":[]} +{"id":"STA-023","title":"Beam/ERP B:","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^B:","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":110,"erp_w":1000},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":110,"erp_w":1000}}},"unmapped":[]} +{"id":"STA-024","title":"Beam/ERP BK","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^BK","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":110,"erp_w":7290},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":110,"erp_w":7290}}},"unmapped":[]} +{"id":"STA-025","title":"Beam/ERP Z1","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^Z1","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":350,"erp_w":10},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":350,"erp_w":10}}},"unmapped":[]} +{"id":"STA-026","title":"Beam/ERP Z:","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^Z:","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":350,"erp_w":1000},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":350,"erp_w":1000}}},"unmapped":[]} +{"id":"STA-027","title":"Beam/ERP ZK","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^ZK","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready","beam_heading_deg":350,"erp_w":7290},"note":"Decode ^HP only at the end of the status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready","beam":{"heading_deg":350,"erp_w":7290}}},"unmapped":[]} +{"id":"STA-028","title":"Grid plus meteor scatter","profile":"core-1.1","source":"APRS101 pp. 81-82","packet":"N0CALL>APRS:>IO91SX/- ^B7","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","grid":{"locator":"IO91SX","bounds_deg":{"latitude":[51.958333333333,52.0],"longitude":[-0.5,-0.416666666667]},"center_deg":[51.979166666667,-0.458333333333]},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"status_text":" ","beam_heading_deg":110,"erp_w":490},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","symbol":{"table_id":"/","code":"-"},"text":" ","grid":{"locator":"IO91SX"},"beam":{"heading_deg":110,"erp_w":490}}},"unmapped":["$.grid.bounds_deg.latitude","$.grid.bounds_deg.longitude","$.grid.center_deg","$.symbol.overlay","$.symbol.table"]} +{"id":"STA-029","title":"Embedded beam-looking text","profile":"core-1.1","source":"APRS101 p. 81","packet":"N0CALL>APRS:>Ready^B7 later","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"Ready^B7 later"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"Ready^B7 later"}},"unmapped":[]} diff --git a/packages/aprs/tests/vectors/tim.jsonl b/packages/aprs/tests/vectors/tim.jsonl new file mode 100644 index 0000000..abd7a74 --- /dev/null +++ b/packages/aprs/tests/vectors/tim.jsonl @@ -0,0 +1,20 @@ +{"id":"TIM-001","title":"Position timestamp 010000z","profile":"core-1.1","source":"APRS101 pp. 22-23","packet":"N0CALL>APRS:@010000z4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"","timestamp":{"raw":"010000z","format":"DHM","zone":"UTC","day":1,"hour":0,"minute":0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"timestamp":{"kind":"dhm_utc","day":1,"hour":0,"minute":0}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"TIM-002","title":"Position timestamp 312359z","profile":"core-1.1","source":"APRS101 pp. 22-23","packet":"N0CALL>APRS:@312359z4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"","timestamp":{"raw":"312359z","format":"DHM","zone":"UTC","day":31,"hour":23,"minute":59}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"timestamp":{"kind":"dhm_utc","day":31,"hour":23,"minute":59}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"TIM-003","title":"Position timestamp 092345/","profile":"core-1.1","source":"APRS101 pp. 22-23","packet":"N0CALL>APRS:@092345/4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"","timestamp":{"raw":"092345/","format":"DHM","zone":"sender-local","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"timestamp":{"kind":"dhm_local","day":9,"hour":23,"minute":45}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"TIM-004","title":"Position timestamp 010000/","profile":"core-1.1","source":"APRS101 pp. 22-23","packet":"N0CALL>APRS:@010000/4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"","timestamp":{"raw":"010000/","format":"DHM","zone":"sender-local","day":1,"hour":0,"minute":0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"timestamp":{"kind":"dhm_local","day":1,"hour":0,"minute":0}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"TIM-005","title":"Position timestamp 000000h","profile":"core-1.1","source":"APRS101 pp. 22-23","packet":"N0CALL>APRS:@000000h4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"","timestamp":{"raw":"000000h","format":"HMS","zone":"UTC","hour":0,"minute":0,"second":0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"timestamp":{"kind":"hms_utc","hour":0,"minute":0,"second":0}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"TIM-006","title":"Position timestamp 235959h","profile":"core-1.1","source":"APRS101 pp. 22-23","packet":"N0CALL>APRS:@235959h4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"","timestamp":{"raw":"235959h","format":"HMS","zone":"UTC","hour":23,"minute":59,"second":59}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"timestamp":{"kind":"hms_utc","hour":23,"minute":59,"second":59}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"TIM-007","title":"Position timestamp 092345z","profile":"core-1.1","source":"APRS101 pp. 22-23","packet":"N0CALL>APRS:@092345z4903.50N/07201.75W-","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"position","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"-","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"-"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"TIM-008","title":"Positionless weather timestamp 01010000","profile":"core-1.1","source":"APRS101 pp. 22, 63-64","packet":"N0CALL>APRS:_01010000c...s...g...t...","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"01010000","format":"MDHM","zone":"UTC","month":1,"day":1,"hour":0,"minute":0},"weather":{"wind_direction_deg":null,"wind_speed_mph":null,"gust_mph":null,"temperature_f":null}},"note":"Year is absent; February 29 is not invalid without a year context.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":1,"month":1,"hour":0,"minute":0},"wind_direction":{"value":null,"unit":"degrees"},"wind_speed":{"value":null,"unit":"mph"},"gust":{"value":null,"unit":"mph"},"temperature":{"value":null,"unit":"fahrenheit"}}},"unmapped":["$.timestamp.raw"]} +{"id":"TIM-009","title":"Positionless weather timestamp 12312359","profile":"core-1.1","source":"APRS101 pp. 22, 63-64","packet":"N0CALL>APRS:_12312359c...s...g...t...","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"12312359","format":"MDHM","zone":"UTC","month":12,"day":31,"hour":23,"minute":59},"weather":{"wind_direction_deg":null,"wind_speed_mph":null,"gust_mph":null,"temperature_f":null}},"note":"Year is absent; February 29 is not invalid without a year context.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":31,"month":12,"hour":23,"minute":59},"wind_direction":{"value":null,"unit":"degrees"},"wind_speed":{"value":null,"unit":"mph"},"gust":{"value":null,"unit":"mph"},"temperature":{"value":null,"unit":"fahrenheit"}}},"unmapped":["$.timestamp.raw"]} +{"id":"TIM-010","title":"Positionless weather timestamp 02291234","profile":"core-1.1","source":"APRS101 pp. 22, 63-64","packet":"N0CALL>APRS:_02291234c...s...g...t...","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"02291234","format":"MDHM","zone":"UTC","month":2,"day":29,"hour":12,"minute":34},"weather":{"wind_direction_deg":null,"wind_speed_mph":null,"gust_mph":null,"temperature_f":null}},"note":"Year is absent; February 29 is not invalid without a year context.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":29,"month":2,"hour":12,"minute":34},"wind_direction":{"value":null,"unit":"degrees"},"wind_speed":{"value":null,"unit":"mph"},"gust":{"value":null,"unit":"mph"},"temperature":{"value":null,"unit":"fahrenheit"}}},"unmapped":["$.timestamp.raw"]} +{"id":"TIM-011","title":"Invalid timestamp 000000z","profile":"core-1.1","source":"APRS101 p. 22","packet":"N0CALL>APRS:@000000z4903.50N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-timestamp","partial":{"position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0}}},"note":"Reject the timestamp; retaining other fields with a warning is allowed. No normalized instant may be fabricated.","expected":{"original_wire":"N0CALL>APRS:@000000z4903.50N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"TIM-012","title":"Invalid timestamp 322359z","profile":"core-1.1","source":"APRS101 p. 22","packet":"N0CALL>APRS:@322359z4903.50N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-timestamp","partial":{"position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0}}},"note":"Reject the timestamp; retaining other fields with a warning is allowed. No normalized instant may be fabricated.","expected":{"original_wire":"N0CALL>APRS:@322359z4903.50N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"TIM-013","title":"Invalid timestamp 012400z","profile":"core-1.1","source":"APRS101 p. 22","packet":"N0CALL>APRS:@012400z4903.50N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-timestamp","partial":{"position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0}}},"note":"Reject the timestamp; retaining other fields with a warning is allowed. No normalized instant may be fabricated.","expected":{"original_wire":"N0CALL>APRS:@012400z4903.50N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"TIM-014","title":"Invalid timestamp 012360z","profile":"core-1.1","source":"APRS101 p. 22","packet":"N0CALL>APRS:@012360z4903.50N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-timestamp","partial":{"position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0}}},"note":"Reject the timestamp; retaining other fields with a warning is allowed. No normalized instant may be fabricated.","expected":{"original_wire":"N0CALL>APRS:@012360z4903.50N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"TIM-015","title":"Invalid timestamp 240000h","profile":"core-1.1","source":"APRS101 p. 22","packet":"N0CALL>APRS:@240000h4903.50N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-timestamp","partial":{"position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0}}},"note":"Reject the timestamp; retaining other fields with a warning is allowed. No normalized instant may be fabricated.","expected":{"original_wire":"N0CALL>APRS:@240000h4903.50N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"TIM-016","title":"Invalid timestamp 236000h","profile":"core-1.1","source":"APRS101 p. 22","packet":"N0CALL>APRS:@236000h4903.50N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-timestamp","partial":{"position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0}}},"note":"Reject the timestamp; retaining other fields with a warning is allowed. No normalized instant may be fabricated.","expected":{"original_wire":"N0CALL>APRS:@236000h4903.50N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"TIM-017","title":"Invalid timestamp 235960h","profile":"core-1.1","source":"APRS101 p. 22","packet":"N0CALL>APRS:@235960h4903.50N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-timestamp","partial":{"position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0}}},"note":"Reject the timestamp; retaining other fields with a warning is allowed. No normalized instant may be fabricated.","expected":{"original_wire":"N0CALL>APRS:@235960h4903.50N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"TIM-018","title":"Invalid timestamp 010000x","profile":"core-1.1","source":"APRS101 p. 22","packet":"N0CALL>APRS:@010000x4903.50N/07201.75W-","outcome":"reject-field","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"error_class":"invalid-timestamp","partial":{"position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0}}},"note":"Reject the timestamp; retaining other fields with a warning is allowed. No normalized instant may be fabricated.","expected":{"original_wire":"N0CALL>APRS:@010000x4903.50N/07201.75W-"},"rejection":"Malformed or a Packet with nonconforming diagnostics; exact diagnostic wording is not specified by the source."} +{"id":"TIM-019","title":"Timestamp-looking status remains text 092345/","profile":"core-1.1","source":"APRS101 pp. 22, 80","packet":"N0CALL>APRS:>092345/Ready","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"092345/Ready"},"note":"Only DDHHMMz is a status timestamp. These bytes can still be valid ordinary status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"092345/Ready"}},"unmapped":[]} +{"id":"TIM-020","title":"Timestamp-looking status remains text 234517h","profile":"core-1.1","source":"APRS101 pp. 22, 80","packet":"N0CALL>APRS:>234517hReady","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"status","status_text":"234517hReady"},"note":"Only DDHHMMz is a status timestamp. These bytes can still be valid ordinary status text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"status","text":"234517hReady"}},"unmapped":[]} diff --git a/packages/aprs/tests/vectors/tlm.jsonl b/packages/aprs/tests/vectors/tlm.jsonl new file mode 100644 index 0000000..c29d957 --- /dev/null +++ b/packages/aprs/tests/vectors/tlm.jsonl @@ -0,0 +1,18 @@ +{"id":"TLM-001","title":"Sequence 000 comma=True","profile":"core-1.1","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#000,199,000,255,073,123,01101001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry","telemetry":{"sequence":0,"sequence_raw":"000","analog_raw":[199,0,255,73,123],"digital_bits":"01101001","digital_channels_B1_to_B8":[0,1,1,0,1,0,0,1]},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"","sequence":0,"sequence_raw":"000","analog":[199,0,255,73,123],"digital":[false,true,true,false,true,false,false,true],"encoding":"classic"}},"unmapped":["$.telemetry.digital_channels_B1_to_B8"]} +{"id":"TLM-002","title":"Sequence 005 comma=True","profile":"core-1.1","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#005,199,000,255,073,123,01101001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry","telemetry":{"sequence":5,"sequence_raw":"005","analog_raw":[199,0,255,73,123],"digital_bits":"01101001","digital_channels_B1_to_B8":[0,1,1,0,1,0,0,1]},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"","sequence":5,"sequence_raw":"005","analog":[199,0,255,73,123],"digital":[false,true,true,false,true,false,false,true],"encoding":"classic"}},"unmapped":["$.telemetry.digital_channels_B1_to_B8"]} +{"id":"TLM-003","title":"Sequence 999 comma=True","profile":"core-1.1","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#999,199,000,255,073,123,01101001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry","telemetry":{"sequence":999,"sequence_raw":"999","analog_raw":[199,0,255,73,123],"digital_bits":"01101001","digital_channels_B1_to_B8":[0,1,1,0,1,0,0,1]},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"","sequence":999,"sequence_raw":"999","analog":[199,0,255,73,123],"digital":[false,true,true,false,true,false,false,true],"encoding":"classic"}},"unmapped":["$.telemetry.digital_channels_B1_to_B8"]} +{"id":"TLM-004","title":"Sequence MIC comma=True","profile":"core-1.1","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#MIC,199,000,255,073,123,01101001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry","telemetry":{"sequence":null,"sequence_raw":"MIC","analog_raw":[199,0,255,73,123],"digital_bits":"01101001","digital_channels_B1_to_B8":[0,1,1,0,1,0,0,1]},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"","sequence":"MIC","sequence_raw":"MIC","analog":[199,0,255,73,123],"digital":[false,true,true,false,true,false,false,true],"encoding":"classic"}},"unmapped":["$.telemetry.digital_channels_B1_to_B8"]} +{"id":"TLM-005","title":"Sequence MIC comma=False","profile":"core-1.1","source":"APRS101 p. 68","packet":"N0CALL>APRS:T#MIC199,000,255,073,123,01101001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry","telemetry":{"sequence":null,"sequence_raw":"MIC","analog_raw":[199,0,255,73,123],"digital_bits":"01101001","digital_channels_B1_to_B8":[0,1,1,0,1,0,0,1]},"comment":""},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"","sequence":"MIC","sequence_raw":"MIC","analog":[199,0,255,73,123],"digital":[false,true,true,false,true,false,false,true],"encoding":"classic"}},"unmapped":["$.telemetry.digital_channels_B1_to_B8"]} +{"id":"TLM-006","title":"Analog/digital boundaries 00000000","profile":"core-1.1","source":"APRS101 pp. 68-70","packet":"N0CALL>APRS:T#123,000,000,000,000,000,00000000Payload","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry","telemetry":{"sequence":123,"sequence_raw":"123","analog_raw":[0,0,0,0,0],"digital_bits":"00000000","digital_channels_B1_to_B8":[0,0,0,0,0,0,0,0]},"comment":"Payload"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"Payload","sequence":123,"sequence_raw":"123","analog":[0,0,0,0,0],"digital":[false,false,false,false,false,false,false,false],"encoding":"classic"}},"unmapped":["$.telemetry.digital_channels_B1_to_B8"]} +{"id":"TLM-007","title":"Analog/digital boundaries 11111111","profile":"core-1.1","source":"APRS101 pp. 68-70","packet":"N0CALL>APRS:T#123,255,255,255,255,255,11111111Payload","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry","telemetry":{"sequence":123,"sequence_raw":"123","analog_raw":[255,255,255,255,255],"digital_bits":"11111111","digital_channels_B1_to_B8":[1,1,1,1,1,1,1,1]},"comment":"Payload"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"Payload","sequence":123,"sequence_raw":"123","analog":[255,255,255,255,255],"digital":[true,true,true,true,true,true,true,true],"encoding":"classic"}},"unmapped":["$.telemetry.digital_channels_B1_to_B8"]} +{"id":"TLM-008","title":"Analog/digital boundaries 10000000","profile":"core-1.1","source":"APRS101 pp. 68-70","packet":"N0CALL>APRS:T#123,001,002,003,004,005,10000000Payload","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry","telemetry":{"sequence":123,"sequence_raw":"123","analog_raw":[1,2,3,4,5],"digital_bits":"10000000","digital_channels_B1_to_B8":[1,0,0,0,0,0,0,0]},"comment":"Payload"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"Payload","sequence":123,"sequence_raw":"123","analog":[1,2,3,4,5],"digital":[true,false,false,false,false,false,false,false],"encoding":"classic"}},"unmapped":["$.telemetry.digital_channels_B1_to_B8"]} +{"id":"TLM-009","title":"Analog/digital boundaries 00000001","profile":"core-1.1","source":"APRS101 pp. 68-70","packet":"N0CALL>APRS:T#123,001,002,003,004,005,00000001Payload","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry","telemetry":{"sequence":123,"sequence_raw":"123","analog_raw":[1,2,3,4,5],"digital_bits":"00000001","digital_channels_B1_to_B8":[0,0,0,0,0,0,0,1]},"comment":"Payload"},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry","comment":"Payload","sequence":123,"sequence_raw":"123","analog":[1,2,3,4,5],"digital":[false,false,false,false,false,false,false,true],"encoding":"classic"}},"unmapped":["$.telemetry.digital_channels_B1_to_B8"]} +{"id":"TLM-010","title":"Definition PARM","profile":"core-1.1","source":"APRS101 pp. 68-70","packet":"N0CALL>APRS::N0CALL-11:PARM.Battery,Btemp,ATemp,Pres,Alt,Camra,Chut,Sun,10m,ATV","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry-definition","message":{"addressee":"N0CALL-11","addressee_raw":"N0CALL-11","text":"PARM.Battery,Btemp,ATemp,Pres,Alt,Camra,Chut,Sun,10m,ATV","message_id":null,"ack_requested":false},"telemetry_definition":{"target":"N0CALL-11","type":"PARM","values_raw":["Battery","Btemp","ATemp","Pres","Alt","Camra","Chut","Sun","10m","ATV"],"channels":["Battery","Btemp","ATemp","Pres","Alt","Camra","Chut","Sun","10m","ATV",null,null,null]}},"note":"The sender may configure another telemetry station. Do not require addressee == packet source.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL-11","definition":{"type":"telemetry_parameters","channels":["Battery","Btemp","ATemp","Pres","Alt","Camra","Chut","Sun","10m","ATV",null,null,null]}}},"unmapped":["$.message.ack_requested","$.message.addressee","$.message.addressee_raw","$.message.message_id","$.message.text","$.telemetry_definition.values_raw"]} +{"id":"TLM-011","title":"Definition UNIT","profile":"core-1.1","source":"APRS101 pp. 68-70","packet":"N0CALL>APRS::N0CALL-11:UNIT.v/100,deg.F,deg.F,Mbar,Kft,Click,OPEN,on,on,hi","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry-definition","message":{"addressee":"N0CALL-11","addressee_raw":"N0CALL-11","text":"UNIT.v/100,deg.F,deg.F,Mbar,Kft,Click,OPEN,on,on,hi","message_id":null,"ack_requested":false},"telemetry_definition":{"target":"N0CALL-11","type":"UNIT","values_raw":["v/100","deg.F","deg.F","Mbar","Kft","Click","OPEN","on","on","hi"],"channels":["v/100","deg.F","deg.F","Mbar","Kft","Click","OPEN","on","on","hi",null,null,null]}},"note":"The sender may configure another telemetry station. Do not require addressee == packet source.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL-11","definition":{"type":"telemetry_units","channels":["v/100","deg.F","deg.F","Mbar","Kft","Click","OPEN","on","on","hi",null,null,null]}}},"unmapped":["$.message.ack_requested","$.message.addressee","$.message.addressee_raw","$.message.message_id","$.message.text","$.telemetry_definition.values_raw"]} +{"id":"TLM-012","title":"Definition EQNS","profile":"core-1.1","source":"APRS101 pp. 68-70","packet":"N0CALL>APRS::N0CALL-11:EQNS.0,5.2,0,0,.53,-32,3,4.39,49,-32,3,18,1,2,3","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry-definition","message":{"addressee":"N0CALL-11","addressee_raw":"N0CALL-11","text":"EQNS.0,5.2,0,0,.53,-32,3,4.39,49,-32,3,18,1,2,3","message_id":null,"ack_requested":false},"telemetry_definition":{"target":"N0CALL-11","type":"EQNS","values_raw":["0","5.2","0","0",".53","-32","3","4.39","49","-32","3","18","1","2","3"],"coefficients_abc":[[0.0,5.2,0.0],[0.0,0.53,-32.0],[3.0,4.39,49.0],[-32.0,3.0,18.0],[1.0,2.0,3.0]]}},"note":"The sender may configure another telemetry station. Do not require addressee == packet source.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL-11","definition":{"type":"telemetry_equations","coefficients":[{"a":0.0,"b":5.2,"c":0.0},{"a":0.0,"b":0.53,"c":-32.0},{"a":3.0,"b":4.39,"c":49.0},{"a":-32.0,"b":3.0,"c":18.0},{"a":1.0,"b":2.0,"c":3.0}]}}},"unmapped":["$.message.ack_requested","$.message.addressee","$.message.addressee_raw","$.message.message_id","$.message.text","$.telemetry_definition.values_raw"]} +{"id":"TLM-013","title":"Definition BITS","profile":"core-1.1","source":"APRS101 pp. 68-70","packet":"N0CALL>APRS::N0CALL-11:BITS.10110000,Balloon project","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry-definition","message":{"addressee":"N0CALL-11","addressee_raw":"N0CALL-11","text":"BITS.10110000,Balloon project","message_id":null,"ack_requested":false},"telemetry_definition":{"target":"N0CALL-11","type":"BITS","values_raw":["10110000","Balloon project"],"sense_bits":"10110000","project_title":"Balloon project"}},"note":"The sender may configure another telemetry station. Do not require addressee == packet source.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL-11","definition":{"type":"telemetry_bits","sense":[true,false,true,true,false,false,false,false],"project_title":"Balloon project"}}},"unmapped":["$.message.ack_requested","$.message.addressee","$.message.addressee_raw","$.message.message_id","$.message.text","$.telemetry_definition.values_raw"]} +{"id":"TLM-014","title":"Partial / empty definition PARM.Temp","profile":"core-1.1","source":"APRS101 pp. 69-70","packet":"N0CALL>APRS::N0CALL :PARM.Temp","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry-definition","message":{"addressee":"N0CALL","addressee_raw":"N0CALL ","text":"PARM.Temp","message_id":null,"ack_requested":false},"telemetry_definition":{"target":"N0CALL","type":"PARM","values_raw":["Temp"]}},"note":"Preserve empty slots and incomplete definitions; do not shift later channels left.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL","definition":{"type":"telemetry_parameters"}}},"unmapped":["$.message.ack_requested","$.message.addressee","$.message.addressee_raw","$.message.message_id","$.message.text","$.telemetry_definition.values_raw"]} +{"id":"TLM-015","title":"Partial / empty definition PARM.Temp,,Volt","profile":"core-1.1","source":"APRS101 pp. 69-70","packet":"N0CALL>APRS::N0CALL :PARM.Temp,,Volt","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry-definition","message":{"addressee":"N0CALL","addressee_raw":"N0CALL ","text":"PARM.Temp,,Volt","message_id":null,"ack_requested":false},"telemetry_definition":{"target":"N0CALL","type":"PARM","values_raw":["Temp","","Volt"]}},"note":"Preserve empty slots and incomplete definitions; do not shift later channels left.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL","definition":{"type":"telemetry_parameters"}}},"unmapped":["$.message.ack_requested","$.message.addressee","$.message.addressee_raw","$.message.message_id","$.message.text","$.telemetry_definition.values_raw"]} +{"id":"TLM-016","title":"Partial / empty definition UNIT.deg.C,,V","profile":"core-1.1","source":"APRS101 pp. 69-70","packet":"N0CALL>APRS::N0CALL :UNIT.deg.C,,V","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry-definition","message":{"addressee":"N0CALL","addressee_raw":"N0CALL ","text":"UNIT.deg.C,,V","message_id":null,"ack_requested":false},"telemetry_definition":{"target":"N0CALL","type":"UNIT","values_raw":["deg.C","","V"]}},"note":"Preserve empty slots and incomplete definitions; do not shift later channels left.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL","definition":{"type":"telemetry_units"}}},"unmapped":["$.message.ack_requested","$.message.addressee","$.message.addressee_raw","$.message.message_id","$.message.text","$.telemetry_definition.values_raw"]} +{"id":"TLM-017","title":"Partial / empty definition EQNS.0,1,0","profile":"core-1.1","source":"APRS101 pp. 69-70","packet":"N0CALL>APRS::N0CALL :EQNS.0,1,0","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry-definition","message":{"addressee":"N0CALL","addressee_raw":"N0CALL ","text":"EQNS.0,1,0","message_id":null,"ack_requested":false},"telemetry_definition":{"target":"N0CALL","type":"EQNS","values_raw":["0","1","0"]}},"note":"Preserve empty slots and incomplete definitions; do not shift later channels left.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL","definition":{"type":"telemetry_equations"}}},"unmapped":["$.message.ack_requested","$.message.addressee","$.message.addressee_raw","$.message.message_id","$.message.text","$.telemetry_definition.values_raw"]} +{"id":"TLM-018","title":"Partial / empty definition BITS.11111111,","profile":"core-1.1","source":"APRS101 pp. 69-70","packet":"N0CALL>APRS::N0CALL :BITS.11111111,","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"telemetry-definition","message":{"addressee":"N0CALL","addressee_raw":"N0CALL ","text":"BITS.11111111,","message_id":null,"ack_requested":false},"telemetry_definition":{"target":"N0CALL","type":"BITS","values_raw":["11111111",""]}},"note":"Preserve empty slots and incomplete definitions; do not shift later channels left.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"telemetry_definition","addressee":"N0CALL","definition":{"type":"telemetry_bits"}}},"unmapped":["$.message.ack_requested","$.message.addressee","$.message.addressee_raw","$.message.message_id","$.message.text","$.telemetry_definition.values_raw"]} diff --git a/packages/aprs/tests/vectors/wx.jsonl b/packages/aprs/tests/vectors/wx.jsonl new file mode 100644 index 0000000..595b8c4 --- /dev/null +++ b/packages/aprs/tests/vectors/wx.jsonl @@ -0,0 +1,69 @@ +{"id":"WX-001","title":"Complete positionless report","profile":"core-1.1","source":"APRS101 pp. 63-64","packet":"N0CALL>APRS:_10090556c220s004g005t077r001p025P012h50b09900WRSW","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0,"software_code":"W","device_code":"RSW"}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"software_code":"W","device_code":"RSW","wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-002","title":"Complete weather DTI !","profile":"disputed-units","source":"APRS101 pp. 27, 65-66; FAP weather.go","packet":"N0CALL>APRS:!4903.50N/07201.75W_220/004g005t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"note":"Assert raw wind speed and the chosen unit profile. Do not require both physical speeds simultaneously.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-003","title":"Complete weather DTI =","profile":"disputed-units","source":"APRS101 pp. 27, 65-66; FAP weather.go","packet":"N0CALL>APRS:=4903.50N/07201.75W_220/004g005t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"note":"Assert raw wind speed and the chosen unit profile. Do not require both physical speeds simultaneously.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-004","title":"Complete weather DTI /","profile":"disputed-units","source":"APRS101 pp. 27, 65-66; FAP weather.go","packet":"N0CALL>APRS:/092345z4903.50N/07201.75W_220/004g005t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"note":"Assert raw wind speed and the chosen unit profile. Do not require both physical speeds simultaneously.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-005","title":"Complete weather DTI @","profile":"disputed-units","source":"APRS101 pp. 27, 65-66; FAP weather.go","packet":"N0CALL>APRS:@092345z4903.50N/07201.75W_220/004g005t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"note":"Assert raw wind speed and the chosen unit profile. Do not require both physical speeds simultaneously.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-006","title":"Temperature -99","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c000s000g000t-99","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":0,"wind_speed_mph":0,"wind_speed_mps":0.0,"gust_mph":0,"gust_mps":0.0,"temperature_f":-99,"temperature_c":-72.777777777778}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0,"unit":"mph"},"gust":{"value":0,"unit":"mph"},"temperature":{"value":-99,"unit":"fahrenheit"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-007","title":"Temperature -07","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c000s000g000t-07","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":0,"wind_speed_mph":0,"wind_speed_mps":0.0,"gust_mph":0,"gust_mps":0.0,"temperature_f":-7,"temperature_c":-21.666666666667}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0,"unit":"mph"},"gust":{"value":0,"unit":"mph"},"temperature":{"value":-7,"unit":"fahrenheit"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-008","title":"Temperature 000","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c000s000g000t000","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":0,"wind_speed_mph":0,"wind_speed_mps":0.0,"gust_mph":0,"gust_mps":0.0,"temperature_f":0,"temperature_c":-17.777777777778}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0,"unit":"mph"},"gust":{"value":0,"unit":"mph"},"temperature":{"value":0,"unit":"fahrenheit"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-009","title":"Temperature 032","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c000s000g000t032","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":0,"wind_speed_mph":0,"wind_speed_mps":0.0,"gust_mph":0,"gust_mps":0.0,"temperature_f":32,"temperature_c":0.0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0,"unit":"mph"},"gust":{"value":0,"unit":"mph"},"temperature":{"value":32,"unit":"fahrenheit"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-010","title":"Temperature 077","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c000s000g000t077","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":0,"wind_speed_mph":0,"wind_speed_mps":0.0,"gust_mph":0,"gust_mps":0.0,"temperature_f":77,"temperature_c":25.0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0,"unit":"mph"},"gust":{"value":0,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-011","title":"Temperature 999","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c000s000g000t999","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":0,"wind_speed_mph":0,"wind_speed_mps":0.0,"gust_mph":0,"gust_mps":0.0,"temperature_f":999,"temperature_c":537.222222222222}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":0,"unit":"degrees"},"wind_speed":{"value":0,"unit":"mph"},"gust":{"value":0,"unit":"mph"},"temperature":{"value":999,"unit":"fahrenheit"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-012","title":"Humidity '00'","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c220s004g005t077h00","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"humidity_percent":100}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":100,"unit":"percent"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-013","title":"Humidity '01'","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c220s004g005t077h01","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"humidity_percent":1}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":1,"unit":"percent"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-014","title":"Humidity '99'","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c220s004g005t077h99","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"humidity_percent":99}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":99,"unit":"percent"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-015","title":"Humidity '..'","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c220s004g005t077h..","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"humidity_percent":null}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":null,"unit":"percent"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-016","title":"Humidity ' '","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c220s004g005t077h ","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"humidity_percent":null}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":null,"unit":"percent"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-017","title":"Missing c via '.'","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c...s004g005t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":null,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":null,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-018","title":"Missing c via ' '","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c s004g005t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":null,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":null,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-019","title":"Missing s via '.'","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s...g005t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":null,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":null,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c"]} +{"id":"WX-020","title":"Missing s via ' '","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s g005t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":null,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":null,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c"]} +{"id":"WX-021","title":"Missing g via '.'","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g...t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":null,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":null,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-022","title":"Missing g via ' '","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":null,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":null,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-023","title":"Missing t via '.'","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t...r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":null,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":null,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.wind_speed_mps"]} +{"id":"WX-024","title":"Missing t via ' '","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":null,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":null,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.wind_speed_mps"]} +{"id":"WX-025","title":"Missing r via '.'","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077r...p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":null,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":null,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-026","title":"Missing r via ' '","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077r p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":null,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":null,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-027","title":"Missing p via '.'","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077r001p...P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":null,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":null,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-028","title":"Missing p via ' '","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077r001p P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":null,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":null,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-029","title":"Missing P via '.'","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077r001p025P...h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":null,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":null,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-030","title":"Missing P via ' '","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077r001p025P h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":null,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":null,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-031","title":"Missing h via '.'","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077r001p025P012h..b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":null,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":null,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-032","title":"Missing h via ' '","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077r001p025P012h b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":null,"pressure_tenth_hpa":9900,"pressure_hpa":990.0}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":null,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-033","title":"Missing b via '.'","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077r001p025P012h50b.....","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":null}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-034","title":"Missing b via ' '","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077r001p025P012h50b ","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":null}},"note":"An unavailable measurement is null, not zero; later fields must still decode.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-035","title":"Optional field [('L', '000')]","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077L000","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"luminosity_w_m2":0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"luminosity":{"value":0,"unit":"W/m2"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-036","title":"Optional field [('L', '999')]","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077L999","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"luminosity_w_m2":999}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"luminosity":{"value":999,"unit":"W/m2"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-037","title":"Optional field [('l', '000')]","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077l000","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"luminosity_w_m2":1000}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"luminosity":{"value":1000,"unit":"W/m2"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-038","title":"Optional field [('l', '123')]","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077l123","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"luminosity_w_m2":1123}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"luminosity":{"value":1123,"unit":"W/m2"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-039","title":"Optional field [('l', '999')]","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077l999","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"luminosity_w_m2":1999}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"luminosity":{"value":1999,"unit":"W/m2"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-040","title":"Optional field [('#', '456')]","profile":"core-1.1","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:_10090556c220s004g005t077#456","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_counter_raw":456}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"rain_counter":{"value":456,"unit":"count"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-041","title":"Snow in complete weather 001","profile":"disputed-units","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:@092345z4903.50N/07201.75W_220/004g005t032s001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":32,"temperature_c":0.0,"snow_24h_inches":1,"snow_24h_mm":25.4,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"note":"Here lowercase s is snowfall. Positionless s is wind speed. The addendum inconsistently prints uppercase S in some snow examples; see ambiguity register.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":32,"unit":"fahrenheit"},"snow_24h":{"value":1,"unit":"inches"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw","$.weather.gust_mps","$.weather.snow_24h_mm","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-042","title":"Snow in complete weather 1.5","profile":"disputed-units","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:@092345z4903.50N/07201.75W_220/004g005t032s1.5","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":32,"temperature_c":0.0,"snow_24h_inches":1.5,"snow_24h_mm":38.1,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"note":"Here lowercase s is snowfall. Positionless s is wind speed. The addendum inconsistently prints uppercase S in some snow examples; see ambiguity register.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":32,"unit":"fahrenheit"},"snow_24h":{"value":1.5,"unit":"inches"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw","$.weather.gust_mps","$.weather.snow_24h_mm","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-043","title":"Snow in complete weather 010","profile":"disputed-units","source":"APRS101 p. 64; A11 WX","packet":"N0CALL>APRS:@092345z4903.50N/07201.75W_220/004g005t032s010","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":32,"temperature_c":0.0,"snow_24h_inches":10,"snow_24h_mm":254.0,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"note":"Here lowercase s is snowfall. Positionless s is wind speed. The addendum inconsistently prints uppercase S in some snow examples; see ambiguity register.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":32,"unit":"fahrenheit"},"snow_24h":{"value":10,"unit":"inches"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw","$.weather.gust_mps","$.weather.snow_24h_mm","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-044","title":"Optional weather order / omission 5","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c220s004g005t077b10132h00P012p025r001","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"pressure_tenth_hpa":10132,"pressure_hpa":1013.2,"humidity_percent":100,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":100,"unit":"percent"},"pressure":{"value":1013.2,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-045","title":"Optional weather order / omission 1","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c220s004g005t077r000","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":0,"rain_1h_mm":0.0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"rain_1h":{"value":0.0,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.rain_1h_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-046","title":"Optional weather order / omission 0","profile":"core-1.1","source":"APRS101 p. 64","packet":"N0CALL>APRS:_10090556c220s004g005t077","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-047","title":"Weather symbol /_","profile":"disputed-units","source":"APRS101 pp. 62,65; A11 WX","packet":"N0CALL>APRS:@092345z4903.50N/07201.75W_220/004g005t077","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-048","title":"Weather symbol \\_","profile":"disputed-units","source":"APRS101 pp. 62,65; A11 WX","packet":"N0CALL>APRS:@092345z4903.50N\\07201.75W_220/004g005t077","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"_","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"_"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-049","title":"Weather symbol /W","profile":"disputed-units","source":"APRS101 pp. 62,65; A11 WX","packet":"N0CALL>APRS:@092345z4903.50N/07201.75WW220/004g005t077","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"W","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"W"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-050","title":"Weather symbol \\W","profile":"disputed-units","source":"APRS101 pp. 62,65; A11 WX","packet":"N0CALL>APRS:@092345z4903.50N\\07201.75WW220/004g005t077","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"W","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"W"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-051","title":"Compressed weather wind belongs to weather","profile":"core-1.1","source":"APRS101 pp. 39,66","packet":"N0CALL>APRS:=/5L!!<*e7_7P[g005t077","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":true,"format":"compressed","position":{"latitude_deg":49.5,"longitude_deg":-72.750003937773},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"compression":{"csT_raw":"7P[","type_value":58,"fix":"current","nmea_source":"RMC","origin_code":2},"weather":{"wind_direction_deg":88,"wind_speed_knots":36.232012168838,"wind_speed_mps":18.639357371302,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25},"comment":""},"note":"The cs bytes represent wind, not station motion. FAP retains them in its movement fields; do not copy that schema into the semantic assertion.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":true,"latitude_deg":49.5,"longitude_deg":-72.750003937773,"symbol":{"table_id":"/","code":"_"},"compression":{"fix":"current","nmea_source":"RMC","origin_code":2,"raw":"7P["},"extensions":{"weather":{"wind_direction":{"value":88,"unit":"degrees"},"wind_speed":{"value":36.232012168838,"unit":"knots"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"}}}}},"unmapped":["$.compression.type_value","$.symbol.overlay","$.symbol.table","$.weather.gust_mps","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-052","title":"Weather-bearing object","profile":"disputed-units","source":"APRS101 pp. 58,66","packet":"N0CALL>APRS:;WX-SITE *092345z4903.50N/07201.75W_220/004g005t077r001p025P012h50b09900","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"weather":{"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_1h_hundredth_in":1,"rain_1h_mm":0.254,"rain_24h_hundredth_in":25,"rain_24h_mm":6.35,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"humidity_percent":50,"pressure_tenth_hpa":9900,"pressure_hpa":990.0,"wind_direction_deg":220,"wind_speed_raw":4,"wind_speed_mps_interpretations":{"APRS101_p27_knots":2.057777777778,"FAP_mph":1.78816}},"name":"WX-SITE","name_raw":"WX-SITE ","alive":true},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"WX-SITE","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"weather":{"wind_direction":{"value":220,"unit":"degrees"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"humidity":{"value":50,"unit":"percent"},"pressure":{"value":990.0,"unit":"hPa"},"rain_1h":{"value":0.01,"unit":"inches"},"rain_24h":{"value":0.25,"unit":"inches"},"rain_since_midnight":{"value":0.12,"unit":"inches"},"wind_speed":{"value":4,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw","$.weather.gust_mps","$.weather.pressure_tenth_hpa","$.weather.rain_1h_mm","$.weather.rain_24h_mm","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps_interpretations.APRS101_p27_knots","$.weather.wind_speed_mps_interpretations.FAP_mph"]} +{"id":"WX-053","title":"Storm HC predicted=False","profile":"core-1.1","source":"APRS101 p. 67","packet":"N0CALL>APRS:;STORM *092345z4903.50N\\07201.75W@088/036/HC/150^200/0980>090&030%040","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"STORM","name_raw":"STORM ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"@","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"storm":{"type":"hurricane","predicted":false,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"STORM","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"@"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"storm":{"kind":"HC","predicted":false,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}}}},"unmapped":["$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"WX-054","title":"Storm HC predicted=True","profile":"core-1.1","source":"APRS101 p. 67","packet":"N0CALL>APRS:;STORM *092345z4903.50N/07201.75W@088/036/HC/150^200/0980>090&030%040","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"STORM","name_raw":"STORM ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"@","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"storm":{"type":"hurricane","predicted":true,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"STORM","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"@"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"storm":{"kind":"HC","predicted":true,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}}}},"unmapped":["$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"WX-055","title":"Storm TS predicted=False","profile":"core-1.1","source":"APRS101 p. 67","packet":"N0CALL>APRS:;STORM *092345z4903.50N\\07201.75W@088/036/TS/150^200/0980>090&030%040","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"STORM","name_raw":"STORM ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"@","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"storm":{"type":"tropical-storm","predicted":false,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"STORM","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"@"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"storm":{"kind":"TS","predicted":false,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}}}},"unmapped":["$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"WX-056","title":"Storm TS predicted=True","profile":"core-1.1","source":"APRS101 p. 67","packet":"N0CALL>APRS:;STORM *092345z4903.50N/07201.75W@088/036/TS/150^200/0980>090&030%040","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"STORM","name_raw":"STORM ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"@","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"storm":{"type":"tropical-storm","predicted":true,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"STORM","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"@"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"storm":{"kind":"TS","predicted":true,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}}}},"unmapped":["$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"WX-057","title":"Storm TD predicted=False","profile":"core-1.1","source":"APRS101 p. 67","packet":"N0CALL>APRS:;STORM *092345z4903.50N\\07201.75W@088/036/TD/150^200/0980>090&030%040","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"STORM","name_raw":"STORM ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"@","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"storm":{"type":"tropical-depression","predicted":false,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"STORM","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"@"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"storm":{"kind":"TD","predicted":false,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}}}},"unmapped":["$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"WX-058","title":"Storm TD predicted=True","profile":"core-1.1","source":"APRS101 p. 67","packet":"N0CALL>APRS:;STORM *092345z4903.50N/07201.75W@088/036/TD/150^200/0980>090&030%040","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"STORM","name_raw":"STORM ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"@","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"storm":{"type":"tropical-depression","predicted":true,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"STORM","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"@"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"storm":{"kind":"TD","predicted":true,"sustained_wind_knots":150,"peak_gust_knots":200,"central_pressure_hpa":980,"hurricane_radius_nm":90,"tropical_storm_radius_nm":30,"whole_gale_radius_nm":40}}}},"unmapped":["$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"WX-059","title":"Storm without optional whole-gale radius","profile":"core-1.1","source":"APRS101 p. 67","packet":"N0CALL>APRS:;STORM *092345z4903.50N\\07201.75W@088/036/TS/060^080/0990>000&030","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"object","name":"STORM","name_raw":"STORM ","alive":true,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"\\","table":"alternate","code":"@","overlay":null},"comment":"","timestamp":{"raw":"092345z","format":"DHM","zone":"UTC","day":9,"hour":23,"minute":45},"motion":{"course_deg":88,"speed_knots":36,"speed_kmh":66.672},"storm":{"type":"tropical-storm","predicted":false,"sustained_wind_knots":60,"peak_gust_knots":80,"central_pressure_hpa":990,"hurricane_radius_nm":0,"tropical_storm_radius_nm":30}},"expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"object","comment":"","name":"STORM","alive":true,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"\\","code":"@"},"timestamp":{"kind":"dhm_utc","day":9,"hour":23,"minute":45},"extensions":{"motion":{"course_deg":88,"speed_knots":36},"storm":{"kind":"TS","predicted":false,"sustained_wind_knots":60,"peak_gust_knots":80,"central_pressure_hpa":990,"hurricane_radius_nm":0,"tropical_storm_radius_nm":30}}}},"unmapped":["$.motion.speed_kmh","$.name_raw","$.symbol.overlay","$.symbol.table","$.timestamp.raw"]} +{"id":"WX-060","title":"Unavailable complete-weather wind '000/000'","profile":"disputed-zero","source":"APRS101 p.27; A11 WX","packet":"N0CALL>APRS:!4903.50N/07201.75W_000/000g...t...","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","weather":{"wind_raw":"000/000","wind_direction_deg":null,"wind_speed_raw":null,"gust_mph":null,"temperature_f":null}},"note":"The PDF permits 000/000 as unknown; receivers also use numeric zero for measured calm. Do not collapse missing markers into measured calm. Select a policy for the all-zero pair.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"wind_direction":{"value":null,"unit":"degrees"},"gust":{"value":null,"unit":"mph"},"temperature":{"value":null,"unit":"fahrenheit"},"wind_speed":{"value":null,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.weather.wind_raw"]} +{"id":"WX-061","title":"Unavailable complete-weather wind '.../...'","profile":"core-1.1","source":"APRS101 p.27; A11 WX","packet":"N0CALL>APRS:!4903.50N/07201.75W_.../...g...t...","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","weather":{"wind_raw":".../...","wind_direction_deg":null,"wind_speed_raw":null,"gust_mph":null,"temperature_f":null}},"note":"The PDF permits 000/000 as unknown; receivers also use numeric zero for measured calm. Do not collapse missing markers into measured calm. Select a policy for the all-zero pair.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"wind_direction":{"value":null,"unit":"degrees"},"gust":{"value":null,"unit":"mph"},"temperature":{"value":null,"unit":"fahrenheit"},"wind_speed":{"value":null,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.weather.wind_raw"]} +{"id":"WX-062","title":"Unavailable complete-weather wind ' / '","profile":"core-1.1","source":"APRS101 p.27; A11 WX","packet":"N0CALL>APRS:!4903.50N/07201.75W_ / g...t...","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","messaging":false,"format":"uncompressed","position":{"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity_digits":0},"symbol":{"table_id_raw":"/","table":"primary","code":"_","overlay":null},"comment":"","weather":{"wind_raw":" / ","wind_direction_deg":null,"wind_speed_raw":null,"gust_mph":null,"temperature_f":null}},"note":"The PDF permits 000/000 as unknown; receivers also use numeric zero for measured calm. Do not collapse missing markers into measured calm. Select a policy for the all-zero pair.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"position","comment":"","messaging":false,"latitude_deg":49.058333333333,"longitude_deg":-72.029166666667,"ambiguity":0,"symbol":{"table_id":"/","code":"_"},"extensions":{"weather":{"wind_direction":{"value":null,"unit":"degrees"},"gust":{"value":null,"unit":"mph"},"temperature":{"value":null,"unit":"fahrenheit"},"wind_speed":{"value":null,"unit":"disputed_knots_or_mph"}}}}},"unmapped":["$.symbol.overlay","$.symbol.table","$.weather.wind_raw"]} +{"id":"WX-063","title":"Linked water-gauge field F20.1","profile":"linked-weather-extension","source":"A11 WX (2010 water-gauge addition)","packet":"N0CALL>APRS:_10090556c220s004g005t077F20.1","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"water_height":{"field":"F","raw":"20.1","value":20.1,"unit":"ft","meters":6.12648,"reference_datum":null}}},"note":"Four-character value; the packet does not identify the gauge datum. This is a later linked extension, kept separate from the historical 1.0/1.1 core.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"water_height":{"measurement":{"value":20.1,"unit":"feet"},"reference_datum":null}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.water_height.field","$.weather.water_height.meters","$.weather.water_height.raw","$.weather.wind_speed_mps"]} +{"id":"WX-064","title":"Linked water-gauge field F-1.2","profile":"linked-weather-extension","source":"A11 WX (2010 water-gauge addition)","packet":"N0CALL>APRS:_10090556c220s004g005t077F-1.2","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"water_height":{"field":"F","raw":"-1.2","value":-1.2,"unit":"ft","meters":-0.36576,"reference_datum":null}}},"note":"Four-character value; the packet does not identify the gauge datum. This is a later linked extension, kept separate from the historical 1.0/1.1 core.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"water_height":{"measurement":{"value":-1.2,"unit":"feet"},"reference_datum":null}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.water_height.field","$.weather.water_height.meters","$.weather.water_height.raw","$.weather.wind_speed_mps"]} +{"id":"WX-065","title":"Linked water-gauge field f20.1","profile":"linked-weather-extension","source":"A11 WX (2010 water-gauge addition)","packet":"N0CALL>APRS:_10090556c220s004g005t077f20.1","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"water_height":{"field":"f","raw":"20.1","value":20.1,"unit":"m","meters":20.1,"reference_datum":null}}},"note":"Four-character value; the packet does not identify the gauge datum. This is a later linked extension, kept separate from the historical 1.0/1.1 core.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"water_height":{"measurement":{"value":20.1,"unit":"meters"},"reference_datum":null}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.water_height.field","$.weather.water_height.meters","$.weather.water_height.raw","$.weather.wind_speed_mps"]} +{"id":"WX-066","title":"Linked water-gauge field f-1.2","profile":"linked-weather-extension","source":"A11 WX (2010 water-gauge addition)","packet":"N0CALL>APRS:_10090556c220s004g005t077f-1.2","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"water_height":{"field":"f","raw":"-1.2","value":-1.2,"unit":"m","meters":-1.2,"reference_datum":null}}},"note":"Four-character value; the packet does not identify the gauge datum. This is a later linked extension, kept separate from the historical 1.0/1.1 core.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"water_height":{"measurement":{"value":-1.2,"unit":"meters"},"reference_datum":null}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.temperature_c","$.weather.water_height.field","$.weather.water_height.meters","$.weather.water_height.raw","$.weather.wind_speed_mps"]} +{"id":"WX-067","title":"APRS101 rain-gauge example: trailing text as software/unit","profile":"core-1.1","source":"APRS101 pp. 63-64","packet":"N0CALL>APRS:_10090556c...s...g...t...P012Jim","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":null,"wind_speed_mph":null,"wind_speed_mps":null,"gust_mph":null,"gust_mps":null,"temperature_f":null,"temperature_c":null,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"software_code":"J","device_code":"im"}},"note":"The specification's own example. By the p.63 layout a report ends with the optional software code S (1 byte) and unit code uuuu (2-4 bytes), so the trailing 'Jim' is software 'J' and unit 'im'. The grammar cannot distinguish a short name from these codes.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"software_code":"J","device_code":"im","wind_direction":{"value":null,"unit":"degrees"},"wind_speed":{"value":null,"unit":"mph"},"gust":{"value":null,"unit":"mph"},"temperature":{"value":null,"unit":"fahrenheit"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-068","title":"Short trailing text reads as software/unit codes","profile":"core-1.1","source":"APRS101 p. 63","packet":"N0CALL>APRS:_10090556c220s004g005t077P012Home","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"software_code":"H","device_code":"ome"}},"note":"Unit codes are open-ended ('Users may specify any other 2-4 character code'), so any 3-5 trailing characters that end the report are read as S plus uuuu. Receivers must not reinterpret them as comment text.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"software_code":"H","device_code":"ome","wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]} +{"id":"WX-069","title":"Text after software/unit codes is comment","profile":"core-1.1","source":"APRS101 pp. 63-66","packet":"N0CALL>APRS:_10090556c220s004g005t077P012wRSW home","outcome":"accept","source_expected":{"header":{"source":"N0CALL","destination":"APRS","path":[]},"kind":"weather","timestamp":{"raw":"10090556","format":"MDHM","zone":"UTC","month":10,"day":9,"hour":5,"minute":56},"weather":{"wind_direction_deg":220,"wind_speed_mph":4,"wind_speed_mps":1.78816,"gust_mph":5,"gust_mps":2.2352,"temperature_f":77,"temperature_c":25.0,"rain_since_midnight_hundredth_in":12,"rain_since_midnight_mm":3.048,"software_code":null,"device_code":null},"comment":"wRSW home"},"note":"Every weather format ends with the optional S and uuuu codes; none defines a comment after them. Text that does not end the report as exactly those codes is retained as comment and no codes are inferred. Transmitters must not place a comment after the codes.","expected":{"type":"packet","header":{"source":"N0CALL","destination":"APRS","path":[]},"payload":{"type":"weather","comment":"wRSW home","timestamp":{"kind":"mdhm_utc","day":9,"month":10,"hour":5,"minute":56},"software_code":null,"device_code":null,"wind_direction":{"value":220,"unit":"degrees"},"wind_speed":{"value":4,"unit":"mph"},"gust":{"value":5,"unit":"mph"},"temperature":{"value":77,"unit":"fahrenheit"},"rain_since_midnight":{"value":0.12,"unit":"inches"}}},"unmapped":["$.timestamp.raw","$.weather.gust_mps","$.weather.rain_since_midnight_mm","$.weather.temperature_c","$.weather.wind_speed_mps"]}