From 41d282021f30ec821797fb3191fc91443ba8f7a0 Mon Sep 17 00:00:00 2001 From: Sherin Joseph Roy Date: Thu, 24 Sep 2026 00:34:23 +0530 Subject: [PATCH] feat: decode every standard NMEA 2000 PGN, checked against real frames NMEA 2000 coverage was thirteen hand-written single-frame PGNs and two fast packets, with 41 names. canboat (Apache 2.0) publishes definitions for nearly every PGN; tools/build_n2k_table.py distils the standard ones into a 133 kB table (216 PGNs, 1,433 fields, 125 lookups) that ships with the package and the binary, with canboat's licence beside it. The hand-written decoders keep precedence. Where both exist, they agree on every shared value across the real marine recording: 800 headings, 400 positions, 400 wind readings, rate of turn, COG and SOG, the GNSS fix after reassembly. Proprietary PGNs, which canboat defines once per manufacturer, are named as proprietary and not decoded; repeating groups (satellites, AIS slots) stop at the group, so one satellite's PRN is never shown as "the" PRN. Validity comes from the table's own ranges, so reserved, error and not-available codes are never readings, signed fields included (0x7FFF is not available; 0xFFFF is -1). Temperatures are converted from kelvin. The reassembler now reassembles all 122 standard fast-packet PGNs, not 13. On the marine log that adds five message types, and 21 of its 29 PGNs decode instead of 11. Found on the way: both decoders rounded every value to six places. That reported a rate of turn of -0.0001047 rad/s as -0.000105 and cut a 1e-7 degree position to ten centimetres. Values now round to their own resolution. --- README.md | 5 ++ canlab.spec | 2 + canlab/core/data/CANBOAT-NOTICE.txt | 40 +++++++++ canlab/core/data/n2k_pgns.json | 1 + canlab/core/j1939.py | 66 ++++++++++---- canlab/core/multiframe.py | 15 +++- canlab/core/n2k_db.py | 133 ++++++++++++++++++++++++++++ pyproject.toml | 2 +- tests/test_n2k_db.py | 123 +++++++++++++++++++++++++ tools/build_n2k_table.py | 128 ++++++++++++++++++++++++++ 10 files changed, 495 insertions(+), 20 deletions(-) create mode 100644 canlab/core/data/CANBOAT-NOTICE.txt create mode 100644 canlab/core/data/n2k_pgns.json create mode 100644 canlab/core/n2k_db.py create mode 100644 tests/test_n2k_db.py create mode 100644 tools/build_n2k_table.py diff --git a/README.md b/README.md index b0c9bc3..1ca9a20 100644 --- a/README.md +++ b/README.md @@ -907,6 +907,11 @@ scale snapping, are adapted from CSS Electronics' (MIT). The OEM checksum algorithms in `core/checksums.py` follow [commaai/opendbc](https://github.com/commaai/opendbc) (MIT). +The NMEA 2000 definitions in `canlab/core/data/n2k_pgns.json` are distilled +from [CANboat](https://github.com/canboat/canboat) (Apache License 2.0, Kees +Verruijt) by `tools/build_n2k_table.py`; the licence and the changes made are +in `canlab/core/data/CANBOAT-NOTICE.txt`. + The SNIFFER tab and its notch, the capture splitter and the GVRET protocol follow [SavvyCAN](https://github.com/collin80/SavvyCAN) (MIT), whose sniffer window and Bisector are the originals and whose source documents the GVRET diff --git a/canlab.spec b/canlab.spec index d2cb1e5..4fce780 100644 --- a/canlab.spec +++ b/canlab.spec @@ -20,6 +20,8 @@ a = Analysis( (str(ROOT / "canlab.png"), "canlab" ), (str(ROOT / "assets"), "canlab/assets" ), (str(ROOT / "sample_data"), "canlab/sample_data" ), + # the NMEA 2000 table distilled from canboat, and its licence notice + (str(ROOT / "core" / "data"), "canlab/core/data" ), *pil_datas, ], hiddenimports=[ diff --git a/canlab/core/data/CANBOAT-NOTICE.txt b/canlab/core/data/CANBOAT-NOTICE.txt new file mode 100644 index 0000000..f448579 --- /dev/null +++ b/canlab/core/data/CANBOAT-NOTICE.txt @@ -0,0 +1,40 @@ +canlab/core/data/n2k_pgns.json is derived from docs/canboat.json in +CANboat, https://github.com/canboat/canboat + +CANboat version v8.2.1 + +(C) 2009-2026, Kees Verruijt, Harlingen, The Netherlands. +For more information see https://github.com/canboat/canboat + +This file is part of CANboat. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + + + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Changes: kept each standard PGN's name, frame type and fixed-position +fields, and the lookup tables those fields use; dropped proprietary +PGNs and fields whose position depends on earlier variable-length data. diff --git a/canlab/core/data/n2k_pgns.json b/canlab/core/data/n2k_pgns.json new file mode 100644 index 0000000..24b3d74 --- /dev/null +++ b/canlab/core/data/n2k_pgns.json @@ -0,0 +1 @@ +{"source":"canboat 8.2.1","licence":"Apache-2.0, see CANBOAT-NOTICE.txt","pgns":{"59904":{"name":"ISO Request","fast":false,"fields":[["PGN",0,24,1,false,"","PGN",0,262143,0,""]]},"60160":{"name":"ISO Transport Protocol, Data Transfer","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""]]},"60928":{"name":"ISO Address Claim","fast":false,"fields":[["Unique Number",0,21,1,false,"","NUMBER",0,2097148,0,""],["Manufacturer Code",21,11,1,false,"","LOOKUP",0,2044,0,"MANUFACTURER_CODE"],["Device Instance Lower",32,3,1,false,"","NUMBER",0,7,0,""],["Device Instance Upper",35,5,1,false,"","NUMBER",0,31,0,""],["Device Function",40,8,1,false,"","INDIRECT_LOOKUP",0,252,0,""],["Device Class",49,7,1,false,"","LOOKUP",0,125,0,"DEVICE_CLASS"],["System Instance",56,4,1,false,"","NUMBER",0,13,0,""],["Industry Group",60,3,1,false,"","LOOKUP",0,6,0,"INDUSTRY_CODE"],["Arbitrary address capable",63,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"]]},"61440":{"name":"0xF000-0xFEFF: Standardized single-frame non-addressed","fast":false,"fields":[["Manufacturer Code",0,11,1,false,"","LOOKUP",0,2044,0,"MANUFACTURER_CODE"],["Industry Code",13,3,1,false,"","LOOKUP",0,6,0,"INDUSTRY_CODE"]]},"65001":{"name":"Bus #1 Phase C Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""]]},"65002":{"name":"Bus #1 Phase B Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""]]},"65003":{"name":"Bus #1 Phase A Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""]]},"65004":{"name":"Bus #1 Average Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""]]},"65005":{"name":"Utility Total AC Energy","fast":false,"fields":[["Total Energy Export",0,32,1,false,"kWh","NUMBER",0,4294967292,0,""],["Total Energy Import",32,32,1,false,"kWh","NUMBER",0,4294967292,0,""]]},"65006":{"name":"Utility Phase C AC Reactive Power","fast":false,"fields":[["Reactive Power",0,16,1,false,"VAR","NUMBER",0,65532,0,""],["Power factor",16,16,6.103515625e-05,false,"Cos Phi","NUMBER",0,3.999755859375,0,""],["Power Factor Lagging",32,2,1,false,"","LOOKUP",0,2,0,"POWER_FACTOR"]]},"65007":{"name":"Utility Phase C AC Power","fast":false,"fields":[["Real Power",0,32,1,true,"W","NUMBER",-2000000000,2294967292,-2000000000,""],["Apparent Power",32,32,1,true,"VA","NUMBER",-2000000000,2294967292,-2000000000,""]]},"65008":{"name":"Utility Phase C Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""],["AC RMS Current",48,16,1,false,"A","NUMBER",0,65532,0,""]]},"65009":{"name":"Utility Phase B AC Reactive Power","fast":false,"fields":[["Reactive Power",0,16,1,false,"VAR","NUMBER",0,65532,0,""],["Power factor",16,16,6.103515625e-05,false,"Cos Phi","NUMBER",0,3.999755859375,0,""],["Power Factor Lagging",32,2,1,false,"","LOOKUP",0,2,0,"POWER_FACTOR"]]},"65010":{"name":"Utility Phase B AC Power","fast":false,"fields":[["Real Power",0,32,1,true,"W","NUMBER",-2000000000,2294967292,-2000000000,""],["Apparent Power",32,32,1,true,"VA","NUMBER",-2000000000,2294967292,-2000000000,""]]},"65011":{"name":"Utility Phase B Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""],["AC RMS Current",48,16,1,false,"A","NUMBER",0,65532,0,""]]},"65012":{"name":"Utility Phase A AC Reactive Power","fast":false,"fields":[["Reactive Power",0,32,1,true,"VAR","NUMBER",-2000000000,2294967292,-2000000000,""],["Power factor",32,16,6.103515625e-05,false,"Cos Phi","NUMBER",0,3.999755859375,0,""],["Power Factor Lagging",48,2,1,false,"","LOOKUP",0,2,0,"POWER_FACTOR"]]},"65013":{"name":"Utility Phase A AC Power","fast":false,"fields":[["Real Power",0,32,1,true,"W","NUMBER",-2000000000,2294967292,-2000000000,""],["Apparent Power",32,32,1,true,"VA","NUMBER",-2000000000,2294967292,-2000000000,""]]},"65014":{"name":"Utility Phase A Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""],["AC RMS Current",48,16,1,false,"A","NUMBER",0,65532,0,""]]},"65015":{"name":"Utility Total AC Reactive Power","fast":false,"fields":[["Reactive Power",0,32,1,true,"VAR","NUMBER",-2000000000,2294967292,-2000000000,""],["Power factor",32,16,6.103515625e-05,false,"Cos Phi","NUMBER",0,3.999755859375,0,""],["Power Factor Lagging",48,2,1,false,"","LOOKUP",0,2,0,"POWER_FACTOR"]]},"65016":{"name":"Utility Total AC Power","fast":false,"fields":[["Real Power",0,32,1,true,"W","NUMBER",-2000000000,2294967292,-2000000000,""],["Apparent Power",32,32,1,true,"VA","NUMBER",-2000000000,2294967292,-2000000000,""]]},"65017":{"name":"Utility Average Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""],["AC RMS Current",48,16,1,false,"A","NUMBER",0,65532,0,""]]},"65018":{"name":"Generator Total AC Energy","fast":false,"fields":[["Total Energy Export",0,32,1,false,"kWh","NUMBER",0,4294967292,0,""],["Total Energy Import",32,32,1,false,"kWh","NUMBER",0,4294967292,0,""]]},"65019":{"name":"Generator Phase C AC Reactive Power","fast":false,"fields":[["Reactive Power",0,32,1,true,"VAR","NUMBER",-2000000000,2294967292,-2000000000,""],["Power factor",32,16,6.103515625e-05,false,"Cos Phi","NUMBER",0,3.999755859375,0,""],["Power Factor Lagging",48,2,1,false,"","LOOKUP",0,2,0,"POWER_FACTOR"]]},"65020":{"name":"Generator Phase C AC Power","fast":false,"fields":[["Real Power",0,32,1,true,"W","NUMBER",-2000000000,2294967292,-2000000000,""],["Apparent Power",32,32,1,true,"VA","NUMBER",-2000000000,2294967292,-2000000000,""]]},"65021":{"name":"Generator Phase C Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""],["AC RMS Current",48,16,1,false,"A","NUMBER",0,65532,0,""]]},"65022":{"name":"Generator Phase B AC Reactive Power","fast":false,"fields":[["Reactive Power",0,32,1,true,"VAR","NUMBER",-2000000000,2294967292,-2000000000,""],["Power factor",32,16,6.103515625e-05,false,"Cos Phi","NUMBER",0,3.999755859375,0,""],["Power Factor Lagging",48,2,1,false,"","LOOKUP",0,2,0,"POWER_FACTOR"]]},"65023":{"name":"Generator Phase B AC Power","fast":false,"fields":[["Real Power",0,32,1,true,"W","NUMBER",-2000000000,2294967292,-2000000000,""],["Apparent Power",32,32,1,true,"VA","NUMBER",-2000000000,2294967292,-2000000000,""]]},"65024":{"name":"Generator Phase B Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""],["AC RMS Current",48,16,1,false,"A","NUMBER",0,65532,0,""]]},"65025":{"name":"Generator Phase A AC Reactive Power","fast":false,"fields":[["Reactive Power",0,32,1,true,"VAR","NUMBER",-2000000000,2294967292,-2000000000,""],["Power factor",32,16,6.103515625e-05,false,"Cos Phi","NUMBER",0,3.999755859375,0,""],["Power Factor Lagging",48,2,1,false,"","LOOKUP",0,2,0,"POWER_FACTOR"]]},"65026":{"name":"Generator Phase A AC Power","fast":false,"fields":[["Real Power",0,32,1,true,"W","NUMBER",-2000000000,2294967292,-2000000000,""],["Apparent Power",32,32,1,true,"VA","NUMBER",-2000000000,2294967292,-2000000000,""]]},"65027":{"name":"Generator Phase A Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""],["AC RMS Current",48,16,1,false,"A","NUMBER",0,65532,0,""]]},"65028":{"name":"Generator Total AC Reactive Power","fast":false,"fields":[["Reactive Power",0,32,1,true,"VAR","NUMBER",-2000000000,2294967292,-2000000000,""],["Power factor",32,16,6.103515625e-05,false,"Cos Phi","NUMBER",0,3.999755859375,0,""],["Power Factor Lagging",48,2,1,false,"","LOOKUP",0,2,0,"POWER_FACTOR"]]},"65029":{"name":"Generator Total AC Power","fast":false,"fields":[["Real Power",0,32,1,true,"W","NUMBER",-2000000000,2294967292,-2000000000,""],["Apparent Power",32,32,1,true,"VA","NUMBER",-2000000000,2294967292,-2000000000,""]]},"65030":{"name":"Generator Average Basic AC Quantities","fast":false,"fields":[["Line-Line AC RMS Voltage",0,16,1,false,"V","NUMBER",0,65532,0,""],["Line-Neutral AC RMS Voltage",16,16,1,false,"V","NUMBER",0,65532,0,""],["AC Frequency",32,16,0.0078125,false,"Hz","NUMBER",0,511.96875,0,""],["AC RMS Current",48,16,1,false,"A","NUMBER",0,65532,0,""]]},"126464":{"name":"PGN List (Transmit and Receive)","fast":true,"fields":[["Function Code",0,8,1,false,"","LOOKUP",0,252,0,"PGN_LIST_FUNCTION"]]},"126983":{"name":"Alert","fast":true,"fields":[["Alert Type",0,4,1,false,"","LOOKUP",0,13,0,"ALERT_TYPE"],["Alert Category",4,4,1,false,"","LOOKUP",0,13,0,"ALERT_CATEGORY"],["Alert System",8,8,1,false,"","NUMBER",0,252,0,""],["Alert Sub-System",16,8,1,false,"","NUMBER",0,252,0,""],["Alert ID",24,16,1,false,"","NUMBER",0,65532,0,""],["Data Source Instance",104,8,1,false,"","NUMBER",0,252,0,""],["Data Source Index-Source",112,8,1,false,"","NUMBER",0,252,0,""],["Alert Occurrence Number",120,8,1,false,"","NUMBER",0,252,0,""],["Temporary Silence Status",128,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Acknowledge Status",129,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Escalation Status",130,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Temporary Silence Support",131,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Acknowledge Support",132,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Escalation Support",133,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Trigger Condition",200,4,1,false,"","LOOKUP",0,13,0,"ALERT_TRIGGER_CONDITION"],["Threshold Status",204,4,1,false,"","LOOKUP",0,13,0,"ALERT_THRESHOLD_STATUS"],["Alert Priority",208,8,1,false,"","NUMBER",0,252,0,""],["Alert State",216,8,1,false,"","LOOKUP",0,252,0,"ALERT_STATE"]]},"126984":{"name":"Alert Response","fast":true,"fields":[["Alert Type",0,4,1,false,"","LOOKUP",0,13,0,"ALERT_TYPE"],["Alert Category",4,4,1,false,"","LOOKUP",0,13,0,"ALERT_CATEGORY"],["Alert System",8,8,1,false,"","NUMBER",0,252,0,""],["Alert Sub-System",16,8,1,false,"","NUMBER",0,252,0,""],["Alert ID",24,16,1,false,"","NUMBER",0,65532,0,""],["Data Source Instance",104,8,1,false,"","NUMBER",0,252,0,""],["Data Source Index-Source",112,8,1,false,"","NUMBER",0,252,0,""],["Alert Occurrence Number",120,8,1,false,"","NUMBER",0,252,0,""],["Response Command",192,2,1,false,"","LOOKUP",0,3,0,"ALERT_RESPONSE_COMMAND"]]},"126985":{"name":"Alert Text","fast":true,"fields":[["Alert Type",0,4,1,false,"","LOOKUP",0,13,0,"ALERT_TYPE"],["Alert Category",4,4,1,false,"","LOOKUP",0,13,0,"ALERT_CATEGORY"],["Alert System",8,8,1,false,"","NUMBER",0,252,0,""],["Alert Sub-System",16,8,1,false,"","NUMBER",0,252,0,""],["Alert ID",24,16,1,false,"","NUMBER",0,65532,0,""],["Data Source Instance",104,8,1,false,"","NUMBER",0,252,0,""],["Data Source Index-Source",112,8,1,false,"","NUMBER",0,252,0,""],["Alert Occurrence Number",120,8,1,false,"","NUMBER",0,252,0,""],["Language ID",128,8,1,false,"","LOOKUP",0,252,0,"ALERT_LANGUAGE_ID"]]},"126986":{"name":"Alert Configuration","fast":true,"fields":[["Alert Type",0,4,1,false,"","LOOKUP",0,13,0,"ALERT_TYPE"],["Alert Category",4,4,1,false,"","LOOKUP",0,13,0,"ALERT_CATEGORY"],["Alert System",8,8,1,false,"","NUMBER",0,252,0,""],["Alert Sub-System",16,8,1,false,"","NUMBER",0,252,0,""],["Alert ID",24,16,1,false,"","NUMBER",0,65532,0,""],["Data Source Instance",104,8,1,false,"","NUMBER",0,252,0,""],["Data Source Index-Source",112,8,1,false,"","NUMBER",0,252,0,""],["Alert Occurrence Number",120,8,1,false,"","NUMBER",0,252,0,""],["Alert Control",128,2,1,false,"","NUMBER",0,2,0,""],["User Defined Alert Assignment",130,2,1,false,"","NUMBER",0,2,0,""],["Reactivation Period",136,8,1,false,"","NUMBER",0,252,0,""],["Temporary Silence Period",144,8,1,false,"","NUMBER",0,252,0,""],["Escalation Period",152,8,1,false,"","NUMBER",0,252,0,""]]},"126987":{"name":"Alert Threshold","fast":true,"fields":[["Alert Type",0,4,1,false,"","LOOKUP",0,13,0,"ALERT_TYPE"],["Alert Category",4,4,1,false,"","LOOKUP",0,13,0,"ALERT_CATEGORY"],["Alert System",8,8,1,false,"","NUMBER",0,252,0,""],["Alert Sub-System",16,8,1,false,"","NUMBER",0,252,0,""],["Alert ID",24,16,1,false,"","NUMBER",0,65532,0,""],["Data Source Instance",104,8,1,false,"","NUMBER",0,252,0,""],["Data Source Index-Source",112,8,1,false,"","NUMBER",0,252,0,""],["Alert Occurrence Number",120,8,1,false,"","NUMBER",0,252,0,""],["Number of Parameters",128,8,1,false,"","NUMBER",0,252,0,""]]},"126988":{"name":"Alert Value","fast":true,"fields":[["Alert Type",0,4,1,false,"","LOOKUP",0,13,0,"ALERT_TYPE"],["Alert Category",4,4,1,false,"","LOOKUP",0,13,0,"ALERT_CATEGORY"],["Alert System",8,8,1,false,"","NUMBER",0,252,0,""],["Alert Sub-System",16,8,1,false,"","NUMBER",0,252,0,""],["Alert ID",24,16,1,false,"","NUMBER",0,65532,0,""],["Data Source Instance",104,8,1,false,"","NUMBER",0,252,0,""],["Data Source Index-Source",112,8,1,false,"","NUMBER",0,252,0,""],["Alert Occurrence Number",120,8,1,false,"","NUMBER",0,252,0,""],["Number of Parameters",128,8,1,false,"","NUMBER",0,252,0,""]]},"126992":{"name":"System Time","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Source",8,4,1,false,"","LOOKUP",0,13,0,"SYSTEM_TIME"],["Date",16,16,1,false,"d","DATE",0,65532,0,""],["Time",32,32,0.0001,false,"s","TIME",0,86401,0,""]]},"126993":{"name":"Heartbeat","fast":false,"fields":[["Data transmit offset",0,16,0.001,false,"s","DURATION",0,65.532,0,""],["Sequence Counter",16,8,1,false,"","NUMBER",0,252,0,""],["Controller 1 State",24,2,1,false,"","LOOKUP",0,2,0,"CONTROLLER_STATE"],["Controller 2 State",26,2,1,false,"","LOOKUP",0,2,0,"CONTROLLER_STATE"],["Equipment Status",28,2,1,false,"","LOOKUP",0,2,0,"EQUIPMENT_STATUS"]]},"126996":{"name":"Product Information","fast":true,"fields":[["NMEA 2000 Version",0,16,0.001,false,"","NUMBER",0,65.532,0,""],["Product Code",16,16,1,false,"","NUMBER",0,65532,0,""],["Model ID",32,256,1,false,"","STRING_FIX",null,null,0,""],["Software Version Code",288,256,1,false,"","STRING_FIX",null,null,0,""],["Model Version",544,256,1,false,"","STRING_FIX",null,null,0,""],["Model Serial Code",800,256,1,false,"","STRING_FIX",null,null,0,""],["Certification Level",1056,8,1,false,"","LOOKUP",0,252,0,"CERTIFICATION_LEVEL"],["Load Equivalency",1064,8,1,false,"","NUMBER",0,252,0,""]]},"126998":{"name":"Configuration Information","fast":true,"fields":[]},"127233":{"name":"Man Overboard Notification","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["MOB Emitter ID",8,32,1,false,"","NUMBER",0,4294967292,0,""],["Man Overboard Status",40,3,1,false,"","LOOKUP",0,6,0,"MOB_STATUS"],["Activation Time",48,32,0.0001,false,"s","TIME",0,86401,0,""],["Position Source",80,3,1,false,"","LOOKUP",0,6,0,"MOB_POSITION_SOURCE"],["Position Date",88,16,1,false,"d","DATE",0,65532,0,""],["Position Time",104,32,0.0001,false,"s","TIME",0,86401,0,""],["Latitude",136,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Longitude",168,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["COG Reference",200,2,1,false,"","LOOKUP",0,2,0,"DIRECTION_REFERENCE"],["COG",208,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["SOG",224,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["MMSI of vessel of origin",240,32,1,false,"","MMSI",2000000,999999999,0,""],["MOB Emitter Battery Low Status",272,3,1,false,"","LOOKUP",0,6,0,"LOW_BATTERY"]]},"127237":{"name":"Heading/Track control","fast":true,"fields":[["Rudder Limit Exceeded",0,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Off-Heading Limit Exceeded",2,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Off-Track Limit Exceeded",4,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Override",6,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Steering Mode",8,3,1,false,"","LOOKUP",0,6,0,"STEERING_MODE"],["Turn Mode",11,3,1,false,"","LOOKUP",0,6,0,"TURN_MODE"],["Heading Reference",14,2,1,false,"","LOOKUP",0,2,0,"DIRECTION_REFERENCE"],["Commanded Rudder Direction",21,3,1,false,"","LOOKUP",0,6,0,"DIRECTION_RUDDER"],["Commanded Rudder Angle",24,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""],["Heading-To-Steer (Course)",40,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Track",56,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Rudder Limit",72,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Off-Heading Limit",88,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Radius of Turn Order",104,16,1,true,"m","NUMBER",-32767,32764,0,""],["Rate of Turn Order",120,16,3.125e-05,true,"rad/s","NUMBER",-1.02396875,1.023875,0,""],["Off-Track Limit",136,16,1,true,"m","NUMBER",-32767,32764,0,""],["Vessel Heading",152,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""]]},"127245":{"name":"Rudder","fast":false,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Direction Order",8,3,1,false,"","LOOKUP",0,6,0,"DIRECTION_RUDDER"],["Angle Order",16,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""],["Position",32,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""]]},"127250":{"name":"Vessel Heading","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Heading",8,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Deviation",24,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""],["Variation",40,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""],["Reference",56,2,1,false,"","LOOKUP",0,2,0,"DIRECTION_REFERENCE"]]},"127251":{"name":"Rate of Turn","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Rate",8,32,3.125e-08,true,"rad/s","NUMBER",-67.10886396875,67.108863875,0,""]]},"127252":{"name":"Heave","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Heave",8,16,0.01,true,"m","NUMBER",-327.67,327.64,0,""]]},"127257":{"name":"Attitude","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Yaw",8,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""],["Pitch",24,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""],["Roll",40,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""]]},"127258":{"name":"Magnetic Variation","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Source",8,4,1,false,"","LOOKUP",0,13,0,"MAGNETIC_VARIATION"],["Age of service",16,16,1,false,"d","DATE",0,65532,0,""],["Variation",32,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""]]},"127488":{"name":"Engine Parameters, Rapid Update","fast":false,"fields":[["Instance",0,8,1,false,"","LOOKUP",0,252,0,"ENGINE_INSTANCE"],["Speed",8,16,0.25,false,"rpm","NUMBER",0,16383,0,""],["Boost Pressure",24,16,100,false,"Pa","NUMBER",0,6553200,0,""],["Tilt/Trim",40,8,1,true,"%","NUMBER",-127,124,0,""]]},"127489":{"name":"Engine Parameters, Dynamic","fast":true,"fields":[["Instance",0,8,1,false,"","LOOKUP",0,252,0,"ENGINE_INSTANCE"],["Oil pressure",8,16,100,false,"Pa","NUMBER",0,6553200,0,""],["Oil temperature",24,16,0.1,false,"K","NUMBER",0,6553.2,0,""],["Temperature",40,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Alternator Potential",56,16,0.01,true,"V","NUMBER",-327.67,327.64,0,""],["Fuel Rate",72,16,0.1,true,"L/h","NUMBER",-3276.7,3276.4,0,""],["Total Engine hours",88,32,1,false,"s","DURATION",0,4294967292,0,""],["Coolant Pressure",120,16,100,false,"Pa","NUMBER",0,6553200,0,""],["Fuel Pressure",136,16,1000,false,"Pa","NUMBER",0,65532000,0,""],["Engine Load",192,8,1,true,"%","NUMBER",-127,124,0,""],["Engine Torque",200,8,1,true,"%","NUMBER",-127,124,0,""]]},"127490":{"name":"Electric Drive Status, Dynamic","fast":true,"fields":[["Inverter/Motor Identifier",0,8,1,false,"","NUMBER",0,252,0,""],["Operating Mode",8,4,1,false,"","NUMBER",0,13,0,""],["Motor Temperature",16,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Inverter Temperature",32,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Coolant Temperature",48,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Gear Temperature",64,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Shaft Torque",80,16,1,false,"","NUMBER",0,65532,0,""]]},"127491":{"name":"Electric Energy Storage Status, Dynamic","fast":true,"fields":[["Energy Storage Identifier",0,8,1,false,"","NUMBER",0,252,0,""],["State of Charge",8,8,1,false,"%","NUMBER",0,252,0,""],["Time Remaining",16,16,60,false,"s","DURATION",0,3931920,0,""],["Highest Cell Temperature",32,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Lowest Cell Temperature",48,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Average Cell Temperature",64,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Max Discharge Current",80,16,0.1,true,"A","NUMBER",-3276.7,3276.4,0,""],["Max Charge Current",96,16,0.1,true,"A","NUMBER",-3276.7,3276.4,0,""],["Cooling System Status",112,4,1,false,"","NUMBER",0,13,0,""],["Heating System Status",116,4,1,false,"","NUMBER",0,13,0,""]]},"127493":{"name":"Transmission Parameters, Dynamic","fast":false,"fields":[["Instance",0,8,1,false,"","LOOKUP",0,252,0,"ENGINE_INSTANCE"],["Transmission Gear",8,2,1,false,"","LOOKUP",0,2,0,"GEAR_STATUS"],["Oil pressure",16,16,100,false,"Pa","NUMBER",0,6553200,0,""],["Oil temperature",32,16,0.1,false,"K","NUMBER",0,6553.2,0,""]]},"127494":{"name":"Electric Drive Information","fast":true,"fields":[["Inverter/Motor Identifier",0,8,1,false,"","NUMBER",0,252,0,""],["Motor Type",8,4,1,false,"","NUMBER",0,13,0,""],["Motor Voltage Rating",16,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["Maximum Continuous Motor Power",32,32,1,false,"W","NUMBER",0,4294967292,0,""],["Maximum Boost Motor Power",64,32,1,false,"W","NUMBER",0,4294967292,0,""],["Maximum Motor Temperature Rating",96,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Rated Motor Speed",112,16,0.25,false,"rpm","NUMBER",0,16383,0,""],["Maximum Controller Temperature Rating",128,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Motor Shaft Torque Rating",144,16,1,false,"","NUMBER",0,65532,0,""],["Motor DC-Voltage Derating Threshold",160,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["Motor DC-Voltage Cut Off Threshold",176,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["Drive/Motor Hours",192,32,1,false,"s","DURATION",0,4294967292,0,""]]},"127495":{"name":"Electric Energy Storage Information","fast":true,"fields":[["Energy Storage Identifier",0,8,1,false,"","NUMBER",0,252,0,""],["Motor Type",8,4,1,false,"","NUMBER",0,13,0,""],["Storage Chemistry/Conversion",16,8,1,false,"","NUMBER",0,252,0,""],["Maximum Temperature Derating",24,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Maximum Temperature Shut Off",40,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Minimum Temperature Derating",56,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Minimum Temperature Shut Off",72,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Usable Battery Energy",88,32,1,false,"kWh","NUMBER",0,4294967292,0,""],["State of Health",120,8,1,false,"","NUMBER",0,252,0,""],["Battery Cycle Counter",128,16,1,false,"","NUMBER",0,65532,0,""],["Battery Full Status",144,2,1,false,"","NUMBER",0,2,0,""],["Battery Empty Status",146,2,1,false,"","NUMBER",0,2,0,""],["Maximum Charge (SOC)",152,8,1,false,"","NUMBER",0,252,0,""],["Minimum Charge (SOC)",160,8,1,false,"","NUMBER",0,252,0,""]]},"127496":{"name":"Trip Parameters, Vessel","fast":true,"fields":[["Time to Empty",0,32,0.001,false,"s","DURATION",0,4294967.292,0,""],["Distance to Empty",32,32,0.01,false,"m","NUMBER",0,42949672.92,0,""],["Estimated Fuel Remaining",64,16,1,false,"L","NUMBER",0,65532,0,""],["Trip Run Time",80,32,0.001,false,"s","DURATION",0,4294967.292,0,""]]},"127497":{"name":"Trip Parameters, Engine","fast":true,"fields":[["Instance",0,8,1,false,"","LOOKUP",0,252,0,"ENGINE_INSTANCE"],["Trip Fuel Used",8,16,1,false,"L","NUMBER",0,65532,0,""],["Fuel Rate, Average",24,16,0.1,true,"L/h","NUMBER",-3276.7,3276.4,0,""],["Fuel Rate, Economy",40,16,0.1,true,"L/h","NUMBER",-3276.7,3276.4,0,""],["Instantaneous Fuel Economy",56,16,0.1,true,"L/h","NUMBER",-3276.7,3276.4,0,""]]},"127498":{"name":"Engine Parameters, Static","fast":true,"fields":[["Instance",0,8,1,false,"","LOOKUP",0,252,0,"ENGINE_INSTANCE"],["Rated Engine Speed",8,16,0.25,false,"rpm","NUMBER",0,16383,0,""]]},"127500":{"name":"Load Controller Connection State/Control","fast":false,"fields":[["Sequence ID",0,8,1,false,"","NUMBER",0,252,0,""],["Connection ID",8,8,1,false,"","NUMBER",0,252,0,""],["State",16,8,1,false,"","NUMBER",0,252,0,""],["Status",24,8,1,false,"","NUMBER",0,252,0,""],["Operational Status & Control",32,8,1,false,"","NUMBER",0,252,0,""],["PWM Duty Cycle",40,8,1,false,"","NUMBER",0,252,0,""],["TimeON",48,8,1,false,"","NUMBER",0,252,0,""],["TimeOFF",56,8,1,false,"","NUMBER",0,252,0,""]]},"127501":{"name":"Binary Switch Bank Status","fast":false,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Indicator1",8,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator2",10,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator3",12,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator4",14,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator5",16,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator6",18,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator7",20,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator8",22,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator9",24,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator10",26,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator11",28,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator12",30,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator13",32,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator14",34,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator15",36,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator16",38,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator17",40,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator18",42,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator19",44,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator20",46,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator21",48,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator22",50,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator23",52,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator24",54,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator25",56,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator26",58,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator27",60,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Indicator28",62,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"]]},"127502":{"name":"Switch Bank Control","fast":false,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Switch1",8,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch2",10,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch3",12,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch4",14,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch5",16,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch6",18,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch7",20,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch8",22,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch9",24,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch10",26,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch11",28,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch12",30,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch13",32,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch14",34,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch15",36,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch16",38,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch17",40,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch18",42,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch19",44,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch20",46,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch21",48,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch22",50,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch23",52,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch24",54,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch25",56,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch26",58,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch27",60,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"],["Switch28",62,2,1,false,"","LOOKUP",0,3,0,"OFF_ON_CONTROL"]]},"127503":{"name":"AC Input Status","fast":true,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Number of Lines",8,8,1,false,"","NUMBER",0,252,0,""]]},"127504":{"name":"AC Output Status","fast":true,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Number of Lines",8,8,1,false,"","NUMBER",0,252,0,""]]},"127505":{"name":"Fluid Level","fast":false,"fields":[["Instance",0,4,1,false,"","NUMBER",0,13,0,""],["Type",4,4,1,false,"","LOOKUP",0,13,0,"TANK_TYPE"],["Level",8,16,0.004,true,"%","NUMBER",-131.068,131.056,0,""],["Capacity",24,32,0.1,false,"L","NUMBER",0,429496729.2,0,""]]},"127506":{"name":"DC Detailed Status","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Instance",8,8,1,false,"","NUMBER",0,252,0,""],["DC Type",16,8,1,false,"","LOOKUP",0,252,0,"DC_SOURCE"],["State of Charge",24,8,1,false,"%","NUMBER",0,252,0,""],["State of Health",32,8,1,false,"%","NUMBER",0,252,0,""],["Time Remaining",40,16,60,false,"s","DURATION",0,3931920,0,""],["Ripple Voltage",56,16,0.001,false,"V","NUMBER",0,65.532,0,""],["Remaining capacity",72,16,1,false,"Ah","NUMBER",0,65532,0,""]]},"127507":{"name":"Charger Status","fast":true,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Battery Instance",8,8,1,false,"","NUMBER",0,252,0,""],["Operating State",16,4,1,false,"","LOOKUP",0,13,0,"CHARGER_STATE"],["Charge Mode",20,4,1,false,"","LOOKUP",0,13,0,"CHARGER_MODE"],["Enabled",24,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Equalization Pending",26,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Equalization Time Remaining",32,16,60,false,"s","DURATION",0,3931920,0,""]]},"127508":{"name":"Battery Status","fast":false,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Voltage",8,16,0.01,true,"V","NUMBER",-327.67,327.64,0,""],["Current",24,16,0.1,true,"A","NUMBER",-3276.7,3276.4,0,""],["Temperature",40,16,0.01,false,"K","NUMBER",0,655.32,0,""],["SID",56,8,1,false,"","NUMBER",0,252,0,""]]},"127509":{"name":"Inverter Status","fast":true,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["AC Instance",8,8,1,false,"","NUMBER",0,252,0,""],["DC Instance",16,8,1,false,"","NUMBER",0,252,0,""],["Operating State",24,4,1,false,"","LOOKUP",0,13,0,"INVERTER_STATE"],["Inverter Enable",28,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"]]},"127510":{"name":"Charger Configuration Status","fast":true,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Battery Instance",8,8,1,false,"","NUMBER",0,252,0,""],["Charger Enable/Disable",16,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Charge Current Limit",24,8,1,false,"%","NUMBER",0,252,0,""],["Charging Algorithm",32,4,1,false,"","LOOKUP",0,13,0,"CHARGING_ALGORITHM"],["Charger Mode",36,4,1,false,"","LOOKUP",0,13,0,"CHARGER_MODE"],["Estimated Temperature",40,4,1,false,"","LOOKUP",0,13,0,"DEVICE_TEMP_STATE"],["Equalize One Time Enable/Disable",44,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Over Charge Enable/Disable",46,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Equalize Time",48,16,60,false,"s","DURATION",0,3931920,0,""]]},"127511":{"name":"Inverter Configuration Status","fast":true,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["AC Instance",8,8,1,false,"","NUMBER",0,252,0,""],["DC Instance",16,8,1,false,"","NUMBER",0,252,0,""],["Inverter Enable/Disable",24,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Inverter Mode",26,4,1,false,"","LOOKUP",0,13,0,"INVERTER_MODE"],["Load Sense Enable/Disable",30,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Load Sense Power Threshold",32,16,1,false,"W","NUMBER",0,65532,0,""],["Load Sense Interval",48,16,0.01,false,"s","DURATION",0,655.32,0,""]]},"127512":{"name":"AGS Configuration Status","fast":true,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Generator Instance",8,8,1,false,"","NUMBER",0,252,0,""],["AGS Mode",16,4,1,false,"","LOOKUP",0,13,0,"AGS_MODE"]]},"127513":{"name":"Battery Configuration Status","fast":true,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Battery Type",8,4,1,false,"","LOOKUP",0,13,0,"BATTERY_TYPE"],["Supports Equalization",12,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Nominal Voltage",16,4,1,false,"","LOOKUP",0,13,0,"BATTERY_VOLTAGE"],["Chemistry",20,4,1,false,"","LOOKUP",0,13,0,"BATTERY_CHEMISTRY"],["Capacity",24,16,1,false,"Ah","NUMBER",0,65532,0,""],["Temperature Coefficient",40,8,1,true,"%","NUMBER",-127,124,0,""],["Peukert Exponent",48,8,0.002,false,"","NUMBER",1,1.5,1,""],["Charge Efficiency Factor",56,8,1,true,"%","NUMBER",-127,124,0,""]]},"127514":{"name":"AGS Status","fast":true,"fields":[["Instance",0,8,1,false,"","NUMBER",0,252,0,""],["Generator Instance",8,8,1,false,"","NUMBER",0,252,0,""],["AGS Operating State",16,4,1,false,"","LOOKUP",0,13,0,"AGS_OPERATING_STATE"],["Generator State",20,4,1,false,"","LOOKUP",0,13,0,"AGS_GENERATING_STATE"],["Generator On Reason",24,8,1,false,"","LOOKUP",0,252,0,"AGS_ON_REASON"],["Generator Off Reason",32,8,1,false,"","LOOKUP",0,252,0,"AGS_OFF_REASON"]]},"127744":{"name":"AC Power / Current - Phase A","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Connection Number",8,8,1,false,"","NUMBER",0,252,0,""],["AC RMS Current",16,16,0.1,false,"A","NUMBER",0,6553.2,0,""],["Power",32,32,1,true,"W","NUMBER",-2147483647,2147483644,0,""]]},"127745":{"name":"AC Power / Current - Phase B","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Connection Number",8,8,1,false,"","NUMBER",0,252,0,""],["AC RMS Current",16,16,0.1,false,"A","NUMBER",0,6553.2,0,""],["Power",32,32,1,true,"W","NUMBER",-2147483647,2147483644,0,""]]},"127746":{"name":"AC Power / Current - Phase C","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Connection Number",8,8,1,false,"","NUMBER",0,252,0,""],["AC RMS Current",16,16,0.1,false,"A","NUMBER",0,6553.2,0,""],["Power",32,32,1,true,"W","NUMBER",-2147483647,2147483644,0,""]]},"127747":{"name":"AC Voltage / Frequency - Phase A","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Connection Number",8,8,1,false,"","NUMBER",0,252,0,""],["AC Voltage Line to Neutral",16,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["AC Voltage Line to Line",32,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["Frequency",48,16,0.1,false,"Hz","NUMBER",0,6553.2,0,""]]},"127748":{"name":"AC Voltage / Frequency - Phase B","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Connection Number",8,8,1,false,"","NUMBER",0,252,0,""],["AC Voltage Line to Neutral",16,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["AC Voltage Line to Line",32,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["Frequency",48,16,0.1,false,"Hz","NUMBER",0,6553.2,0,""]]},"127749":{"name":"AC Voltage / Frequency - Phase C","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Connection Number",8,8,1,false,"","NUMBER",0,252,0,""],["AC Voltage Line to Neutral",16,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["AC Voltage Line to Line",32,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["Frequency",48,16,0.1,false,"Hz","NUMBER",0,6553.2,0,""]]},"127750":{"name":"Converter Status","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Connection Number",8,8,1,false,"","NUMBER",0,252,0,""],["Operating State",16,8,1,false,"","LOOKUP",0,252,0,"CONVERTER_STATE"],["Temperature State",24,2,1,false,"","LOOKUP",0,2,0,"GOOD_WARNING_ERROR"],["Overload State",26,2,1,false,"","LOOKUP",0,2,0,"GOOD_WARNING_ERROR"],["Low DC Voltage State",28,2,1,false,"","LOOKUP",0,2,0,"GOOD_WARNING_ERROR"],["Ripple State",30,2,1,false,"","LOOKUP",0,2,0,"GOOD_WARNING_ERROR"]]},"127751":{"name":"DC Voltage/Current","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Connection Number",8,8,1,false,"","NUMBER",0,252,0,""],["DC Voltage",16,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["DC Current",32,24,0.01,true,"A","NUMBER",-83886.07,83886.04,0,""]]},"128000":{"name":"Leeway Angle","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Leeway Angle",8,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""]]},"128001":{"name":"Vessel Acceleration","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Longitudinal Acceleration",8,16,1,true,"","NUMBER",-32767,32764,0,""],["Transverse Acceleration",24,16,1,true,"","NUMBER",-32767,32764,0,""],["Vertical Acceleration",40,16,1,true,"","NUMBER",-32767,32764,0,""]]},"128002":{"name":"Electric Drive Status, Rapid Update","fast":false,"fields":[["Inverter/Motor Controller",0,8,1,false,"","NUMBER",0,252,0,""],["Active Motor Mode",8,2,1,false,"","NUMBER",0,2,0,""],["Brake Mode",10,2,1,false,"","NUMBER",0,2,0,""],["Rotational Shaft Speed",16,16,0.25,false,"rpm","NUMBER",0,16383,0,""],["Motor DC Voltage",32,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["Motor DC Current",48,16,0.1,true,"A","NUMBER",-3276.7,3276.4,0,""]]},"128003":{"name":"Electric Energy Storage Status, Rapid Update","fast":false,"fields":[["Energy Storage Identifier",0,8,1,false,"","NUMBER",0,252,0,""],["Battery Status",8,2,1,false,"","NUMBER",0,2,0,""],["Isolation Status",10,2,1,false,"","NUMBER",0,2,0,""],["Battery Error",12,4,1,false,"","NUMBER",0,13,0,""],["Battery Voltage",16,16,0.1,false,"V","NUMBER",0,6553.2,0,""],["Battery Current",32,16,0.1,true,"A","NUMBER",-3276.7,3276.4,0,""]]},"128006":{"name":"Thruster Control Status","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Identifier",8,8,1,false,"","NUMBER",0,252,0,""],["Direction Control",16,4,1,false,"","LOOKUP",0,13,0,"THRUSTER_DIRECTION_CONTROL"],["Power Enabled",20,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Retract Control",22,2,1,false,"","LOOKUP",0,2,0,"THRUSTER_RETRACT_CONTROL"],["Speed Control",24,8,1,false,"%","NUMBER",0,252,0,""],["Command Timeout",40,8,0.005,false,"s","DURATION",0,1.26,0,""],["Azimuth Control",48,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""]]},"128007":{"name":"Thruster Information","fast":false,"fields":[["Identifier",0,8,1,false,"","NUMBER",0,252,0,""],["Motor Type",8,4,1,false,"","LOOKUP",0,13,0,"THRUSTER_MOTOR_TYPE"],["Power Rating",16,16,1,false,"W","NUMBER",0,65532,0,""],["Maximum Temperature Rating",32,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Maximum Rotational Speed",48,16,0.25,false,"rpm","NUMBER",0,16383,0,""]]},"128008":{"name":"Thruster Motor Status","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Identifier",8,8,1,false,"","NUMBER",0,252,0,""],["Current",24,8,1,false,"A","NUMBER",0,252,0,""],["Temperature",32,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Operating Time",48,16,60,false,"s","DURATION",0,3931920,0,""]]},"128259":{"name":"Speed","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Speed Water Referenced",8,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Speed Ground Referenced",24,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Speed Water Referenced Type",40,8,1,false,"","LOOKUP",0,252,0,"WATER_REFERENCE"],["Speed Direction",48,4,1,false,"","NUMBER",0,13,0,""]]},"128267":{"name":"Water Depth","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Depth",8,32,0.01,false,"m","NUMBER",0,42949672.92,0,""],["Offset",40,16,0.001,true,"m","NUMBER",-32.767,32.764,0,""],["Range",56,8,10,false,"m","NUMBER",0,2520,0,""]]},"128275":{"name":"Distance Log","fast":true,"fields":[["Date",0,16,1,false,"d","DATE",0,65532,0,""],["Time",16,32,0.0001,false,"s","TIME",0,86401,0,""],["Log",48,32,1,false,"m","NUMBER",0,4294967292,0,""],["Trip Log",80,32,1,false,"m","NUMBER",0,4294967292,0,""]]},"128520":{"name":"Tracked Target Data","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Target ID #",8,16,1,false,"","NUMBER",0,65532,0,""],["Track Status",24,2,1,false,"","LOOKUP",0,3,0,"TRACKING"],["Reported Target",26,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Target Acquisition",27,1,1,false,"","LOOKUP",0,1,0,"TARGET_ACQUISITION"],["Bearing Reference",28,2,1,false,"","LOOKUP",0,2,0,"DIRECTION_REFERENCE"],["Bearing",32,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Distance",48,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""],["Course",80,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Speed",96,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["CPA",112,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""],["TCPA",144,32,0.001,true,"s","DURATION",-2147483.647,2147483.644,0,""],["UTC of Fix",176,32,0.0001,false,"s","TIME",0,86401,0,""]]},"128538":{"name":"Elevator Car Status","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Elevator Car ID",8,8,1,false,"","NUMBER",0,252,0,""],["Elevator Car Usage",16,8,1,false,"","NUMBER",0,252,0,""],["Smoke Sensor Status",24,2,1,false,"","NUMBER",0,2,0,""],["Limit Switch Sensor Status",26,2,1,false,"","NUMBER",0,2,0,""],["Proximity Switch Sensor Status",28,2,1,false,"","NUMBER",0,2,0,""],["Inertial Measurement Unit (IMU) Sensor Status",30,2,1,false,"","NUMBER",0,2,0,""],["Elevator Load Limit Status",32,2,1,false,"","NUMBER",0,2,0,""],["Elevator Load Balance Status",34,2,1,false,"","NUMBER",0,2,0,""],["Elevator Load Sensor 1 Status",36,2,1,false,"","NUMBER",0,2,0,""],["Elevator Load Sensor 2 Status",38,2,1,false,"","NUMBER",0,2,0,""],["Elevator Load Sensor 3 Status",40,2,1,false,"","NUMBER",0,2,0,""],["Elevator Load Sensor 4 Status",42,2,1,false,"","NUMBER",0,2,0,""],["Elevator Car Motion Status",48,2,1,false,"","NUMBER",0,2,0,""],["Elevator Car Door Status",50,2,1,false,"","NUMBER",0,2,0,""],["Elevator Car Emergency Button Status",52,2,1,false,"","NUMBER",0,2,0,""],["Elevator Car Buzzer Status",54,2,1,false,"","NUMBER",0,2,0,""],["Open Door Button Status",56,2,1,false,"","NUMBER",0,2,0,""],["Close Door Button Status",58,2,1,false,"","NUMBER",0,2,0,""],["Current Deck",64,8,1,false,"","NUMBER",0,252,0,""],["Destination Deck",72,8,1,false,"","NUMBER",0,252,0,""],["Total Number of Decks",80,8,1,false,"","NUMBER",0,252,0,""],["Weight of Load Cell 1",88,16,1,false,"","NUMBER",0,65532,0,""],["Weight of Load Cell 2",104,16,1,false,"","NUMBER",0,65532,0,""],["Weight of Load Cell 3",120,16,1,false,"","NUMBER",0,65532,0,""],["Weight of Load Cell 4",136,16,1,false,"","NUMBER",0,65532,0,""],["Speed of Elevator Car",152,16,0.01,true,"m/s","NUMBER",-327.67,327.64,0,""],["Elevator Brake Status",168,2,1,false,"","NUMBER",0,2,0,""],["Elevator Motor rotation control Status",170,2,1,false,"","NUMBER",0,2,0,""]]},"128768":{"name":"Elevator Motor Control","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Elevator Car ID",8,8,1,false,"","NUMBER",0,252,0,""],["Elevator Car Usage",16,8,1,false,"","NUMBER",0,252,0,""],["Motor Acceleration/Deceleration profile selection",24,4,1,false,"","NUMBER",0,13,0,""],["Motor Rotational Control Status",28,2,1,false,"","NUMBER",0,2,0,""]]},"128769":{"name":"Elevator Deck Push Button","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Elevator Call Button ID",8,8,1,false,"","NUMBER",0,252,0,""],["Deck Button ID",16,8,1,false,"","NUMBER",0,252,0,""],["Elevator Car Usage",24,8,1,false,"","NUMBER",0,252,0,""],["Elevator Car Button Selection",32,8,1,false,"","NUMBER",0,252,0,""]]},"128776":{"name":"Windlass Control Status","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Windlass ID",8,8,1,false,"","NUMBER",0,252,0,""],["Windlass Direction Control",16,2,1,false,"","LOOKUP",0,2,0,"WINDLASS_DIRECTION"],["Anchor Docking Control",18,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Speed Control Type",20,2,1,false,"","LOOKUP",0,2,0,"SPEED_TYPE"],["Power Enable",32,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Mechanical Lock",34,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Deck and Anchor Wash",36,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Anchor Light",38,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Command Timeout",40,8,0.005,false,"s","DURATION",0,1.26,0,""]]},"128777":{"name":"Anchor Windlass Operating Status","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Windlass ID",8,8,1,false,"","NUMBER",0,252,0,""],["Windlass Direction Control",16,2,1,false,"","LOOKUP",0,2,0,"WINDLASS_DIRECTION"],["Windlass Motion Status",18,2,1,false,"","LOOKUP",0,2,0,"WINDLASS_MOTION"],["Rode Type Status",20,2,1,false,"","LOOKUP",0,2,0,"RODE_TYPE"],["Rode Counter Value",24,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Windlass Line Speed",40,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Anchor Docking Status",56,2,1,false,"","LOOKUP",0,2,0,"DOCKING_STATUS"]]},"128778":{"name":"Anchor Windlass Monitoring Status","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Windlass ID",8,8,1,false,"","NUMBER",0,252,0,""],["Controller voltage",24,8,0.2,false,"V","NUMBER",0,50.4,0,""],["Motor current",32,8,1,false,"A","NUMBER",0,252,0,""],["Total Motor Time",40,16,60,false,"s","DURATION",0,3931920,0,""]]},"128780":{"name":"Linear Actuator Control/Status","fast":false,"fields":[["Actuator Identifier",0,8,1,false,"","NUMBER",0,252,0,""],["Commanded Device Position",8,8,1,false,"","NUMBER",0,252,0,""],["Device Position",16,8,1,false,"","NUMBER",0,252,0,""],["Maximum Device Travel",24,16,1,false,"","NUMBER",0,65532,0,""],["Direction of Travel",40,8,1,false,"","NUMBER",0,252,0,""]]},"129025":{"name":"Position, Rapid Update","fast":false,"fields":[["Latitude",0,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Longitude",32,32,1e-07,true,"deg","NUMBER",-180,180,0,""]]},"129026":{"name":"COG & SOG, Rapid Update","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["COG Reference",8,2,1,false,"","LOOKUP",0,2,0,"DIRECTION_REFERENCE"],["COG",16,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["SOG",32,16,0.01,false,"m/s","NUMBER",0,655.32,0,""]]},"129027":{"name":"Position Delta, Rapid Update","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Time Delta",8,8,0.005,false,"s","DURATION",0,1.26,0,""],["Latitude Delta",16,24,2.777777777777778e-09,true,"deg","NUMBER",-0.0233016861111111,0.0233016777777778,0,""],["Longitude Delta",40,24,2.777777777777778e-09,true,"deg","NUMBER",-0.0233016861111111,0.0233016777777778,0,""]]},"129028":{"name":"Altitude Delta, Rapid Update","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Time Delta",8,8,0.005,false,"s","DURATION",0,1.26,0,""],["GNSS Quality",16,4,1,false,"","LOOKUP",0,13,0,"GNS_METHOD"],["Direction",20,2,1,false,"","LOOKUP",0,2,0,"DIRECTION_REFERENCE"],["COG",24,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Altitude Delta",40,24,0.001,true,"m","NUMBER",-8388.607,8388.604,0,""]]},"129029":{"name":"GNSS Position Data","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Date",8,16,1,false,"d","DATE",0,65532,0,""],["Time",24,32,0.0001,false,"s","TIME",0,86401,0,""],["Latitude",56,64,1e-16,true,"deg","NUMBER",-90,90,0,""],["Longitude",120,64,1e-16,true,"deg","NUMBER",-180,180,0,""],["Altitude",184,64,1e-06,true,"m","NUMBER",-9223372036854.78,9223372036854.78,0,""],["GNSS type",248,4,1,false,"","LOOKUP",0,13,0,"GNS"],["Method",252,4,1,false,"","LOOKUP",0,13,0,"GNS_METHOD"],["Integrity",256,2,1,false,"","LOOKUP",0,3,0,"GNS_INTEGRITY"],["Number of SVs",264,8,1,false,"","NUMBER",0,252,0,""],["HDOP",272,16,0.01,true,"","NUMBER",-327.67,327.64,0,""],["PDOP",288,16,0.01,true,"","NUMBER",-327.67,327.64,0,""],["Geoidal Separation",304,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""],["Reference Stations",336,8,1,false,"","NUMBER",0,252,0,""]]},"129033":{"name":"Time & Date","fast":false,"fields":[["Date",0,16,1,false,"d","DATE",0,65532,0,""],["Time",16,32,0.0001,false,"s","TIME",0,86401,0,""],["Local Offset",48,16,60,true,"s","DURATION",-1966020,1965840,0,""]]},"129038":{"name":"AIS Class A Position Report","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["User ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["Longitude",40,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Latitude",72,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Position Accuracy",104,1,1,false,"","LOOKUP",0,1,0,"POSITION_ACCURACY"],["RAIM",105,1,1,false,"","LOOKUP",0,1,0,"RAIM_FLAG"],["Time Stamp",106,6,1,false,"","LOOKUP",0,63,0,"TIME_STAMP"],["COG",112,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["SOG",128,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["AIS Transceiver information",163,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Heading",168,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Rate of Turn",184,16,3.125e-05,true,"rad/s","NUMBER",-1.02396875,1.023875,0,""],["Nav Status",200,4,1,false,"","LOOKUP",0,14,0,"NAV_STATUS"],["Special Maneuver Indicator",204,2,1,false,"","LOOKUP",0,3,0,"AIS_SPECIAL_MANEUVER"],["Sequence ID",216,8,1,false,"","NUMBER",0,252,0,""]]},"129039":{"name":"AIS Class B Position Report","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["User ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["Longitude",40,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Latitude",72,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Position Accuracy",104,1,1,false,"","LOOKUP",0,1,0,"POSITION_ACCURACY"],["RAIM",105,1,1,false,"","LOOKUP",0,1,0,"RAIM_FLAG"],["Time Stamp",106,6,1,false,"","LOOKUP",0,63,0,"TIME_STAMP"],["COG",112,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["SOG",128,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["AIS Transceiver information",163,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Heading",168,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Unit type",194,1,1,false,"","LOOKUP",0,1,0,"AIS_TYPE"],["Integrated Display",195,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["DSC",196,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Band",197,1,1,false,"","LOOKUP",0,1,0,"AIS_BAND"],["Can handle Msg 22",198,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["AIS mode",199,1,1,false,"","LOOKUP",0,1,0,"AIS_MODE"],["AIS communication state",200,1,1,false,"","LOOKUP",0,1,0,"AIS_COMMUNICATION_STATE"],["Sequence ID",208,8,1,false,"","NUMBER",0,252,0,""]]},"129040":{"name":"AIS Class B Extended Position Report","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["User ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["Longitude",40,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Latitude",72,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Position Accuracy",104,1,1,false,"","LOOKUP",0,1,0,"POSITION_ACCURACY"],["RAIM",105,1,1,false,"","LOOKUP",0,1,0,"RAIM_FLAG"],["Time Stamp",106,6,1,false,"","LOOKUP",0,63,0,"TIME_STAMP"],["COG",112,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["SOG",128,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Type of ship",160,8,1,false,"","LOOKUP",0,252,0,"SHIP_TYPE"],["True Heading",168,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["GNSS type",188,4,1,false,"","LOOKUP",0,13,0,"POSITION_FIX_DEVICE"],["Length",192,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Beam",208,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Position reference from Starboard",224,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Position reference from Bow",240,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Name",256,160,1,false,"","STRING_FIX",null,null,0,""],["DTE",416,1,1,false,"","LOOKUP",0,1,0,"AVAILABLE"],["AIS mode",417,1,1,false,"","LOOKUP",0,1,0,"AIS_MODE"],["AIS Transceiver information",422,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"]]},"129041":{"name":"AIS Aids to Navigation (AtoN) Report","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["User ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["Longitude",40,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Latitude",72,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Position Accuracy",104,1,1,false,"","LOOKUP",0,1,0,"POSITION_ACCURACY"],["RAIM",105,1,1,false,"","LOOKUP",0,1,0,"RAIM_FLAG"],["Time Stamp",106,6,1,false,"","LOOKUP",0,63,0,"TIME_STAMP"],["Length/Diameter",112,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Beam/Diameter",128,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Position Reference from Starboard Edge",144,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Position Reference from True North Facing Edge",160,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["AtoN Type",176,5,1,false,"","LOOKUP",0,31,0,"ATON_TYPE"],["Off Position Indicator",181,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Virtual AtoN Flag",182,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Assigned Mode Flag",183,1,1,false,"","LOOKUP",0,1,0,"AIS_ASSIGNED_MODE"],["Position Fixing Device Type",185,4,1,false,"","LOOKUP",0,13,0,"POSITION_FIX_DEVICE"],["AIS Transceiver information",200,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"]]},"129044":{"name":"Datum","fast":true,"fields":[["Local Datum",0,32,1,false,"","STRING_FIX",null,null,0,""],["Delta Latitude",32,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Delta Longitude",64,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Delta Altitude",96,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""],["Reference Datum",128,32,1,false,"","STRING_FIX",null,null,0,""]]},"129045":{"name":"User Datum","fast":true,"fields":[["Delta X",0,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""],["Delta Y",32,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""],["Delta Z",64,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""],["Ellipsoid Semi-major Axis",224,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""],["Datum Name",288,32,1,false,"","STRING_FIX",null,null,0,""]]},"129283":{"name":"Cross Track Error","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["XTE mode",8,4,1,false,"","LOOKUP",0,13,0,"RESIDUAL_MODE"],["Navigation Terminated",14,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["XTE",16,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""]]},"129284":{"name":"Navigation Data","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Distance to Waypoint",8,32,0.01,false,"m","NUMBER",0,42949672.92,0,""],["Course/Bearing reference",40,2,1,false,"","LOOKUP",0,2,0,"DIRECTION_REFERENCE"],["Perpendicular Crossed",42,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Arrival Circle Entered",44,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Calculation Type",46,2,1,false,"","LOOKUP",0,2,0,"BEARING_MODE"],["ETA Time",48,32,0.0001,false,"s","TIME",0,86401,0,""],["ETA Date",80,16,1,false,"d","DATE",0,65532,0,""],["Bearing, Origin to Destination Waypoint",96,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Bearing, Position to Destination Waypoint",112,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Origin Waypoint Number",128,32,1,false,"","NUMBER",0,4294967292,0,""],["Destination Waypoint Number",160,32,1,false,"","NUMBER",0,4294967292,0,""],["Destination Latitude",192,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Destination Longitude",224,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Waypoint Closing Velocity",256,16,0.01,true,"m/s","NUMBER",-327.67,327.64,0,""]]},"129285":{"name":"Navigation - Route/WP Information","fast":true,"fields":[["Start RPS#",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Database ID",32,16,1,false,"","NUMBER",0,65532,0,""],["Route ID",48,16,1,false,"","NUMBER",0,65532,0,""],["Navigation direction in route",64,3,1,false,"","LOOKUP",0,6,0,"DIRECTION"],["Supplementary Route/WP data available",67,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"]]},"129291":{"name":"Set & Drift, Rapid Update","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Set Reference",8,2,1,false,"","LOOKUP",0,2,0,"DIRECTION_REFERENCE"],["Set",16,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Drift",32,16,0.01,false,"m/s","NUMBER",0,655.32,0,""]]},"129301":{"name":"Navigation - Route / Time to+from Mark","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Time to mark",8,32,0.001,true,"s","DURATION",-2147483.647,2147483.644,0,""],["Mark Type",40,4,1,false,"","LOOKUP",0,13,0,"MARK_TYPE"],["Mark ID",48,32,1,false,"","NUMBER",0,4294967292,0,""]]},"129302":{"name":"Bearing and Distance between two Marks","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Bearing Reference",8,2,1,false,"","LOOKUP",0,2,0,"DIRECTION_REFERENCE"],["Calculation Type",10,2,1,false,"","LOOKUP",0,2,0,"BEARING_MODE"],["Bearing, Origin to Destination",16,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Distance",32,32,0.01,false,"m","NUMBER",0,42949672.92,0,""],["Origin Mark Type",64,4,1,false,"","LOOKUP",0,13,0,"MARK_TYPE"],["Destination Mark Type",68,4,1,false,"","LOOKUP",0,13,0,"MARK_TYPE"],["Origin Mark ID",72,32,1,false,"","NUMBER",0,4294967292,0,""],["Destination Mark ID",104,32,1,false,"","NUMBER",0,4294967292,0,""]]},"129538":{"name":"GNSS Control Status","fast":true,"fields":[["SV Elevation Mask",0,16,0.0001,true,"rad","NUMBER",-3.14159265358979,3.14159265358979,0,""],["PDOP Mask",16,16,0.01,true,"","NUMBER",-327.67,327.64,0,""],["PDOP Switch",32,16,0.01,true,"","NUMBER",-327.67,327.64,0,""],["SNR Mask",48,16,0.01,true,"dB","NUMBER",-327.67,327.64,0,""],["GNSS Mode (desired)",64,3,1,false,"","LOOKUP",0,6,0,"GNSS_MODE"],["DGNSS Mode (desired)",67,3,1,false,"","LOOKUP",0,6,0,"DGNSS_MODE"],["Position/Velocity Filter",70,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Max Correction Age",72,16,0.01,false,"s","DURATION",0,655.32,0,""],["Antenna Altitude for 2D Mode",88,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""],["Use Antenna Altitude for 2D Mode",120,2,1,false,"","LOOKUP",0,2,0,"YES_NO"]]},"129539":{"name":"GNSS DOPs","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Desired Mode",8,3,1,false,"","LOOKUP",0,6,0,"GNSS_MODE"],["Actual Mode",11,3,1,false,"","LOOKUP",0,6,0,"GNSS_MODE"],["HDOP",16,16,0.01,true,"","NUMBER",-327.67,327.64,0,""],["VDOP",32,16,0.01,true,"","NUMBER",-327.67,327.64,0,""],["TDOP",48,16,0.01,true,"","NUMBER",-327.67,327.64,0,""]]},"129540":{"name":"GNSS Sats in View","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Range Residual Mode",8,2,1,false,"","LOOKUP",0,2,0,"RANGE_RESIDUAL_MODE"],["Sats in View",16,8,1,false,"","NUMBER",0,252,0,""]]},"129541":{"name":"GPS Almanac Data","fast":true,"fields":[["PRN",0,8,1,false,"","NUMBER",0,252,0,""],["GPS Week number",8,16,1,false,"","NUMBER",0,65532,0,""],["Eccentricity",32,16,4.76837158203125e-07,false,"m/m","NUMBER",0,0.0312480926513672,0,""],["Almanac Reference Time",48,8,4096,false,"s","NUMBER",0,1032192,0,""],["Inclination Angle",56,16,1.9073486328125e-06,true,"semi-circle","NUMBER",-0.0624980926513672,0.0624923706054688,0,""],["Rate of Right Ascension",72,16,3.637978807091713e-12,true,"semi-circle/s","NUMBER",-1.19205651571974e-07,1.19194737635553e-07,0,""],["Root of Semi-major Axis",88,24,0.00048828125,false,"sqrt(m)","NUMBER",0,8191.998046875,0,""],["Argument of Perigee",112,24,1.1920928955078125e-07,true,"semi-circle","NUMBER",-0.99999988079071,0.999999523162842,0,""],["Longitude of Ascension Node",136,24,1.1920928955078125e-07,true,"semi-circle","NUMBER",-0.99999988079071,0.999999523162842,0,""],["Mean Anomaly",160,24,1.1920928955078125e-07,true,"semi-circle","NUMBER",-0.99999988079071,0.999999523162842,0,""],["Clock Parameter 1",184,11,9.5367431640625e-07,true,"s","NUMBER",-0.000975608825683594,0.000972747802734375,0,""],["Clock Parameter 2",195,11,3.637978807091713e-12,true,"s/s","NUMBER",-3.72165231965482e-09,3.71073838323355e-09,0,""]]},"129542":{"name":"GNSS Pseudorange Noise Statistics","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["RMS of Position Uncertainty",8,16,0.01,false,"m","NUMBER",0,655.32,0,""],["STD of Major axis",24,16,0.01,false,"m","NUMBER",0,655.32,0,""],["STD of Minor axis",40,16,0.01,false,"m","NUMBER",0,655.32,0,""],["Orientation of Major axis",56,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["STD of Lat Error",72,16,0.01,false,"m","NUMBER",0,655.32,0,""],["STD of Lon Error",88,16,0.01,false,"m","NUMBER",0,655.32,0,""],["STD of Alt Error",104,16,0.01,false,"m","NUMBER",0,655.32,0,""]]},"129545":{"name":"GNSS RAIM Output","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Integrity flag",8,2,1,false,"","LOOKUP",0,3,0,"GNS_INTEGRITY"],["Latitude expected error",16,16,0.01,true,"m","NUMBER",-327.67,327.64,0,""],["Longitude expected error",32,16,0.01,true,"m","NUMBER",-327.67,327.64,0,""],["Altitude expected error",48,16,0.01,true,"m","NUMBER",-327.67,327.64,0,""],["SV ID of most likely failed sat",64,8,1,false,"","NUMBER",0,252,0,""],["Probability of missed detection",72,16,0.01,true,"m","NUMBER",-327.67,327.64,0,""],["Estimate of pseudorange bias",88,16,0.01,true,"m","NUMBER",-327.67,327.64,0,""],["Std Deviation of bias",104,16,0.01,true,"m","NUMBER",-327.67,327.64,0,""]]},"129546":{"name":"GNSS RAIM Settings","fast":false,"fields":[["Radial Position Error Maximum Threshold",0,16,0.01,false,"m","NUMBER",0,655.32,0,""],["Probability of False Alarm",16,8,1,true,"%","NUMBER",-127,124,0,""],["Probability of Missed Detection",24,8,1,true,"%","NUMBER",-127,124,0,""],["Pseudorange Residual Filtering Time Constant",32,16,1,false,"s","DURATION",0,65532,0,""]]},"129547":{"name":"GNSS Pseudorange Error Statistics","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["RMS Std Dev of Range Inputs",8,16,0.01,false,"m","NUMBER",0,655.32,0,""],["Std Dev of Major error ellipse",24,16,0.01,false,"m","NUMBER",0,655.32,0,""],["Std Dev of Minor error ellipse",40,16,0.01,false,"m","NUMBER",0,655.32,0,""],["Orientation of error ellipse",56,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Std Dev Lat Error",72,16,0.01,false,"m","NUMBER",0,655.32,0,""],["Std Dev Lon Error",88,16,0.01,false,"m","NUMBER",0,655.32,0,""],["Std Dev Alt Error",104,16,0.01,false,"m","NUMBER",0,655.32,0,""]]},"129549":{"name":"DGNSS Corrections","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Reference Station ID",8,12,1,false,"","NUMBER",0,4092,0,""],["Reference Station Type",20,4,1,false,"","LOOKUP",0,13,0,"GNS"],["Time of corrections",24,16,0.1,false,"s","DURATION",0,6553.2,0,""],["Station Health",40,4,1,false,"","LOOKUP",0,13,0,"STATION_HEALTH"],["Satellite ID",48,8,1,false,"","NUMBER",0,252,0,""],["PRC",56,32,0.0001,true,"m","NUMBER",-214748.3647,214748.3644,0,""],["RRC",88,16,0.0001,true,"m/s","NUMBER",-3.2767,3.2764,0,""],["UDRE",104,16,0.01,false,"m","NUMBER",0,655.32,0,""],["IOD",120,8,1,false,"","NUMBER",0,252,0,""]]},"129550":{"name":"GNSS Differential Correction Receiver Interface","fast":false,"fields":[["Channel",0,8,1,false,"","NUMBER",0,252,0,""],["Frequency",8,32,10,false,"Hz","NUMBER",0,42949672920,0,""],["Serial Interface Bit Rate",40,5,1,false,"","LOOKUP",0,29,0,"SERIAL_BIT_RATE"],["Serial Interface Detection Mode",45,3,1,false,"","LOOKUP",0,6,0,"SERIAL_DETECTION_MODE"],["Differential Source",48,4,1,false,"","LOOKUP",0,13,0,"DIFFERENTIAL_SOURCE"],["Differential Operation Mode",52,4,1,false,"","LOOKUP",0,13,0,"DIFFERENTIAL_MODE"]]},"129551":{"name":"GNSS Differential Correction Receiver Signal","fast":true,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Channel",8,8,1,false,"","NUMBER",0,252,0,""],["Signal Strength",16,32,0.01,true,"dB","NUMBER",-21474836.47,21474836.44,0,""],["Signal SNR",48,16,0.01,true,"dB","NUMBER",-327.67,327.64,0,""],["Frequency",64,32,10,false,"Hz","NUMBER",0,42949672920,0,""],["Station Type",96,4,1,false,"","LOOKUP",0,13,0,"GNS"],["Reference Station ID",100,12,1,false,"","NUMBER",0,4092,0,""],["Differential Signal Bit Rate",112,5,1,false,"","LOOKUP",0,29,0,"SERIAL_BIT_RATE"],["Differential Signal Detection Mode",117,3,1,false,"","LOOKUP",0,6,0,"SERIAL_DETECTION_MODE"],["Used as Correction Source",120,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Differential Source",124,4,1,false,"","LOOKUP",0,13,0,"DIFFERENTIAL_SOURCE"],["Time since Last Sat Differential Sync",128,16,0.01,false,"s","DURATION",0,655.32,0,""],["Satellite Service ID No.",144,16,1,false,"","NUMBER",0,65532,0,""]]},"129556":{"name":"GLONASS Almanac Data","fast":true,"fields":[["PRN",0,8,1,false,"","NUMBER",0,252,0,""],["NA",8,16,1,false,"","NUMBER",0,65532,0,""],["CnA",26,1,1,false,"","NUMBER",0,1,0,""],["HnA",27,5,1,false,"","NUMBER",0,29,0,""],["(epsilon)nA",32,16,1,false,"","NUMBER",0,65532,0,""],["(deltaTnA)DOT",48,8,1,false,"","NUMBER",0,252,0,""],["(omega)nA",56,16,1,false,"","NUMBER",0,65532,0,""],["(delta)TnA",72,24,1,false,"","NUMBER",0,16777212,0,""],["tnA",96,24,1,false,"","NUMBER",0,16777212,0,""],["(lambda)nA",120,24,1,false,"","NUMBER",0,16777212,0,""],["(delta)inA",144,24,1,false,"","NUMBER",0,16777212,0,""],["(tau)cA",168,28,1,false,"","NUMBER",0,268435452,0,""],["(tau)nA",196,12,1,false,"","NUMBER",0,4092,0,""]]},"129792":{"name":"AIS DGNSS Broadcast Binary Message","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","NUMBER",0,2,0,""],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Longitude",48,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Latitude",80,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Number of Bits in Binary Data Field",120,16,1,false,"","NUMBER",0,65532,0,""]]},"129793":{"name":"AIS UTC and Date Report","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["User ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["Longitude",40,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Latitude",72,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Position Accuracy",104,1,1,false,"","LOOKUP",0,1,0,"POSITION_ACCURACY"],["RAIM",105,1,1,false,"","LOOKUP",0,1,0,"RAIM_FLAG"],["Position Time",112,32,0.0001,false,"s","TIME",0,86401,0,""],["AIS Transceiver information",163,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Position Date",168,16,1,false,"d","DATE",0,65532,0,""],["GNSS type",188,4,1,false,"","LOOKUP",0,13,0,"POSITION_FIX_DEVICE"],["Sequence ID",208,8,1,false,"","NUMBER",0,252,0,""]]},"129794":{"name":"AIS Class A Static and Voyage Related Data","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["User ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["IMO number",40,32,1,false,"","NUMBER",0,4294967292,0,""],["Callsign",72,56,1,false,"","STRING_FIX",null,null,0,""],["Name",128,160,1,false,"","STRING_FIX",null,null,0,""],["Type of ship",288,8,1,false,"","LOOKUP",0,252,0,"SHIP_TYPE"],["Length",296,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Beam",312,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Position reference from Starboard",328,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Position reference from Bow",344,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["ETA Date",360,16,1,false,"d","DATE",0,65532,0,""],["ETA Time",376,32,0.0001,false,"s","TIME",0,86401,0,""],["Draft",408,16,0.01,false,"m","NUMBER",0,655.32,0,""],["Destination",424,160,1,false,"","STRING_FIX",null,null,0,""],["AIS version indicator",584,2,1,false,"","LOOKUP",0,3,0,"AIS_VERSION"],["GNSS type",586,4,1,false,"","LOOKUP",0,13,0,"POSITION_FIX_DEVICE"],["DTE",590,1,1,false,"","LOOKUP",0,1,0,"AVAILABLE"],["AIS Transceiver information",592,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Sequence ID",600,8,1,false,"","NUMBER",0,252,0,""]]},"129795":{"name":"AIS Addressed Binary Message","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Sequence Number",46,2,1,false,"","NUMBER",0,3,0,""],["Destination ID",48,32,1,false,"","MMSI",2000000,999999999,0,""],["Retransmit flag",86,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"],["Number of Bits in Binary Data Field",88,16,1,false,"","NUMBER",0,65532,0,""]]},"129796":{"name":"AIS Acknowledge","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"]]},"129797":{"name":"AIS Binary Broadcast Message","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Number of Bits in Binary Data Field",48,16,1,false,"","NUMBER",0,65532,0,""]]},"129798":{"name":"AIS SAR Aircraft Position Report","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["User ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["Longitude",40,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Latitude",72,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Position Accuracy",104,1,1,false,"","LOOKUP",0,1,0,"POSITION_ACCURACY"],["RAIM",105,1,1,false,"","LOOKUP",0,1,0,"RAIM_FLAG"],["Time Stamp",106,6,1,false,"","LOOKUP",0,63,0,"TIME_STAMP"],["COG",112,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["SOG",128,16,0.1,false,"m/s","NUMBER",0,6553.2,0,""],["AIS Transceiver information",163,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Altitude",168,32,0.01,true,"m","NUMBER",-21474836.47,21474836.44,0,""],["DTE",208,1,1,false,"","LOOKUP",0,1,0,"AVAILABLE"]]},"129799":{"name":"Radio Frequency/Mode/Power","fast":true,"fields":[["Rx Frequency",0,32,10,false,"Hz","NUMBER",0,42949672920,0,""],["Tx Frequency",32,32,10,false,"Hz","NUMBER",0,42949672920,0,""],["Radio Channel",64,48,1,false,"","STRING_FIX",null,null,0,""],["Tx Power",112,16,1,false,"W","NUMBER",0,65532,0,""],["Mode",128,8,1,false,"","LOOKUP",0,252,0,"TELEPHONE_MODE"],["Channel Bandwidth",136,16,1,false,"Hz","NUMBER",0,65532,0,""]]},"129800":{"name":"AIS UTC/Date Inquiry","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Destination ID",48,32,1,false,"","MMSI",2000000,999999999,0,""]]},"129801":{"name":"AIS Addressed Safety Related Message","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Sequence Number",46,2,1,false,"","NUMBER",0,3,0,""],["Destination ID",48,32,1,false,"","MMSI",2000000,999999999,0,""],["Retransmit flag",86,1,1,false,"","LOOKUP",0,1,0,"YES_NO_1BIT"]]},"129802":{"name":"AIS Safety Related Broadcast Message","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"]]},"129803":{"name":"AIS Interrogation","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Destination ID 1",48,32,1,false,"","MMSI",2000000,999999999,0,""],["Message ID 1.1",82,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Slot Offset 1.1",88,16,1,false,"","NUMBER",0,65532,0,""],["Message ID 1.2",106,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Slot Offset 1.2",112,16,1,false,"","NUMBER",0,65532,0,""],["Destination ID 2",136,32,1,false,"","MMSI",2000000,999999999,0,""],["Message ID 2.1",170,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Slot Offset 2.1",176,16,1,false,"","NUMBER",0,65532,0,""],["SID",200,8,1,false,"","NUMBER",0,252,0,""]]},"129804":{"name":"AIS Assignment Mode Command","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Destination ID A",48,32,1,false,"","MMSI",2000000,999999999,0,""],["Offset A",80,16,1,false,"","NUMBER",0,65532,0,""],["Increment A",96,16,1,false,"","NUMBER",0,65532,0,""],["Destination ID B",112,32,1,false,"","MMSI",2000000,999999999,0,""],["Offset B",144,16,1,false,"","NUMBER",0,65532,0,""],["Increment B",160,16,1,false,"","NUMBER",0,65532,0,""]]},"129805":{"name":"AIS Data Link Management Message","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"]]},"129806":{"name":"AIS Channel Management","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",41,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Channel A",48,16,1,false,"","NUMBER",0,65532,0,""],["Channel B",64,16,1,false,"","NUMBER",0,65532,0,""],["Power",83,1,1,false,"","LOOKUP",0,1,0,"POWER_MODE"],["Tx/Rx Mode",84,4,1,false,"","LOOKUP",0,13,0,"TX_RX_MODE"],["North East Longitude Corner 1",88,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["North East Latitude Corner 1",120,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["South West Longitude Corner 2",152,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["South West Latitude Corner 2",184,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Addressed or Broadcast Message Indicator",217,1,1,false,"","LOOKUP",0,1,0,"BROADCAST_INDICATOR"],["Channel A Bandwidth",218,1,1,false,"","LOOKUP",0,1,0,"BANDWIDTH"],["Channel B Bandwidth",219,1,1,false,"","LOOKUP",0,1,0,"BANDWIDTH"],["Transitional Zone Size",221,3,1,false,"","LOOKUP",0,6,0,"ZONE_SIZE"]]},"129807":{"name":"AIS Class B Group Assignment","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["Tx/Rx Mode",42,4,1,false,"","LOOKUP",0,13,0,"TX_RX_MODE"],["North East Longitude Corner 1",48,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["North East Latitude Corner 1",80,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["South West Longitude Corner 2",112,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["South West Latitude Corner 2",144,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Station Type",176,4,1,false,"","LOOKUP",0,13,0,"STATION_TYPE"],["Ship and Cargo Filter",184,8,1,false,"","LOOKUP",0,252,0,"SHIP_TYPE"],["Reporting Interval",216,4,1,false,"","LOOKUP",0,13,0,"REPORTING_INTERVAL"],["Quiet Time",220,4,60,false,"s","DURATION",0,780,0,""]]},"129809":{"name":"AIS Class B static data (msg 24 Part A)","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["User ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["Name",40,160,1,false,"","STRING_FIX",null,null,0,""],["AIS Transceiver information",200,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Sequence ID",208,8,1,false,"","NUMBER",0,252,0,""]]},"129810":{"name":"AIS Class B static data (msg 24 Part B)","fast":true,"fields":[["Message ID",0,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",6,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["User ID",8,32,1,false,"","MMSI",2000000,999999999,0,""],["Type of ship",40,8,1,false,"","LOOKUP",0,252,0,"SHIP_TYPE"],["Vendor ID",48,56,1,false,"","STRING_FIX",null,null,0,""],["Callsign",104,56,1,false,"","STRING_FIX",null,null,0,""],["Length",160,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Beam",176,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Position reference from Starboard",192,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Position reference from Bow",208,16,0.1,false,"m","NUMBER",0,6553.2,0,""],["Mothership User ID",224,32,1,false,"","MMSI",2000000,999999999,0,""],["GNSS type",260,4,1,false,"","LOOKUP",0,13,0,"POSITION_FIX_DEVICE"],["AIS Transceiver information",264,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Sequence ID",272,8,1,false,"","NUMBER",0,252,0,""]]},"129811":{"name":"AIS Single Slot Binary Message (Deprecated)","fast":true,"fields":[["Sequence ID",0,8,1,false,"","NUMBER",0,252,0,""],["Message ID",8,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",14,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",16,32,1,false,"","MMSI",2000000,999999999,0,""],["Destination Indicator",48,1,1,false,"","LOOKUP",0,1,0,"BROADCAST_INDICATOR"],["Binary data flag",49,1,1,false,"","NUMBER",0,1,0,""],["AIS Transceiver information",51,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Destination ID",56,32,1,false,"","MMSI",2000000,999999999,0,""],["Number of bits in Binary Data Field",88,16,1,false,"","NUMBER",0,65532,0,""]]},"129812":{"name":"AIS Multi Slot Binary Message (Deprecated)","fast":true,"fields":[["Sequence ID",0,8,1,false,"","NUMBER",0,252,0,""],["Message ID",8,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",14,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",16,32,1,false,"","MMSI",2000000,999999999,0,""],["Destination Indicator",48,1,1,false,"","LOOKUP",0,1,0,"BROADCAST_INDICATOR"],["Binary data flag",49,1,1,false,"","NUMBER",0,1,0,""],["AIS Transceiver information",52,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Destination ID",57,32,1,false,"","MMSI",2000000,999999999,0,""],["Communication state selector flag",92,1,1,false,"","NUMBER",0,1,0,""]]},"129813":{"name":"AIS Long-Range Broadcast Message","fast":true,"fields":[["Sequence ID",0,8,1,false,"","NUMBER",0,252,0,""],["Message ID",8,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",14,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["User ID",16,32,1,false,"","MMSI",2000000,999999999,0,""],["Longitude",48,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Latitude",80,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Position Accuracy",112,1,1,false,"","LOOKUP",0,1,0,"POSITION_ACCURACY"],["RAIM",113,1,1,false,"","LOOKUP",0,1,0,"RAIM_FLAG"],["Nav Status",114,4,1,false,"","LOOKUP",0,14,0,"NAV_STATUS"],["Position Latency",118,1,1,false,"","NUMBER",0,1,0,""],["SOG",120,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["COG",136,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["AIS Transceiver information",152,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"]]},"129814":{"name":"AIS Single Slot Binary Message","fast":true,"fields":[["Sequence ID",0,8,1,false,"","NUMBER",0,252,0,""],["Message ID",8,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",14,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",16,32,1,false,"","MMSI",2000000,999999999,0,""],["Destination Indicator",48,1,1,false,"","LOOKUP",0,1,0,"BROADCAST_INDICATOR"],["Binary data flag",49,1,1,false,"","NUMBER",0,1,0,""],["AIS Transceiver information",59,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Destination ID",64,32,1,false,"","MMSI",2000000,999999999,0,""],["Number of bits in Binary Data Field",96,16,1,false,"","NUMBER",0,65532,0,""]]},"129815":{"name":"AIS Multi Slot Binary Message","fast":true,"fields":[["Sequence ID",0,8,1,false,"","NUMBER",0,252,0,""],["Message ID",8,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",14,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",16,32,1,false,"","MMSI",2000000,999999999,0,""],["Destination Indicator",48,1,1,false,"","LOOKUP",0,1,0,"BROADCAST_INDICATOR"],["Binary data flag",49,1,1,false,"","NUMBER",0,1,0,""],["Destination ID",52,32,1,false,"","MMSI",2000000,999999999,0,""],["Communication state selector flag",87,1,1,false,"","NUMBER",0,1,0,""],["AIS Transceiver information",110,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Number of Bits in Binary Data Field",120,16,1,false,"","NUMBER",0,65532,0,""]]},"129816":{"name":"AIS Acknowledge (Binary)","fast":true,"fields":[["Sequence ID",0,8,1,false,"","NUMBER",0,252,0,""],["Message ID",8,6,1,false,"","LOOKUP",0,61,0,"AIS_MESSAGE_ID"],["Repeat Indicator",14,2,1,false,"","LOOKUP",0,3,0,"REPEAT_INDICATOR"],["Source ID",16,32,1,false,"","MMSI",2000000,999999999,0,""],["AIS Transceiver information",50,5,1,false,"","LOOKUP",0,29,0,"AIS_TRANSCEIVER"],["Number of Acknowledgments",56,8,1,false,"","NUMBER",0,252,0,""]]},"130052":{"name":"Loran-C TD Data","fast":true,"fields":[["Group Repetition Interval (GRI)",0,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["Master Range",32,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["V Secondary TD",64,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["W Secondary TD",96,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["X Secondary TD",128,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["Y Secondary TD",160,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["Z Secondary TD",192,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["Mode",248,4,1,false,"","LOOKUP",0,13,0,"RESIDUAL_MODE"]]},"130053":{"name":"Loran-C Range Data","fast":true,"fields":[["Group Repetition Interval (GRI)",0,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["Master Range",32,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["V Secondary Range",64,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["W Secondary Range",96,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["X Secondary Range",128,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["Y Secondary Range",160,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["Z Secondary Range",192,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["Mode",248,4,1,false,"","LOOKUP",0,13,0,"RESIDUAL_MODE"]]},"130054":{"name":"Loran-C Signal Data","fast":true,"fields":[["Group Repetition Interval (GRI)",0,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["Station identifier",32,8,1,false,"","STRING_FIX",null,null,0,""],["Station SNR",40,16,0.01,true,"dB","NUMBER",-327.67,327.64,0,""],["Station ECD",56,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""],["Station ASF",88,32,1e-09,true,"s","DURATION",-2.147483647,2.147483644,0,""]]},"130060":{"name":"Label","fast":true,"fields":[["Hardware Channel ID",0,8,1,false,"","NUMBER",0,252,0,""],["PGN",8,24,1,false,"","PGN",0,262143,0,""],["Data Source Instance Field Number",32,8,1,false,"","NUMBER",0,252,0,""],["Data Source Instance Value",40,8,1,false,"","NUMBER",0,252,0,""],["Secondary Enumeration Field Number",48,8,1,false,"","NUMBER",0,252,0,""],["Secondary Enumeration Field Value",56,8,1,false,"","NUMBER",0,252,0,""],["Parameter Field Number",64,8,1,false,"","NUMBER",0,252,0,""]]},"130061":{"name":"Channel Source Configuration","fast":true,"fields":[["Data Source Channel ID",0,8,1,false,"","NUMBER",0,252,0,""],["Source Selection Status",8,2,1,false,"","NUMBER",0,2,0,""],["PGN",88,24,1,false,"","PGN",0,262143,0,""],["Data Source Instance Field Number",112,8,1,false,"","NUMBER",0,252,0,""],["Data Source Instance Value",120,8,1,false,"","NUMBER",0,252,0,""],["Secondary Enumeration Field Number",128,8,1,false,"","NUMBER",0,252,0,""],["Secondary Enumeration Field Value",136,8,1,false,"","NUMBER",0,252,0,""],["Parameter Field Number",144,8,1,false,"","NUMBER",0,252,0,""]]},"130064":{"name":"Route and WP Service - Database List","fast":true,"fields":[["Start Database ID",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of Databases Available",32,16,1,false,"","NUMBER",0,65532,0,""]]},"130065":{"name":"Route and WP Service - Route List","fast":true,"fields":[["Start Route ID",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of Routes in Database",32,16,1,false,"","NUMBER",0,65532,0,""],["Database ID",48,16,1,false,"","NUMBER",0,65532,0,""]]},"130066":{"name":"Route and WP Service - Route/WP-List Attributes","fast":true,"fields":[["Database ID",0,16,1,false,"","NUMBER",0,65532,0,""],["Route ID",16,16,1,false,"","NUMBER",0,65532,0,""]]},"130067":{"name":"Route and WP Service - Route - WP Name & Position","fast":true,"fields":[["Start RPS#",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of WPs in the Route/WP-List",32,16,1,false,"","NUMBER",0,65532,0,""],["Database ID",48,16,1,false,"","NUMBER",0,65532,0,""],["Route ID",64,16,1,false,"","NUMBER",0,65532,0,""]]},"130068":{"name":"Route and WP Service - Route - WP Name","fast":true,"fields":[["Start RPS#",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of WPs in the Route/WP-List",32,16,1,false,"","NUMBER",0,65532,0,""],["Database ID",48,16,1,false,"","NUMBER",0,65532,0,""],["Route ID",64,16,1,false,"","NUMBER",0,65532,0,""]]},"130069":{"name":"Route and WP Service - XTE Limit & Navigation Method","fast":true,"fields":[["Start RPS#",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of WPs with a specific XTE Limit or Nav. Method",32,16,1,false,"","NUMBER",0,65532,0,""]]},"130070":{"name":"Route and WP Service - WP Comment","fast":true,"fields":[["Start ID",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of WPs with Comments",32,16,1,false,"","NUMBER",0,65532,0,""],["Database ID",48,16,1,false,"","NUMBER",0,65532,0,""],["Route ID",64,16,1,false,"","NUMBER",0,65532,0,""]]},"130071":{"name":"Route and WP Service - Route Comment","fast":true,"fields":[["Start Route ID",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of Routes with Comments",32,16,1,false,"","NUMBER",0,65532,0,""],["Database ID",48,16,1,false,"","NUMBER",0,65532,0,""]]},"130072":{"name":"Route and WP Service - Database Comment","fast":true,"fields":[["Start Database ID",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of Databases with Comments",32,16,1,false,"","NUMBER",0,65532,0,""]]},"130073":{"name":"Route and WP Service - Radius of Turn","fast":true,"fields":[["Start RPS#",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of WPs with a specific Radius of Turn",32,16,1,false,"","NUMBER",0,65532,0,""],["Database ID",48,16,1,false,"","NUMBER",0,65532,0,""],["Route ID",64,16,1,false,"","NUMBER",0,65532,0,""]]},"130074":{"name":"Route and WP Service - WP List - WP Name & Position","fast":true,"fields":[["Start WP ID",0,16,1,false,"","NUMBER",0,65532,0,""],["nItems",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of valid WPs in the WP-List",32,16,1,false,"","NUMBER",0,65532,0,""],["Database ID",48,16,1,false,"","NUMBER",0,65532,0,""]]},"130306":{"name":"Wind Data","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Wind Speed",8,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Wind Angle",24,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Reference",40,3,1,false,"","LOOKUP",0,6,0,"WIND_REFERENCE"]]},"130310":{"name":"Environmental Parameters (obsolete)","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Water Temperature",8,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Outside Ambient Air Temperature",24,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Atmospheric Pressure",40,16,100,false,"Pa","NUMBER",0,6553200,0,""]]},"130311":{"name":"Environmental Parameters","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Temperature Source",8,6,1,false,"","LOOKUP",0,61,0,"TEMPERATURE_SOURCE"],["Humidity Source",14,2,1,false,"","LOOKUP",0,2,0,"HUMIDITY_SOURCE"],["Temperature",16,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Humidity",32,16,0.004,true,"%","NUMBER",-131.068,131.056,0,""],["Atmospheric Pressure",48,16,100,false,"Pa","NUMBER",0,6553200,0,""]]},"130312":{"name":"Temperature","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Instance",8,8,1,false,"","NUMBER",0,252,0,""],["Source",16,8,1,false,"","LOOKUP",0,252,0,"TEMPERATURE_SOURCE"],["Actual Temperature",24,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Set Temperature",40,16,0.01,false,"K","NUMBER",0,655.32,0,""]]},"130313":{"name":"Humidity","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Instance",8,8,1,false,"","NUMBER",0,252,0,""],["Source",16,8,1,false,"","LOOKUP",0,252,0,"HUMIDITY_SOURCE"],["Actual Humidity",24,16,0.004,true,"%","NUMBER",-131.068,131.056,0,""],["Set Humidity",40,16,0.004,true,"%","NUMBER",-131.068,131.056,0,""]]},"130314":{"name":"Actual Pressure","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Instance",8,8,1,false,"","NUMBER",0,252,0,""],["Source",16,8,1,false,"","LOOKUP",0,252,0,"PRESSURE_SOURCE"],["Pressure",24,32,0.1,true,"Pa","NUMBER",-214748364.7,214748364.4,0,""]]},"130315":{"name":"Set Pressure","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Instance",8,8,1,false,"","NUMBER",0,252,0,""],["Source",16,8,1,false,"","LOOKUP",0,252,0,"PRESSURE_SOURCE"],["Pressure",24,32,0.1,true,"Pa","NUMBER",-214748364.7,214748364.4,0,""]]},"130316":{"name":"Temperature Extended Range","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Instance",8,8,1,false,"","NUMBER",0,252,0,""],["Source",16,8,1,false,"","LOOKUP",0,252,0,"TEMPERATURE_SOURCE"],["Temperature",24,24,0.001,false,"K","NUMBER",0,16777.212,0,""],["Set Temperature",48,16,0.1,false,"K","NUMBER",0,6553.2,0,""]]},"130320":{"name":"Tide Station Data","fast":true,"fields":[["Mode",0,4,1,false,"","LOOKUP",0,13,0,"RESIDUAL_MODE"],["Tide Tendency",4,2,1,false,"","LOOKUP",0,2,0,"TIDE"],["Measurement Date",8,16,1,false,"d","DATE",0,65532,0,""],["Measurement Time",24,32,0.0001,false,"s","TIME",0,86401,0,""],["Station Latitude",56,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Station Longitude",88,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Tide Level",120,16,0.001,true,"m","NUMBER",-32.767,32.764,0,""],["Tide Level standard deviation",136,16,0.01,false,"m","NUMBER",0,655.32,0,""]]},"130321":{"name":"Salinity Station Data","fast":true,"fields":[["Mode",0,4,1,false,"","LOOKUP",0,13,0,"RESIDUAL_MODE"],["Measurement Date",8,16,1,false,"d","DATE",0,65532,0,""],["Measurement Time",24,32,0.0001,false,"s","TIME",0,86401,0,""],["Station Latitude",56,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Station Longitude",88,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Water Temperature",152,16,0.01,false,"K","NUMBER",0,655.32,0,""]]},"130322":{"name":"Current Station Data","fast":true,"fields":[["Mode",0,4,1,false,"","LOOKUP",0,13,0,"RESIDUAL_MODE"],["State",4,3,1,false,"","LOOKUP",0,6,0,"FLOOD_STATE"],["Measurement Date",8,16,1,false,"d","DATE",0,65532,0,""],["Measurement Time",24,32,0.0001,false,"s","TIME",0,86401,0,""],["Station Latitude",56,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Station Longitude",88,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Measurement Depth",120,32,0.01,false,"m","NUMBER",0,42949672.92,0,""],["Current speed",152,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Current flow direction",168,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Water Temperature",184,16,0.01,false,"K","NUMBER",0,655.32,0,""]]},"130323":{"name":"Meteorological Station Data","fast":true,"fields":[["Mode",0,4,1,false,"","LOOKUP",0,13,0,"RESIDUAL_MODE"],["Measurement Date",8,16,1,false,"d","DATE",0,65532,0,""],["Measurement Time",24,32,0.0001,false,"s","TIME",0,86401,0,""],["Station Latitude",56,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Station Longitude",88,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Wind Speed",120,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Wind Direction",136,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Wind Reference",152,3,1,false,"","LOOKUP",0,6,0,"WIND_REFERENCE"],["Wind Gusts",160,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Atmospheric Pressure",176,16,100,false,"Pa","NUMBER",0,6553200,0,""],["Ambient Temperature",192,16,0.01,false,"K","NUMBER",0,655.32,0,""]]},"130324":{"name":"Moored Buoy Station Data","fast":true,"fields":[["Mode",0,4,1,false,"","LOOKUP",0,13,0,"RESIDUAL_MODE"],["Measurement Date",8,16,1,false,"d","DATE",0,65532,0,""],["Measurement Time",24,32,0.0001,false,"s","TIME",0,86401,0,""],["Station Latitude",56,32,1e-07,true,"deg","NUMBER",-90,90,0,""],["Station Longitude",88,32,1e-07,true,"deg","NUMBER",-180,180,0,""],["Wind Speed",120,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Wind Direction",136,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Wind Reference",152,3,1,false,"","LOOKUP",0,6,0,"WIND_REFERENCE"],["Wind Gusts",160,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Wave Height",176,16,0.01,false,"m","NUMBER",0,655.32,0,""],["Dominant Wave Period",192,16,0.01,false,"s","DURATION",0,655.32,0,""],["Atmospheric Pressure",208,16,100,false,"Pa","NUMBER",0,6553200,0,""],["Pressure Tendency Rate",224,16,10,true,"Pa/hr","NUMBER",-327670,327640,0,""],["Air Temperature",240,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Water Temperature",256,16,0.01,false,"K","NUMBER",0,655.32,0,""]]},"130329":{"name":"HVAC Status","fast":true,"fields":[["HVAC Identifier",0,8,1,false,"","NUMBER",0,252,0,""],["Location",8,8,1,false,"","NUMBER",0,252,0,""],["Operating Mode",16,4,1,false,"","NUMBER",0,13,0,""],["Control Operating State",20,4,1,false,"","NUMBER",0,13,0,""],["Power",24,2,1,false,"","LOOKUP",0,2,0,"OFF_ON"],["Fan Speed Mode Changeable",26,2,1,false,"","NUMBER",0,2,0,""],["Fan Speed Mode",28,2,1,false,"","NUMBER",0,2,0,""],["Fan Operation Mode",30,2,1,false,"","NUMBER",0,2,0,""],["Fan Speed Available",32,8,1,false,"","NUMBER",0,252,0,""],["Fan Speed",40,8,1,false,"","NUMBER",0,252,0,""],["Setpoint Type",48,8,1,false,"","NUMBER",0,252,0,""],["Lower Temperature Setpoint",56,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Upper Temperature Setpoint",72,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Lower Humidity Setpoint",88,8,1,true,"","NUMBER",-127,124,0,""],["Upper Humidity Setpoint",96,8,1,true,"","NUMBER",-127,124,0,""],["Auxiliary Heat Control Supported",104,4,1,false,"","NUMBER",0,13,0,""],["Auxiliary Heat Automatic Mode",108,2,1,false,"","NUMBER",0,2,0,""],["Auxiliary Heat State",110,2,1,false,"","NUMBER",0,2,0,""],["Current Temperature",112,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Current Humidity",128,8,1,true,"","NUMBER",-127,124,0,""],["Supported Modes",136,16,1,false,"","NUMBER",0,65532,0,""],["Sea Water Temperature",152,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Loop Temperature",168,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Evaporator Temperature",184,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Inlet Temperature",200,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Inlet Humidity",216,8,1,true,"","NUMBER",-127,124,0,""]]},"130330":{"name":"Lighting System Settings","fast":true,"fields":[["Global Enable",0,2,1,false,"","NUMBER",0,2,0,""],["Default Settings/Command",2,3,1,false,"","LOOKUP",0,6,0,"LIGHTING_COMMAND"]]},"130560":{"name":"Payload Mass","fast":false,"fields":[["SID",0,8,1,false,"","NUMBER",0,252,0,""],["Measurement Status",8,3,1,false,"","NUMBER",0,6,0,""],["Measurement ID",16,8,1,false,"","NUMBER",0,252,0,""],["Payload Mass",24,32,1,false,"","NUMBER",0,4294967292,0,""]]},"130561":{"name":"Lighting Zone","fast":true,"fields":[["Zone Index",0,8,1,false,"","NUMBER",0,252,0,""]]},"130562":{"name":"Lighting Scene","fast":true,"fields":[["Scene Index",0,8,1,false,"","NUMBER",0,252,0,""]]},"130563":{"name":"Lighting Device","fast":true,"fields":[["Device ID",0,32,1,false,"","NUMBER",0,4294967292,0,""],["Device Capabilities",32,8,1,false,"","NUMBER",0,252,0,""],["Color Capabilities",40,8,1,false,"","NUMBER",0,252,0,""],["Zone Index",48,8,1,false,"","NUMBER",0,252,0,""]]},"130564":{"name":"Lighting Device Enumeration","fast":true,"fields":[["Index of First Device",0,16,1,false,"","NUMBER",0,65532,0,""],["Total Number of Devices",16,16,1,false,"","NUMBER",0,65532,0,""],["Number of Devices",32,16,1,false,"","NUMBER",0,65532,0,""]]},"130565":{"name":"Lighting Color Sequence","fast":true,"fields":[["Sequence Index",0,8,1,false,"","NUMBER",0,252,0,""],["Color Count",8,8,1,false,"","NUMBER",0,252,0,""]]},"130566":{"name":"Lighting Program","fast":true,"fields":[["Program ID",0,8,1,false,"","NUMBER",0,252,0,""]]},"130567":{"name":"Watermaker Input Setting and Status","fast":true,"fields":[["Watermaker Operating State",0,6,1,false,"","LOOKUP",0,61,0,"WATERMAKER_STATE"],["Production Start/Stop",6,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Rinse Start/Stop",8,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Low Pressure Pump Status",10,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["High Pressure Pump Status",12,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Emergency Stop",14,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Product Solenoid Valve Status",16,2,1,false,"","LOOKUP",0,2,0,"OK_WARNING"],["Flush Mode Status",18,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Salinity Status",20,2,1,false,"","LOOKUP",0,2,0,"OK_WARNING"],["Sensor Status",22,2,1,false,"","LOOKUP",0,2,0,"OK_WARNING"],["Oil Change Indicator Status",24,2,1,false,"","LOOKUP",0,2,0,"OK_WARNING"],["Filter Status",26,2,1,false,"","LOOKUP",0,2,0,"OK_WARNING"],["System Status",28,2,1,false,"","LOOKUP",0,2,0,"OK_WARNING"],["Salinity",32,16,1,false,"ppm","NUMBER",0,65532,0,""],["Product Water Temperature",48,16,0.01,false,"K","NUMBER",0,655.32,0,""],["Pre-filter Pressure",64,16,100,false,"Pa","NUMBER",0,6553200,0,""],["Post-filter Pressure",80,16,100,false,"Pa","NUMBER",0,6553200,0,""],["Feed Pressure",96,16,1000,true,"Pa","NUMBER",-32767000,32764000,0,""],["System High Pressure",112,16,1000,false,"Pa","NUMBER",0,65532000,0,""],["Product Water Flow",128,16,0.1,true,"L/h","NUMBER",-3276.7,3276.4,0,""],["Brine Water Flow",144,16,0.1,true,"L/h","NUMBER",-3276.7,3276.4,0,""],["Run Time",160,32,1,false,"s","DURATION",0,4294967292,0,""]]},"130568":{"name":"Entertainment - Diagnostic Status","fast":true,"fields":[["Source",0,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_SOURCE"],["Number",8,8,1,false,"","NUMBER",0,252,0,""],["Diagnostic Mode",16,8,1,false,"","NUMBER",0,252,0,""]]},"130569":{"name":"Current Status and File","fast":true,"fields":[["Zone",0,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_ZONE"],["Source",8,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_SOURCE"],["Number",16,8,1,false,"","NUMBER",0,252,0,""],["ID",24,32,1,false,"","NUMBER",0,4294967292,0,""],["Play status",56,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_PLAY_STATUS"],["Elapsed Track Time",64,16,1,false,"s","DURATION",0,65532,0,""],["Track Time",80,16,1,false,"s","DURATION",0,65532,0,""],["Repeat Status",96,4,1,false,"","LOOKUP",0,13,0,"ENTERTAINMENT_REPEAT_STATUS"],["Shuffle Status",100,4,1,false,"","LOOKUP",0,13,0,"ENTERTAINMENT_SHUFFLE_STATUS"],["Save Favorite Number",104,8,1,false,"","NUMBER",0,252,0,""],["Play Favorite Number",112,16,1,false,"","NUMBER",0,65532,0,""],["Thumbs Up/Down",128,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_LIKE_STATUS"],["Signal Strength",136,8,1,false,"%","NUMBER",0,252,0,""],["Radio Frequency",144,32,10,false,"Hz","NUMBER",0,42949672920,0,""],["HD Frequency Multicast",176,8,1,false,"","NUMBER",0,252,0,""],["Delete Favorite Number",184,8,1,false,"","NUMBER",0,252,0,""],["Total Number of Tracks",192,16,1,false,"","NUMBER",0,65532,0,""]]},"130570":{"name":"Library Data File","fast":true,"fields":[["Source",0,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_SOURCE"],["Number",8,8,1,false,"","NUMBER",0,252,0,""],["ID",16,32,1,false,"","NUMBER",0,4294967292,0,""],["Type",48,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_TYPE"]]},"130571":{"name":"Library Data Group","fast":true,"fields":[["Source",0,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_SOURCE"],["Number",8,8,1,false,"","NUMBER",0,252,0,""],["Type",16,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_TYPE"],["Zone",24,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_ZONE"],["Group ID",32,32,1,false,"","NUMBER",0,4294967292,0,""],["ID offset",64,16,1,false,"","NUMBER",0,65532,0,""],["ID count",80,16,1,false,"","NUMBER",0,65532,0,""],["Total ID count",96,16,1,false,"","NUMBER",0,65532,0,""]]},"130572":{"name":"Library Data Search","fast":true,"fields":[["Source",0,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_SOURCE"],["Number",8,8,1,false,"","NUMBER",0,252,0,""],["Group ID",16,32,1,false,"","NUMBER",0,4294967292,0,""],["Group type 1",48,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_GROUP"]]},"130573":{"name":"Supported Source Data","fast":true,"fields":[["ID offset",0,16,1,false,"","NUMBER",0,65532,0,""],["ID count",16,16,1,false,"","NUMBER",0,65532,0,""],["Total ID count",32,16,1,false,"","NUMBER",0,65532,0,""]]},"130574":{"name":"Supported Zone Data","fast":true,"fields":[["First zone ID",0,8,1,false,"","NUMBER",0,252,0,""],["Zone count",8,8,1,false,"","NUMBER",0,252,0,""],["Total zone count",16,8,1,false,"","NUMBER",0,252,0,""]]},"130575":{"name":"Entertainment - Parental Control Status","fast":true,"fields":[["Source",0,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_SOURCE"],["Number",8,8,1,false,"","NUMBER",0,252,0,""],["Lock Type",16,4,1,false,"","NUMBER",0,13,0,""],["Lock Status",20,2,1,false,"","NUMBER",0,2,0,""],["File / Station ID",24,32,1,false,"","NUMBER",0,4294967292,0,""]]},"130576":{"name":"Small Craft Status","fast":false,"fields":[["Port trim tab",0,8,1,true,"%","NUMBER",-127,124,0,""],["Starboard trim tab",8,8,1,true,"%","NUMBER",-127,124,0,""]]},"130577":{"name":"Direction Data","fast":true,"fields":[["Data Mode",0,4,1,false,"","LOOKUP",0,13,0,"RESIDUAL_MODE"],["COG Reference",4,2,1,false,"","LOOKUP",0,2,0,"DIRECTION_REFERENCE"],["SID",8,8,1,false,"","NUMBER",0,252,0,""],["COG",16,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["SOG",32,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Heading",48,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Speed through Water",64,16,0.01,false,"m/s","NUMBER",0,655.32,0,""],["Set",80,16,0.0001,false,"rad","NUMBER",0,6.28318530717959,0,""],["Drift",96,16,0.01,false,"m/s","NUMBER",0,655.32,0,""]]},"130578":{"name":"Vessel Speed Components","fast":true,"fields":[["Longitudinal Speed, Water-referenced",0,16,0.001,true,"m/s","NUMBER",-32.767,32.764,0,""],["Transverse Speed, Water-referenced",16,16,0.001,true,"m/s","NUMBER",-32.767,32.764,0,""],["Longitudinal Speed, Ground-referenced",32,16,0.001,true,"m/s","NUMBER",-32.767,32.764,0,""],["Transverse Speed, Ground-referenced",48,16,0.001,true,"m/s","NUMBER",-32.767,32.764,0,""],["Stern Speed, Water-referenced",64,16,0.001,true,"m/s","NUMBER",-32.767,32.764,0,""],["Stern Speed, Ground-referenced",80,16,0.001,true,"m/s","NUMBER",-32.767,32.764,0,""]]},"130579":{"name":"System Configuration","fast":false,"fields":[["Power",0,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Default Settings",2,2,1,false,"","LOOKUP",0,2,0,"ENTERTAINMENT_DEFAULT_SETTINGS"],["Tuner regions",4,4,1,false,"","LOOKUP",0,13,0,"ENTERTAINMENT_REGIONS"],["Max favorites",8,8,1,false,"","NUMBER",0,252,0,""],["Video protocols",16,4,1,false,"","LOOKUP",0,13,0,"VIDEO_PROTOCOLS"]]},"130580":{"name":"System Configuration (deprecated)","fast":true,"fields":[["Power",0,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Default Settings",2,2,1,false,"","LOOKUP",0,2,0,"ENTERTAINMENT_DEFAULT_SETTINGS"],["Tuner regions",4,4,1,false,"","LOOKUP",0,13,0,"ENTERTAINMENT_REGIONS"],["Max favorites",8,8,1,false,"","NUMBER",0,252,0,""]]},"130581":{"name":"Zone Configuration (deprecated)","fast":true,"fields":[["First zone ID",0,8,1,false,"","NUMBER",0,252,0,""],["Zone count",8,8,1,false,"","NUMBER",0,252,0,""],["Total zone count",16,8,1,false,"","NUMBER",0,252,0,""]]},"130582":{"name":"Zone Volume","fast":false,"fields":[["Zone ID",0,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_ZONE"],["Volume",8,8,1,false,"%","NUMBER",0,252,0,""],["Volume change",16,2,1,false,"","LOOKUP",0,2,0,"ENTERTAINMENT_VOLUME_CONTROL"],["Mute",18,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Channel",24,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_CHANNEL"]]},"130583":{"name":"Available Audio EQ presets","fast":true,"fields":[["First preset",0,8,1,false,"","NUMBER",0,252,0,""],["Preset count",8,8,1,false,"","NUMBER",0,252,0,""],["Total preset count",16,8,1,false,"","NUMBER",0,252,0,""]]},"130584":{"name":"Available Bluetooth addresses","fast":true,"fields":[["First address",0,8,1,false,"","NUMBER",0,252,0,""],["Address count",8,8,1,false,"","NUMBER",0,252,0,""],["Total address count",16,8,1,false,"","NUMBER",0,252,0,""]]},"130585":{"name":"Bluetooth source status","fast":false,"fields":[["Source number",0,8,1,false,"","NUMBER",0,252,0,""],["Status",8,4,1,false,"","LOOKUP",0,13,0,"BLUETOOTH_SOURCE_STATUS"],["Forget device",12,2,1,false,"","LOOKUP",0,2,0,"YES_NO"],["Discovering",14,2,1,false,"","LOOKUP",0,2,0,"YES_NO"]]},"130586":{"name":"Zone Configuration","fast":true,"fields":[["Zone ID",0,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_ZONE"],["Volume limit",8,8,1,false,"%","NUMBER",0,252,0,""],["Fade",16,8,1,true,"%","NUMBER",-127,124,0,""],["Balance",24,8,1,true,"%","NUMBER",-127,124,0,""],["Sub volume",32,8,1,false,"%","NUMBER",0,252,0,""],["EQ - Treble",40,8,1,true,"%","NUMBER",-127,124,0,""],["EQ - Mid range",48,8,1,true,"%","NUMBER",-127,124,0,""],["EQ - Bass",56,8,1,true,"%","NUMBER",-127,124,0,""],["Preset type",64,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_EQ"],["Audio filter",72,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_FILTER"],["High pass filter frequency",80,16,1,false,"Hz","NUMBER",0,65532,0,""],["Low pass filter frequency",96,16,1,false,"Hz","NUMBER",0,65532,0,""],["Channel",112,8,1,false,"","LOOKUP",0,252,0,"ENTERTAINMENT_CHANNEL"]]}},"lookups":{"AGS_GENERATING_STATE":{"0":"Preheating","1":"Start delay","2":"Cranking","3":"Starter cooling","4":"Warming up","5":"Cooling down","6":"Spinning up","7":"Shutdown bypass","8":"Stopping","9":"Running","10":"Stopped","11":"Crank delaty"},"AGS_MODE":{"0":"Off","1":"On","2":"Automatic"},"AGS_OFF_REASON":{"0":"Not off","1":"DC voltage high","2":"Battery state of charge high","3":"AC current low","4":"Contact opened","5":"Reached absorption","6":"Reached float","7":"Manual off","8":"Max run time","9":"Max auto cycle","10":"Exercise done","11":"Quiet time","12":"External off via AGS","13":"Safe mode","14":"External off via generator","15":"External shutdown","16":"Auto off","17":"Fault","18":"Unable to start"},"AGS_ON_REASON":{"0":"Not on","1":"DC voltage low","2":"Battery state of charge low","3":"AC current high","4":"Contact closed","5":"Manual on","6":"Exercise","7":"Non Quiet time","8":"External on via AGS","9":"External on via generator","10":"Unable to stop"},"AGS_OPERATING_STATE":{"0":"Quiet time","1":"Auto on","2":"Auto off","3":"Manual On","4":"Manual Off","5":"Generator shutdown","6":"External shutdown","7":"Fault","8":"Suspend","9":"Not operating"},"AIS_ASSIGNED_MODE":{"0":"Autonomous and continuous","1":"Assigned mode"},"AIS_BAND":{"0":"Top 525 kHz of marine band","1":"Entire marine band"},"AIS_COMMUNICATION_STATE":{"0":"SOTDMA","1":"ITDMA"},"AIS_MESSAGE_ID":{"1":"Scheduled Class A position report","2":"Assigned scheduled Class A position report","3":"Interrogated Class A position report","4":"Base station report","5":"Static and voyage related data","6":"Binary addressed message","7":"Binary acknowledgement","8":"Binary broadcast message","9":"Standard SAR aircraft position report","10":"UTC/date inquiry","11":"UTC/date response","12":"Safety related addressed message","13":"Safety related acknowledgement","14":"Satety related broadcast message","15":"Interrogation","16":"Assignment mode command","17":"DGNSS broadcast binary message","18":"Standard Class B position report","19":"Extended Class B position report","20":"Data link management message","21":"ATON report","22":"Channel management","23":"Group assignment command","24":"Static data report","25":"Single slot binary message","26":"Multiple slot binary message","27":"Position report for long range applications"},"AIS_MODE":{"0":"Autonomous","1":"Assigned"},"AIS_SPECIAL_MANEUVER":{"0":"Not available","1":"Not engaged in special maneuver","2":"Engaged in special maneuver","3":"Reserved"},"AIS_TRANSCEIVER":{"0":"Channel A VDL reception","1":"Channel B VDL reception","2":"Channel A VDL transmission","3":"Channel B VDL transmission","4":"Own information not broadcast","5":"Reserved"},"AIS_TYPE":{"0":"SOTDMA","1":"CS"},"AIS_VERSION":{"0":"ITU-R M.1371-1","1":"ITU-R M.1371-3","2":"ITU-R M.1371-5","3":"ITU-R M.1371 future edition"},"ALERT_CATEGORY":{"0":"Navigational","1":"Technical"},"ALERT_LANGUAGE_ID":{"0":"English (US)","1":"English (UK)","2":"Arabic","3":"Chinese (simplified)","4":"Croatian","5":"Danish","6":"Dutch","7":"Finnish","8":"French","9":"German","10":"Greek","11":"Italian","12":"Japanese","13":"Korean","14":"Norwegian","15":"Polish","16":"Portuguese","17":"Russian","18":"Spanish","19":"Swedish"},"ALERT_RESPONSE_COMMAND":{"0":"Acknowledge","1":"Temporary Silence","2":"Test Command off","3":"Test Command on"},"ALERT_STATE":{"0":"Disabled","1":"Normal","2":"Active","3":"Silenced","4":"Acknowledged","5":"Awaiting Acknowledge"},"ALERT_THRESHOLD_STATUS":{"0":"Normal","1":"Threshold Exceeded","2":"Extreme Threshold Exceeded","3":"Low Threshold Exceeded","4":"Acknowledged","5":"Awaiting Acknowledge"},"ALERT_TRIGGER_CONDITION":{"0":"Manual","1":"Auto","2":"Test","3":"Disabled"},"ALERT_TYPE":{"1":"Emergency Alarm","2":"Alarm","5":"Warning","8":"Caution"},"ATON_TYPE":{"0":"Default: Type of AtoN not specified","1":"Reference point","2":"RACON","3":"Fixed structure off-shore","4":"Reserved for future use","5":"Fixed light: without sectors","6":"Fixed light: with sectors","7":"Fixed leading light front","8":"Fixed leading light rear","9":"Fixed beacon: cardinal N","10":"Fixed beacon: cardinal E","11":"Fixed beacon: cardinal S","12":"Fixed beacon: cardinal W","13":"Fixed beacon: port hand","14":"Fixed beacon: starboard hand","15":"Fixed beacon: preferred channel port hand","16":"Fixed beacon: preferred channel starboard hand","17":"Fixed beacon: isolated danger","18":"Fixed beacon: safe water","19":"Fixed beacon: special mark","20":"Floating AtoN: cardinal N","21":"Floating AtoN: cardinal E","22":"Floating AtoN: cardinal S","23":"Floating AtoN: cardinal W","24":"Floating AtoN: port hand mark","25":"Floating AtoN: starboard hand mark","26":"Floating AtoN: preferred channel port hand","27":"Floating AtoN: preferred channel starboard hand","28":"Floating AtoN: isolated danger","29":"Floating AtoN: safe water","30":"Floating AtoN: special mark","31":"Floating AtoN: light vessel/LANBY/rigs"},"AVAILABLE":{"0":"Available","1":"Not available"},"BANDWIDTH":{"0":"Default","1":"12.5 kHz"},"BATTERY_CHEMISTRY":{"0":"Pb (Lead)","1":"Li","2":"NiCd","3":"ZnO","4":"NiMH"},"BATTERY_TYPE":{"0":"Flooded","1":"Gel","2":"AGM"},"BATTERY_VOLTAGE":{"0":"6V","1":"12V","2":"24V","3":"32V","4":"36V","5":"42V","6":"48V"},"BEARING_MODE":{"0":"Great Circle","1":"Rhumbline"},"BLUETOOTH_SOURCE_STATUS":{"0":"Reserved","1":"Connected","2":"Connecting","3":"Not connected"},"BROADCAST_INDICATOR":{"0":"Broadcast geo area message","1":"Addressed message"},"CERTIFICATION_LEVEL":{"0":"Level A","1":"Level B"},"CHARGER_MODE":{"0":"Standalone","1":"Primary","2":"Secondary","3":"Echo"},"CHARGER_STATE":{"0":"Not charging","1":"Bulk","2":"Absorption","3":"Overcharge","4":"Equalise","5":"Float","6":"No float","7":"Constant VI","8":"Disabled","9":"Fault"},"CHARGING_ALGORITHM":{"0":"Trickle","1":"Constant voltage / Constant current","2":"2 stage (no float)","3":"3 stage"},"CONTROLLER_STATE":{"0":"Error Active","1":"Error Passive","2":"Bus Off"},"CONVERTER_STATE":{"0":"Off","1":"Low Power Mode","2":"Fault","3":"Bulk","4":"Absorption","5":"Float","6":"Storage","7":"Equalize","8":"Pass thru","9":"Inverting","10":"Assisting"},"DC_SOURCE":{"0":"Battery","1":"Alternator","2":"Convertor","3":"Solar cell","4":"Wind generator"},"DEVICE_CLASS":{"0":"Reserved for 2000 Use","10":"System tools","20":"Safety systems","25":"Internetwork device","30":"Electrical Distribution","35":"Electrical Generation","40":"Steering and Control surfaces","50":"Propulsion","60":"Navigation","70":"Communication","75":"Sensor Communication Interface","80":"Instrumentation/general systems","85":"External Environment","90":"Internal Environment","100":"Deck + cargo + fishing equipment systems","110":"Human Interface","120":"Display","125":"Entertainment"},"DEVICE_TEMP_STATE":{"0":"Cold","1":"Warm","2":"Hot"},"DGNSS_MODE":{"0":"None","1":"SBAS if available","3":"SBAS"},"DIFFERENTIAL_MODE":{"0":"Manual","1":"Auto Power","2":"Auto Range"},"DIFFERENTIAL_SOURCE":{"0":"Auto","1":"Loran","2":"MSK Beacon","3":"FM Subcarrier","4":"AIS","5":"Ground based radio","6":"SBAS","7":"Satellite"},"DIRECTION":{"0":"Forward","1":"Reverse"},"DIRECTION_REFERENCE":{"0":"True","1":"Magnetic","2":"Error"},"DIRECTION_RUDDER":{"0":"No Order","1":"Move to starboard","2":"Move to port"},"DOCKING_STATUS":{"0":"Not docked","1":"Fully docked"},"ENGINE_INSTANCE":{"0":"Single Engine or Dual Engine Port","1":"Dual Engine Starboard"},"ENTERTAINMENT_CHANNEL":{"0":"All channels","1":"Stereo full range","2":"Stereo front","3":"Stereo back","4":"Stereo surround","5":"Center","6":"Subwoofer","7":"Front left","8":"Front right","9":"Back left","10":"Back right","11":"Surround left","12":"Surround right"},"ENTERTAINMENT_DEFAULT_SETTINGS":{"0":"Save current settings as user default","1":"Load user default","2":"Load manufacturer default"},"ENTERTAINMENT_EQ":{"0":"Flat","1":"Rock","2":"Hall","3":"Jazz","4":"Pop","5":"Live","6":"Classic","7":"Vocal","8":"Arena","9":"Cinema","10":"Custom"},"ENTERTAINMENT_FILTER":{"0":"Full range","1":"High pass","2":"Low pass","3":"Band pass","4":"Notch filter"},"ENTERTAINMENT_GROUP":{"0":"File","1":"Playlist Name","2":"Genre Name","3":"Album Name","4":"Artist Name","5":"Track Name","6":"Station Name","7":"Station Number","8":"Favourite Number","9":"Play Queue","10":"Content Info"},"ENTERTAINMENT_LIKE_STATUS":{"0":"None","1":"Thumbs up","2":"Thumbs down"},"ENTERTAINMENT_PLAY_STATUS":{"0":"Play","1":"Pause","2":"Stop","3":"FF 1x","4":"FF 2x","5":"FF 3x","6":"FF 4x","7":"RW 1x","8":"RW 2x","9":"RW 3x","10":"RW 4x","11":"Skip ahead","12":"Skip back","13":"Jog ahead","14":"Jog back","15":"Seek up","16":"Seek down","17":"Scan up","18":"Scan down","19":"Tune up","20":"Tune down","21":"Slow motion .75x","22":"Slow motion .5x","23":"Slow motion .25x","24":"Slow motion .125x"},"ENTERTAINMENT_REGIONS":{"0":"USA","1":"Europe","2":"Asia","3":"Middle East","4":"Latin America","5":"Australia","6":"Russia","7":"Japan"},"ENTERTAINMENT_REPEAT_STATUS":{"0":"Off","1":"One","2":"All"},"ENTERTAINMENT_SHUFFLE_STATUS":{"0":"Off","1":"Play queue","2":"All"},"ENTERTAINMENT_SOURCE":{"0":"Vessel alarm","1":"AM","2":"FM","3":"Weather","4":"DAB","5":"Aux","6":"USB","7":"CD","8":"MP3","9":"Apple iOS","10":"Android","11":"Bluetooth","12":"Sirius XM","13":"Pandora","14":"Spotify","15":"Slacker","16":"Songza","17":"Apple Radio","18":"Last FM","19":"Ethernet","20":"Video MP4","21":"Video DVD","22":"Video BluRay","23":"HDMI","24":"Video"},"ENTERTAINMENT_TYPE":{"0":"File","1":"Playlist Name","2":"Genre Name","3":"Album Name","4":"Artist Name","5":"Track Name","6":"Station Name","7":"Station Number","8":"Favourite Number","9":"Play Queue","10":"Content Info"},"ENTERTAINMENT_VOLUME_CONTROL":{"0":"Up","1":"Down"},"ENTERTAINMENT_ZONE":{"0":"All zones","1":"Zone 1","2":"Zone 2","3":"Zone 3","4":"Zone 4"},"EQUIPMENT_STATUS":{"0":"Operational","1":"Fault"},"FLOOD_STATE":{"0":"Flood","1":"Slack","2":"Ebb"},"GEAR_STATUS":{"0":"Forward","1":"Neutral","2":"Reverse"},"GNS":{"0":"GPS","1":"GLONASS","2":"GPS+GLONASS","3":"GPS+SBAS/WAAS","4":"GPS+SBAS/WAAS+GLONASS","5":"Chayka","6":"integrated","7":"surveyed","8":"Galileo"},"GNSS_MODE":{"0":"1D","1":"2D","2":"3D","3":"Auto"},"GNS_INTEGRITY":{"0":"No integrity checking","1":"Safe","2":"Caution","3":"Unsafe"},"GNS_METHOD":{"0":"no GNSS","1":"GNSS fix","2":"DGNSS fix","3":"Precise GNSS","4":"RTK Fixed Integer","5":"RTK float","6":"Estimated (DR) mode","7":"Manual Input","8":"Simulate mode"},"GOOD_WARNING_ERROR":{"0":"Good","1":"Warning","2":"Error"},"HUMIDITY_SOURCE":{"0":"Inside","1":"Outside"},"INDUSTRY_CODE":{"0":"Global","1":"Highway","2":"Agriculture","3":"Construction","4":"Marine Industry","5":"Industrial"},"INVERTER_MODE":{"0":"Standalone","1":"Series Master","2":"Series Slave","3":"Parallel Master","4":"Parallel Slave"},"INVERTER_STATE":{"0":"Invert","1":"AC passthru","2":"Load sense","3":"Fault","4":"Disabled"},"LIGHTING_COMMAND":{"0":"Idle","1":"Detect Devices","2":"Reboot","3":"Factory Reset","4":"Powering Up"},"LOW_BATTERY":{"0":"Good","1":"Low"},"MAGNETIC_VARIATION":{"0":"Manual","1":"Automatic Chart","2":"Automatic Table","3":"Automatic Calculation","4":"WMM 2000","5":"WMM 2005","6":"WMM 2010","7":"WMM 2015","8":"WMM 2020","9":"WMM 2025"},"MANUFACTURER_CODE":{"69":"ARKS Enterprises","78":"FW Murphy/Enovation Controls","80":"Twin Disc","85":"Kohler Power Systems","88":"Hemisphere GPS","135":"Airmar","137":"Maretron","140":"Lowrance","144":"Mercury Marine","147":"Nautibus Electronic","148":"Blue Water Data","154":"Westerbeke","157":"ISSPRO","161":"Offshore Systems (UK)","163":"Evinrude/BRP","165":"CPAC Systems","168":"Xantrex Technology","169":"Marlin Technologies","172":"Yanmar Marine","174":"Volvo Penta","176":"Carling Technologies Inc. (Moritz Aerospace)","185":"Beede Instruments","192":"Floscan Instrument","193":"Nobeltec","198":"Mystic Valley Communications","199":"Actia","201":"Disenos Y Technologia","211":"Digital Switching Systems","215":"Xintex/Atena","224":"EMMI NETWORK","228":"ZF","229":"Garmin","233":"Yacht Monitoring Solutions","235":"Sailormade Marine Telemetry/Tetra Technology","243":"Eride","257":"Honda Motor","272":"Groco","273":"Actisense","274":"Amphenol LTW Technology","275":"Navico","283":"Hamilton Jet","285":"Sea Recovery","286":"Coelmo SRL Italy","295":"BEP Marine","304":"Empir Bus","305":"NovAtel","306":"Sleipner Motor","307":"MBW Technologies","315":"ICOM","328":"Qwerty","329":"Dief","341":"Boening Automationstechnologie","345":"Korean Maritime University","351":"Thrane and Thrane","355":"Mastervolt","356":"Fischer Panda Generators","358":"Victron Energy","370":"Rolls Royce Marine","373":"Electronic Design","374":"Northern Lights","378":"Glendinning","381":"B & G","384":"Rose Point Navigation Systems","385":"Johnson Outdoors Marine Electronics Inc Geonav","394":"Capi 2","396":"Beyond Measure","400":"Livorsi Marine","404":"ComNav","409":"Chetco","419":"Fusion Electronics","421":"Standard Horizon","422":"True Heading","426":"Egersund Marine Electronics","427":"em-trak Marine Electronics","431":"Tohatsu Co, JP","437":"Digital Yacht","438":"Comar Systems Limited","440":"Cummins","443":"VDO (aka Continental-Corporation)","451":"Parker Hannifin aka Village Marine Tech","459":"Alltek Marine Electronics","460":"SAN GIORGIO S.E.I.N","466":"Veethree Electronics & Marine","470":"SI-TEX Marine Electronics","471":"Sea Cross Marine","475":"GME aka Standard Communications","476":"Humminbird Marine Electronics","478":"Ocean Sat","481":"Chetco Digital Instruments","493":"Watcheye","499":"Lcj Capteurs","502":"Attwood Marine","503":"Naviop S.R.L.","504":"Vesper Marine","510":"Marinesoft","513":"Simarine","517":"NoLand Engineering","518":"Transas USA","529":"National Instruments Korea","530":"National Marine Electronics Association","532":"Onwa Marine","540":"Webasto","571":"Marinecraft (South Korea)","573":"McMurdo Group aka Orolia","578":"Advansea","579":"KVH","580":"San Jose Technology","583":"Yacht Control","586":"Suzuki Motor","591":"US Coast Guard","595":"Ship Module aka Customware","600":"Aquatic AV","605":"Aventics","606":"Intellian","612":"SamwonIT","614":"Arlt Tecnologies","637":"Bavaria Yachts","641":"Diverse Yacht Services","644":"Wema U.S.A dba KUS","658":"Shenzhen Jiuzhou Himunication","688":"Rockford","699":"Harman International","704":"JL Audio","708":"Lars Thrane","715":"Autonnic","717":"Yacht Devices","734":"REAP Systems","735":"AEM Performance Electronics","739":"LxNav","741":"Littelfuse, Inc (formerly Carling Technologies)","743":"DaeMyung","744":"Woosung","748":"ISOTTA IFRA srl","773":"Clarion US","776":"HMI Systems","777":"Ocean Signal","778":"Seakeeper","781":"Poly Planar","785":"Fischer Panda DE","795":"Broyda Industries","796":"Canadian Automotive","797":"Tides Marine","798":"Lumishore","799":"Still Water Designs and Audio","802":"BJ Technologies (Beneteau)","803":"Gill Sensors","811":"Blue Water Desalination","815":"FLIR","824":"Undheim Systems","826":"Lewmar","838":"TeamSurv","844":"Fell Marine","847":"Oceanvolt","862":"Prospec","868":"Data Panel","890":"L3 Technologies","894":"Rhodan Marine Systems","896":"Nexfour Solutions","905":"ASA Electronics","909":"Marines Co (South Korea)","911":"Nautic-on","917":"Sentinel","929":"JL Marine Systems","930":"Ecotronix","944":"Zontisa Marine","951":"EXOR International","962":"Timbolier Industries","963":"TJC Micro","968":"Cox Powertrain","969":"Blue Seas","981":"Kobelt Manufacturing","992":"Blue Ocean IOT","997":"Xenta Systems","999":"Signal K","1004":"Ultraflex","1008":"Lintest SmartBoat","1011":"Soundmax","1020":"Team Italia Marine (Onyx Marine Automation s.r.l)","1021":"Entratech","1022":"ITC","1029":"The Marine Guardian","1047":"Sonic","1051":"ProNav","1053":"Vetus Maxwell INC.","1056":"Lithium Pros","1059":"Boatrax","1062":"Marol Co ltd","1065":"CALYPSO Instruments","1066":"Spot Zero Water","1069":"Lithionics Battery","1070":"Quick-teck Electronics","1075":"Uniden America","1083":"Nauticoncept","1084":"Shadow-Caster LED lighting","1085":"Wet Sounds","1088":"E-T-A Circuit Breakers","1092":"Scheiber","1100":"Smart Yachts International Limited","1109":"Dockmate","1114":"Bobs Machine","1118":"L3Harris ASV","1119":"Balmar","1120":"Elettromedia","1127":"Electromaax","1140":"Across Oceans Systems","1145":"Kiwi Yachting","1150":"BSB Artificial Intelligence","1151":"Orca Technologies","1154":"TBS Electronics","1158":"Technoton Electroics","1160":"MG Energy Systems","1169":"Sea Machine Robotics","1171":"Vista Manufacturing","1183":"Zipwake","1186":"Sailmon","1192":"Airmoniq Pro Kft","1194":"Sierra Marine","1200":"Xinuo Information Technology (Xiamen)","1218":"Septentrio","1233":"NKE Marine Electronics","1238":"SuperTrack Aps","1239":"Honda Electronics","1245":"Raritan Engineering","1249":"Integrated Power Solutions AG","1260":"Interactive Technologies","1283":"LTG-Tech","1299":"Energy Solutions (UK)","1300":"WATT Fuel Cell","1302":"Pro Mainer","1305":"Dragonfly Energy","1306":"Koden Electronics","1311":"Humphree","1316":"Hinkley Yachts","1317":"Global Marine Management GmbH (GMM)","1320":"Triskel Marine","1330":"Warwick Control Technologies","1331":"Dolphin Charger","1337":"Barnacle Systems","1348":"Radian IoT","1353":"Ocean LED Marine","1359":"BluNav","1361":"OVA (Nantong Saiyang Electronics Co., Ltd)","1368":"RAD Propulsion","1369":"Electric Yacht","1372":"Elco Motor Yachts","1384":"Tecnoseal Foundry S.r.l","1385":"Pro Charging Systems","1389":"EVEX","1398":"Gobius Sensor Technology","1403":"Arco Marine","1408":"Lenco Marine","1413":"Naocontrol","1417":"Revatek","1438":"Aeolionics","1439":"PredictWind","1440":"Egis Mobile Electric","1445":"Starboard Yacht Group","1446":"Roswell Marine","1451":"ePropulsion (Guangdong ePropulsion Technology Ltd.)","1452":"Micro-Air","1453":"Vital Battery","1458":"Ride Controller","1460":"Tocaro Blue","1461":"Vanquish Yachts","1471":"FT Technologies","1478":"Alps Alpine","1481":"E-Force Marine","1482":"CMC Marine","1483":"Nanjing Sandemarine Information Technology","1850":"Teleflex Marine (SeaStar Solutions)","1851":"Raymarine","1852":"Navionics","1853":"Japan Radio","1854":"Northstar Technologies","1855":"Furuno","1856":"Trimble","1857":"Simrad","1858":"Litton","1859":"Kvasar","1860":"MMP","1861":"Vector Cantech","1862":"Yamaha Marine","1863":"Faria Instruments"},"MARK_TYPE":{"0":"Collision","1":"Turning point","2":"Reference","3":"Wheelover","4":"Waypoint"},"MOB_POSITION_SOURCE":{"0":"Position estimated by the vessel","1":"Position reported by MOB emitter"},"MOB_STATUS":{"0":"MOB Emitter Activated","1":"Manual on-board MOB Button Activation","2":"Test mode","3":"MOB Not Active"},"NAV_STATUS":{"0":"Under way using engine","1":"At anchor","2":"Not under command","3":"Restricted maneuverability","4":"Constrained by her draught","5":"Moored","6":"Aground","7":"Engaged in Fishing","8":"Under way sailing","9":"Hazardous material - High Speed","10":"Hazardous material - Wing in Ground","11":"Power-driven vessel towing astern","12":"Power-driven vessel pushing ahead or towing alongside","14":"AIS-SART"},"OFF_ON":{"0":"Off","1":"On"},"OFF_ON_CONTROL":{"0":"Off","1":"On","2":"Reserved","3":"Take no action (no change)"},"OK_WARNING":{"0":"OK","1":"Warning"},"PGN_LIST_FUNCTION":{"0":"Transmit PGN list","1":"Receive PGN list"},"POSITION_ACCURACY":{"0":"Low","1":"High"},"POSITION_FIX_DEVICE":{"0":"Default: undefined","1":"GPS","2":"GLONASS","3":"Combined GPS/GLONASS","4":"Loran-C","5":"Chayka","6":"Integrated navigation system","7":"Surveyed","8":"Galileo"},"POWER_FACTOR":{"0":"Leading","1":"Lagging","2":"Error"},"POWER_MODE":{"0":"High","1":"Low"},"PRESSURE_SOURCE":{"0":"Atmospheric","1":"Water","2":"Steam","3":"Compressed Air","4":"Hydraulic","5":"Filter","6":"AltimeterSetting","7":"Oil","8":"Fuel"},"RAIM_FLAG":{"0":"not in use","1":"in use"},"RANGE_RESIDUAL_MODE":{"0":"Range residuals were used to calculate data","1":"Range residuals were calculated after the position"},"REPEAT_INDICATOR":{"0":"Initial","1":"First retransmission","2":"Second retransmission","3":"Final retransmission"},"REPORTING_INTERVAL":{"0":"As given by the autonomous mode","1":"10 min","2":"6 min","3":"3 min","4":"1 min","5":"30 sec","6":"15 sec","7":"10 sec","8":"5 sec","9":"2 sec (not applicable to Class B CS)","10":"Next shorter reporting interval","11":"Next longer reporting interval"},"RESIDUAL_MODE":{"0":"Autonomous","1":"Differential enhanced","2":"Estimated","3":"Simulator","4":"Manual"},"RODE_TYPE":{"0":"Chain presently detected","1":"Rope presently detected"},"SERIAL_BIT_RATE":{"0":"25","1":"50","2":"100","3":"200","4":"300","5":"600","6":"1200","7":"2400","8":"4800","9":"9600","10":"19200","11":"38400","12":"57600"},"SERIAL_DETECTION_MODE":{"0":"Auto bit rate","1":"Manual bit rate"},"SHIP_TYPE":{"0":"Unavailable","20":"Wing In Ground","21":"Wing In Ground (hazard cat X)","22":"Wing In Ground (hazard cat Y)","23":"Wing In Ground (hazard cat Z)","24":"Wing In Ground (hazard cat OS)","29":"Wing In Ground (no additional information)","30":"Fishing","31":"Towing","32":"Towing exceeds 200m or wider than 25m","33":"Engaged in dredging or underwater operations","34":"Engaged in diving operations","35":"Engaged in military operations","36":"Sailing","37":"Pleasure","40":"High speed craft","41":"High speed craft (hazard cat X)","42":"High speed craft (hazard cat Y)","43":"High speed craft (hazard cat Z)","44":"High speed craft (hazard cat OS)","49":"High speed craft (no additional information)","50":"Pilot vessel","51":"SAR","52":"Tug","53":"Port tender","54":"Anti-pollution","55":"Law enforcement","56":"Spare","57":"Spare #2","58":"Medical","59":"Ships and aircraft of States not parties to an armed conflict","60":"Passenger ship","61":"Passenger ship (hazard cat X)","62":"Passenger ship (hazard cat Y)","63":"Passenger ship (hazard cat Z)","64":"Passenger ship (hazard cat OS)","69":"Passenger ship (no additional information)","70":"Cargo ship","71":"Cargo ship (hazard cat X)","72":"Cargo ship (hazard cat Y)","73":"Cargo ship (hazard cat Z)","74":"Cargo ship (hazard cat OS)","79":"Cargo ship (no additional information)","80":"Tanker","81":"Tanker (hazard cat X)","82":"Tanker (hazard cat Y)","83":"Tanker (hazard cat Z)","84":"Tanker (hazard cat OS)","89":"Tanker (no additional information)","90":"Other","91":"Other (hazard cat X)","92":"Other (hazard cat Y)","93":"Other (hazard cat Z)","94":"Other (hazard cat OS)","99":"Other (no additional information)"},"SPEED_TYPE":{"0":"Single speed","1":"Dual speed","2":"Proportional speed"},"STATION_HEALTH":{"0":"Not Working","1":"Unmonitored","2":"Healthy Operational","3":"Healthy Test Mode","4":"Test Mode"},"STATION_TYPE":{"0":"All types of mobile station","2":"All types of Class B mobile station","3":"SAR airborne mobile station","4":"AtoN station","5":"Class B CS shipborne mobile station","6":"Inland waterways","7":"Regional use 7","8":"Regional use 8","9":"Regional use 9"},"STEERING_MODE":{"0":"Main Steering","1":"Non-Follow-Up Device","2":"Follow-Up Device","3":"Heading Control Standalone","4":"Heading Control","5":"Track Control"},"SYSTEM_TIME":{"0":"GPS","1":"GLONASS","2":"Radio Station","3":"Local Cesium clock","4":"Local Rubidium clock","5":"Local Crystal clock"},"TANK_TYPE":{"0":"Fuel","1":"Water","2":"Gray water","3":"Live well","4":"Oil","5":"Black water"},"TARGET_ACQUISITION":{"0":"Manual","1":"Automatic"},"TELEPHONE_MODE":{"0":"F3E/G3E simplex, telephone","1":"F3E/G3E duplex, telephone","2":"J3E, telephone","3":"H3E, telephone","4":"F1B/J2B FEC NBDP, telex/teleprinter","5":"F1B/J2B ARQ NBDP, telex/teleprinter","6":"F1B/J2B receive only, teleprinter/DSC","7":"F1B/J2B, teleprinter/DSC","8":"A1A Morse, tape recorder","9":"A1A Morse, Morse key/head set","10":"F1C/F2C/F3C, FAX machine"},"TEMPERATURE_SOURCE":{"0":"Sea Temperature","1":"Outside Temperature","2":"Inside Temperature","3":"Engine Room Temperature","4":"Main Cabin Temperature","5":"Live Well Temperature","6":"Bait Well Temperature","7":"Refrigeration Temperature","8":"Heating System Temperature","9":"Dew Point Temperature","10":"Apparent Wind Chill Temperature","11":"Theoretical Wind Chill Temperature","12":"Heat Index Temperature","13":"Freezer Temperature","14":"Exhaust Gas Temperature","15":"Shaft Seal Temperature"},"THRUSTER_DIRECTION_CONTROL":{"0":"Off","1":"Ready","2":"To Port","3":"To Starboard"},"THRUSTER_MOTOR_TYPE":{"0":"12VDC","1":"24VDC","2":"48VDC","3":"24VAC","4":"Hydraulic"},"THRUSTER_RETRACT_CONTROL":{"0":"Off","1":"Extend","2":"Retract"},"TIDE":{"0":"Falling","1":"Rising"},"TIME_STAMP":{"60":"Not available","61":"Manual input mode","62":"Dead reckoning mode","63":"Positioning system is inoperative"},"TRACKING":{"0":"Cancelled","1":"Acquiring","2":"Tracking","3":"Lost"},"TURN_MODE":{"0":"Rudder limit controlled","1":"Turn rate controlled","2":"Radius controlled"},"TX_RX_MODE":{"0":"Tx A/Tx B, Rx A/Rx B","1":"Tx A, Rx A/Rx B","2":"Tx B, Rx A/Rx B"},"VIDEO_PROTOCOLS":{"0":"PAL","1":"NTSC"},"WATERMAKER_STATE":{"0":"Stopped","1":"Starting","2":"Running","3":"Stopping","4":"Flushing","5":"Rinsing","6":"Initiating","7":"Manual"},"WATER_REFERENCE":{"0":"Paddle wheel","1":"Pitot tube","2":"Doppler","3":"Correlation (ultra sound)","4":"Electro Magnetic"},"WINDLASS_DIRECTION":{"0":"Off","1":"Down","2":"Up"},"WINDLASS_MOTION":{"0":"Windlass stopped","1":"Deployment occurring","2":"Retrieval occurring"},"WIND_REFERENCE":{"0":"True (ground referenced to North)","1":"Magnetic (ground referenced to Magnetic North)","2":"Apparent","3":"True (boat referenced)","4":"True (water referenced)"},"YES_NO":{"0":"No","1":"Yes"},"YES_NO_1BIT":{"0":"No","1":"Yes"},"ZONE_SIZE":{"0":"1 nm","1":"2 nm","2":"3 nm","3":"4 nm","4":"5 nm","5":"6 nm"}},"skipped":{"proprietary":126,"ambiguous":4}} \ No newline at end of file diff --git a/canlab/core/j1939.py b/canlab/core/j1939.py index 9460880..32dfcb0 100644 --- a/canlab/core/j1939.py +++ b/canlab/core/j1939.py @@ -69,7 +69,7 @@ def parse_j1939_id(arb_id: int) -> dict: da = ps if is_nmea2000(pgn): - _name, single = _N2K_NAMES.get(pgn, (f"PGN {pgn}", True)) + single = n2k_single_frame(pgn) return { "priority": priority, "pgn": pgn, @@ -100,7 +100,15 @@ def parse_j1939_id(arb_id: int) -> dict: def pgn_name(pgn: int) -> str: """The name of a PGN in whichever table owns it, or a placeholder.""" if is_nmea2000(pgn): - return _N2K_NAMES.get(pgn, (f"PGN {pgn}", True))[0] + if pgn in _N2K_NAMES: + return _N2K_NAMES[pgn][0] + from canlab.core import n2k_db + found = n2k_db.name(pgn) + if found: + return found + if 130816 <= pgn <= 131071 or pgn == 126720: + return "Proprietary fast packet (manufacturer defined)" + return f"PGN {pgn}" entry = PGNS.get(pgn) if entry is not None: return entry.name @@ -321,25 +329,51 @@ def _decode_satellites_in_view(data: bytes) -> dict: } -def decode_n2k(pgn: int, data: bytes) -> dict: +def n2k_single_frame(pgn: int) -> bool: + """Whether an NMEA 2000 PGN fits one frame; unknown ones are assumed to.""" + if pgn in _N2K_NAMES: + return _N2K_NAMES[pgn][1] + from canlab.core import n2k_db + fast = n2k_db.is_fast_packet(pgn) + return True if fast is None else not fast + + +def decode_n2k(pgn: int, data: bytes, reassembled: bool | None = None) -> dict: """Decode an NMEA 2000 PGN into {field: (value, unit)}. - Single-frame PGNs decode from their one frame. Fast-packet PGNs decode - only from a reassembled buffer longer than a frame; see _N2K_DECODERS. + The hand-written decoders, checked against frames from a real marine + recording, come first. Every other standard PGN is decoded from the table + distilled from canboat (core/n2k_db.py); on that same recording the two + agree on every value they share. + + A fast-packet PGN is decoded only from a reassembled message: its single + frames carry a sequence byte and a length byte, so reading one alone + shifts every field. ``reassembled`` says which one ``data`` is; left as + None, a buffer longer than a frame is taken to be reassembled. """ + data = bytes(data) + if reassembled is None: + reassembled = len(data) > 8 decoder = _N2K_DECODERS.get(pgn) if decoder is not None: - return decoder(bytes(data)) if len(data) > 8 else {} + return decoder(data) if reassembled else {} fields = _N2K_FIELDS.get(pgn) - if not fields: + if fields: + out = {} + for name, (start, length, scale, offset, unit, signed) in fields.items(): + raw = _n2k_value(data, start, length, signed) + if raw is None: + continue + # Rounded to the field's own resolution. A fixed six places turned + # a rate of turn of -0.0001047 rad/s into -0.000105 and cut a + # 1e-7 degree position to ten centimetres. + from canlab.core.n2k_db import _places + out[name] = (round(raw * scale + offset, _places(scale)), unit) + return out + if not n2k_single_frame(pgn) and not reassembled: return {} - out = {} - for name, (start, length, scale, offset, unit, signed) in fields.items(): - raw = _n2k_value(data, start, length, signed) - if raw is None: - continue - out[name] = (round(raw * scale + offset, 6), unit) - return out + from canlab.core import n2k_db + return n2k_db.decode(pgn, data) # FMI (Failure Mode Identifier) short names — SAE J1939-73 Appendix A. @@ -390,7 +424,7 @@ def decode_dm1(data: bytes) -> dict: return {"lamps": lamps, "dtcs": dtcs} -def decode_pgn(pgn: int, data: bytes) -> dict: +def decode_pgn(pgn: int, data: bytes, reassembled: bool | None = None) -> dict: """ Decode the parameters of one message. Returns {name: (value, unit)}. @@ -404,7 +438,7 @@ def decode_pgn(pgn: int, data: bytes) -> dict: PGNs by decode_n2k. """ if is_nmea2000(pgn): - return decode_n2k(pgn, data) + return decode_n2k(pgn, data, reassembled) if pgn == 0xFECA: return decode_dm1(data) entry = PGNS.get(pgn) diff --git a/canlab/core/multiframe.py b/canlab/core/multiframe.py index dd76b02..ec6882b 100644 --- a/canlab/core/multiframe.py +++ b/canlab/core/multiframe.py @@ -61,8 +61,17 @@ MAX_FAST_PACKET_BYTES = 223 #: NMEA 2000 PGNs the name table marks as multi-frame. -FAST_PACKET_PGNS = frozenset(pgn for pgn, (_name, single) in _N2K_NAMES.items() - if not single) +def _fast_packet_pgns() -> frozenset: + """Every NMEA 2000 PGN sent as a fast packet: the hand-written table's, + and every other standard one canboat lists, so a message is reassembled + whether or not CanLab can decode it.""" + from canlab.core import n2k_db + hand = {pgn for pgn, (_name, single) in _N2K_NAMES.items() if not single} + single = {pgn for pgn, (_name, s) in _N2K_NAMES.items() if s} + return frozenset(hand | (n2k_db.fast_packet_pgns() - single)) + + +FAST_PACKET_PGNS = _fast_packet_pgns() @dataclass @@ -476,7 +485,7 @@ def summarize(messages) -> list[dict]: "bytes": last.size, "frames": last.frames, "first_t": items[0].t_start, "last_t": last.t_end, "last_data_hex": last.data.hex(" ").upper(), - "decoded": decode_pgn(pgn, last.data), + "decoded": decode_pgn(pgn, last.data, reassembled=True), }) rows.sort(key=lambda r: (-r["count"], r["pgn"], r["sa"])) return rows diff --git a/canlab/core/n2k_db.py b/canlab/core/n2k_db.py new file mode 100644 index 0000000..778dd5f --- /dev/null +++ b/canlab/core/n2k_db.py @@ -0,0 +1,133 @@ +"""Decode any standard NMEA 2000 PGN from the table distilled from canboat. + +The table (core/data/n2k_pgns.json, built by tools/build_n2k_table.py from +canboat, Apache License 2.0) gives each field's position, width, resolution, +sign, unit and valid range. The range is what makes the decode honest: an +eight-bit field is valid to 252, and 253, 254 and 255 mean reserved, error +and not available, as they do throughout NMEA 2000. A value outside its +range is therefore never shown as a reading. + +The hand-written decoders in core/j1939.py are checked against real frames +and take precedence; this covers the rest. Where both exist, the tests +require them to agree field by field on the real marine recording. + +Temperatures are converted from kelvin to degrees Celsius so they read the +same as the hand-written ones. Angles stay in radians, as NMEA 2000 sends +them and as the rest of CanLab reports them. +""" +from __future__ import annotations + +import datetime as _dt +import json +from functools import lru_cache +from pathlib import Path + +DATA = Path(__file__).resolve().parent / "data" / "n2k_pgns.json" + + +@lru_cache(maxsize=1) +def table() -> dict: + try: + return json.loads(DATA.read_text(encoding="utf-8")) + except (OSError, ValueError): + return {"pgns": {}, "lookups": {}} + + +def definition(pgn: int) -> dict | None: + return table()["pgns"].get(str(pgn)) + + +def name(pgn: int) -> str | None: + d = definition(pgn) + return d["name"] if d else None + + +def is_fast_packet(pgn: int) -> bool | None: + d = definition(pgn) + return d["fast"] if d else None + + +def fast_packet_pgns() -> frozenset: + return frozenset(int(p) for p, d in table()["pgns"].items() if d["fast"]) + + +def _places(resolution: float) -> int: + """Decimal places worth keeping for a field of this resolution. + + A fixed six places cut a 1e-16 degree longitude to six centimetres and + padded a 0.1 kelvin temperature with float noise; this keeps two places + beyond the resolution, up to what a double can hold. + """ + import math + if resolution <= 0: + return 6 + return int(min(12, max(0, math.ceil(-math.log10(resolution)) + 2))) + + +def _raw(data: bytes, bit: int, bits: int) -> int | None: + if bit + bits > len(data) * 8: + return None + return (int.from_bytes(bytes(data), "little") >> bit) & ((1 << bits) - 1) + + +def decode(pgn: int, data: bytes) -> dict: + """{field: (value, unit)} for a standard PGN, or {} if it is not in the table. + + Not-available and reserved values are left out; an error code is the + string "error". + """ + d = definition(pgn) + if d is None: + return {} + lookups = table()["lookups"] + out: dict = {} + for (fname, bit, bits, res, signed, unit, kind, lo, hi, offset, lookup) in d["fields"]: + if fname in ("SID", "Reserved"): + continue # a sequence number, not a reading + raw = _raw(data, bit, bits) + if raw is None: + continue + if kind == "STRING_FIX": + text = bytes(data)[bit // 8:(bit + bits) // 8] + text = text.rstrip(b"\xff\x00 @").decode("ascii", "replace") + if text: + out[fname] = (text, "") + continue + all_ones = (1 << bits) - 1 + if signed: + top = (1 << (bits - 1)) - 1 + if raw == top: + continue # not available + if raw == top - 1 and bits >= 4: + out[fname] = ("error", "") + continue + if raw > top: + raw -= 1 << bits + else: + if raw == all_ones and bits >= 2: + continue + if raw == all_ones - 1 and bits >= 4: + out[fname] = ("error", "") + continue + if kind in ("LOOKUP", "INDIRECT_LOOKUP") and lookup: + label = lookups.get(lookup, {}).get(str(raw)) + if label is not None: + out[fname] = (label, "") + elif hi is None or raw <= hi: + out[fname] = (f"unknown ({raw})", "") + continue + value = raw * res + (offset or 0) + if hi is not None and value > hi * (1 + 1e-9) + 1e-9: + continue # a reserved code + if lo is not None and value < lo * (1 + 1e-9) - 1e-9 and not signed: + continue + if kind == "DATE": + out[fname] = ((_dt.date(1970, 1, 1) + _dt.timedelta(days=int(value))).isoformat(), "") + continue + if kind in ("MMSI",): + out[fname] = (f"{int(raw):09d}", "") + continue + if unit == "K": + value, unit = value - 273.15, "°C" + out[fname] = (round(float(value), _places(res)), unit) + return out diff --git a/pyproject.toml b/pyproject.toml index 745756b..fab5036 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,7 @@ canlab-cli = "canlab.cli:main" include = ["canlab*"] [tool.setuptools.package-data] -canlab = ["canlab.png", "assets/*.svg", "sample_data/*.csv", "examples/capture-kit/*"] +canlab = ["canlab.png", "assets/*.svg", "sample_data/*.csv", "examples/capture-kit/*", "core/data/*"] [tool.ruff] line-length = 120 diff --git a/tests/test_n2k_db.py b/tests/test_n2k_db.py new file mode 100644 index 0000000..c23241a --- /dev/null +++ b/tests/test_n2k_db.py @@ -0,0 +1,123 @@ +"""NMEA 2000 beyond the hand-written decoders: the table distilled from canboat. + +The first tests are the ones that matter. The hand-written decoders were +checked against a real marine recording; canboat is an independent source +built from years of other people's buses. On the frames below, copied from +that recording, the two must agree on every value they share. The rest pin +the decoder's handling of the codes NMEA 2000 reserves. +""" +import json + +import pytest + +from canlab.core import n2k_db +from canlab.core.j1939 import decode_n2k, decode_pgn, parse_j1939_id, pgn_name +from canlab.core.multiframe import FAST_PACKET_PGNS, Reassembler +from tests.test_multiframe import GNSS_FRAMES, GNSS_ID +from tests.test_nmea2000 import REAL + +#: hand-written name -> canboat name, where they differ +ALIAS = {"Rate of Turn": "Rate", "Course Over Ground": "COG", "Speed Over Ground": "SOG"} + + +@pytest.mark.parametrize("pgn", sorted(REAL)) +def test_canboat_agrees_with_the_hand_written_decoder_on_real_frames(pgn): + hand, table = decode_n2k(pgn, REAL[pgn]), n2k_db.decode(pgn, REAL[pgn]) + shared = 0 + for name, (value, unit) in hand.items(): + other = table.get(ALIAS.get(name, name)) + if other is None: + continue + shared += 1 + assert other[0] == pytest.approx(value, rel=1e-6, abs=1e-9), name + assert other[1] == unit, name + assert shared >= 1 + + +def test_the_gnss_fix_agrees_after_reassembly(): + r = Reassembler() + msgs = [] + for i, f in enumerate(GNSS_FRAMES): + msgs += r.update(GNSS_ID, f, 58.0 + 0.003 * i) + (m,) = msgs + hand, table = decode_n2k(129029, m.data), n2k_db.decode(129029, m.data) + for name in ("Latitude", "Longitude", "Altitude", "Time", "HDOP", "PDOP"): + assert table[name][0] == pytest.approx(hand[name][0], rel=1e-9), name + assert table["Date"][0] == hand["Date"][0] == "2021-03-25" + assert table["Number of SVs"][0] == hand["Satellites Used"][0] + + +def test_a_pgn_without_a_hand_written_decoder_decodes_from_the_table(): + out = decode_pgn(127488, bytes([0x00, 0x40, 0x1F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF])) + assert out["Speed"] == (2000.0, "rpm") + assert "Boost Pressure" not in out # 0xFFFF: not available + assert "Tilt/Trim" not in out # 0x7F: signed not available + assert pgn_name(127488) == "Engine Parameters, Rapid Update" + + +def test_error_and_reserved_codes_are_not_readings(): + out = n2k_db.decode(127488, bytes([0xFD, 0xFE, 0xFF, 0xFD, 0xFF, 0x7E, 0xFF, 0xFF])) + assert out["Speed"] == ("error", "") # 0xFFFE + assert "Boost Pressure" not in out # 0xFFFD: above the valid range + assert out["Tilt/Trim"] == ("error", "") # 0x7E: signed error + assert "Instance" not in out # 253: reserved + + +def test_a_fast_packet_is_decoded_only_once_reassembled(): + payload = bytearray(26) + payload[0] = 0 # instance + payload[1:3] = (3000).to_bytes(2, "little") # oil pressure, 100 Pa/bit + payload[3:5] = (3631).to_bytes(2, "little") # 363.1 K, 0.1 K/bit + payload[5:7] = b"\xff\xff" # temperature: unsigned n/a + payload[7:9] = (1410).to_bytes(2, "little") # alternator, 0.01 V + payload[9:26] = b"\xff" * 17 + payload[9:11] = b"\xff\x7f" # fuel rate: signed n/a is 0x7FFF + assert 127489 in FAST_PACKET_PGNS + assert decode_pgn(127489, bytes(payload[:8]), reassembled=False) == {} + out = decode_pgn(127489, bytes(payload), reassembled=True) + assert out["Oil pressure"] == (300000.0, "Pa") + assert out["Oil temperature"][0] == pytest.approx(89.95, abs=1e-9) + assert out["Oil temperature"][1] == "°C" # kelvin converted + assert out["Alternator Potential"] == (14.1, "V") + assert "Fuel Rate" not in out and "Temperature" not in out + minus_one = bytearray(payload) + minus_one[9:11] = b"\xff\xff" # signed 0xFFFF is -1, a reading + assert decode_pgn(127489, bytes(minus_one), reassembled=True)["Fuel Rate"] == (-0.1, "L/h") + + +def test_the_reassembler_handles_a_fast_packet_the_hand_table_does_not_know(): + """127489 was not in the hand-written table, so its frames were left alone.""" + payload = bytes([0, 0xB8, 0x0B, 0x2F, 0x0E] + [0xFF] * 21) # 26 bytes + frames = [bytes([0x20, len(payload)]) + payload[:6]] + rest, counter = payload[6:], 1 + while rest: + frames.append(bytes([0x20 | counter]) + rest[:7].ljust(7, b"\xff")) + rest, counter = rest[7:], counter + 1 + r = Reassembler() + arb = 0x09F20123 # PGN 127489 from 0x23 + msgs = [] + for i, f in enumerate(frames): + msgs += r.update(arb, f, 1.0 + 0.001 * i) + (m,) = msgs + assert m.pgn == 127489 and m.data == payload + assert decode_pgn(m.pgn, m.data, reassembled=True)["Oil pressure"] == (300000.0, "Pa") + + +def test_a_repeating_group_is_not_decoded_as_one_value(): + """129540 lists one entry per satellite. The table stops before the + group, so no single satellite's PRN is presented as the PRN.""" + fields = [f[0] for f in n2k_db.definition(129540)["fields"]] + assert "Sats in View" in fields and "PRN" not in fields and "SNR" not in fields + + +def test_proprietary_pgns_are_named_not_guessed(): + assert n2k_db.definition(130821) is None + assert pgn_name(130821) == "Proprietary fast packet (manufacturer defined)" + assert parse_j1939_id(0x18FF0523)["protocol"] == "J1939" # PropB, data page 0 + + +def test_the_table_ships_with_its_licence(): + data = json.loads(n2k_db.DATA.read_text()) + assert len(data["pgns"]) >= 200 and data["source"].startswith("canboat") + notice = (n2k_db.DATA.parent / "CANBOAT-NOTICE.txt").read_text() + assert "Apache License, Version 2.0" in notice and "Kees Verruijt" in notice diff --git a/tools/build_n2k_table.py b/tools/build_n2k_table.py new file mode 100644 index 0000000..d78c88c --- /dev/null +++ b/tools/build_n2k_table.py @@ -0,0 +1,128 @@ +"""Distil canboat's NMEA 2000 definitions into the table CanLab decodes with. + +canboat (github.com/canboat/canboat, Apache License 2.0, Kees Verruijt) +publishes a machine-readable definition of nearly every NMEA 2000 PGN, built +from years of reverse engineering real buses. This keeps the part CanLab +needs: each standard PGN's name, whether it is a single frame or a fast +packet, and its fixed-position fields with resolution, sign, unit, valid +range and lookup table. + + python tools/build_n2k_table.py [--source canboat.json] [--tag vX.Y.Z] + +Writes canlab/core/data/n2k_pgns.json and the licence notice beside it. +Proprietary PGNs are left out: canboat defines several per PGN, one per +manufacturer, and choosing among them needs the manufacturer code, which a +table this simple cannot do honestly. So are fields after the first +variable-length one, because their positions depend on the data. +""" +from __future__ import annotations + +import argparse +import json +import urllib.request +from pathlib import Path + +REPO = Path(__file__).resolve().parents[1] +OUT = REPO / "canlab" / "core" / "data" / "n2k_pgns.json" +NOTICE = REPO / "canlab" / "core" / "data" / "CANBOAT-NOTICE.txt" +URL = "https://raw.githubusercontent.com/canboat/canboat/{tag}/docs/canboat.json" + +DECODED = {"NUMBER", "LOOKUP", "DURATION", "TIME", "DATE", "MMSI", "PGN", + "ADDRESS", "STRING_FIX", "INDIRECT_LOOKUP"} + + +def proprietary(pgn: int) -> bool: + return (pgn == 0xEF00 or 0xFF00 <= pgn <= 0xFFFF or pgn == 126720 + or 130816 <= pgn <= 131071 or 0x1EF00 <= pgn <= 0x1EFFF) + + +def build(src: dict) -> dict: + by_pgn: dict[int, list] = {} + for p in src["PGNs"]: + by_pgn.setdefault(p["PGN"], []).append(p) + used_lookups: set[str] = set() + table = {} + skipped = {"proprietary": 0, "ambiguous": 0} + for pgn, defs in sorted(by_pgn.items()): + if proprietary(pgn): + skipped["proprietary"] += 1 + continue + if len(defs) > 1: + skipped["ambiguous"] += 1 + continue + p = defs[0] + if p.get("Type") not in ("Single", "Fast"): + continue + fields = [] + # A repeating group (satellites, AIS slots, ...) has a count field and + # then N copies of a set of fields. Decoding the first copy as if it + # were the only one would present one satellite's PRN as "the" PRN, + # so the table stops where the group starts. + repeat_at = min((p[k] for k in ("RepeatingFieldSet1StartField", + "RepeatingFieldSet2StartField") if p.get(k)), + default=None) + for f in p.get("Fields", []): + if repeat_at is not None and f.get("Order", 0) >= repeat_at: + break + if f.get("BitOffset") is None: + break # variable length: positions unknown + kind = f.get("FieldType") + if kind not in DECODED: + continue + lookup = f.get("LookupEnumeration") + if lookup: + used_lookups.add(lookup) + fields.append([ + f["Name"], f["BitOffset"], f["BitLength"], f.get("Resolution") or 1, + bool(f.get("Signed")), f.get("Unit") or "", kind, + f.get("RangeMin"), f.get("RangeMax"), f.get("Offset") or 0, lookup or "", + ]) + table[str(pgn)] = {"name": p["Description"], "fast": p["Type"] == "Fast", + "fields": fields} + lookups = {} + for e in src.get("LookupEnumerations", []): + if e["Name"] in used_lookups: + lookups[e["Name"]] = {str(v["Value"]): v["Name"] for v in e["EnumValues"]} + return {"source": f"canboat {src.get('Version', '')}", + "licence": "Apache-2.0, see CANBOAT-NOTICE.txt", + "pgns": table, "lookups": lookups, "skipped": skipped} + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("--source", help="a local canboat.json instead of downloading") + ap.add_argument("--tag", default="master", help="canboat git ref to download") + args = ap.parse_args() + if args.source: + src = json.loads(Path(args.source).read_text()) + else: + with urllib.request.urlopen(URL.format(tag=args.tag), timeout=120) as r: + src = json.loads(r.read()) + table = build(src) + OUT.parent.mkdir(parents=True, exist_ok=True) + OUT.write_text(json.dumps(table, separators=(",", ":"), ensure_ascii=False)) + NOTICE.write_text( + "canlab/core/data/n2k_pgns.json is derived from docs/canboat.json in\n" + "CANboat, https://github.com/canboat/canboat\n\n" + f"{src.get('Copyright', '(C) 2009-2026, Kees Verruijt, Harlingen, The Netherlands.')}\n\n" + "Licensed under the Apache License, Version 2.0 (the \"License\");\n" + "you may not use this file except in compliance with the License.\n" + "You may obtain a copy of the License at\n\n" + " http://www.apache.org/licenses/LICENSE-2.0\n\n" + "Unless required by applicable law or agreed to in writing, software\n" + "distributed under the License is distributed on an \"AS IS\" BASIS,\n" + "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" + "See the License for the specific language governing permissions and\n" + "limitations under the License.\n\n" + "Changes: kept each standard PGN's name, frame type and fixed-position\n" + "fields, and the lookup tables those fields use; dropped proprietary\n" + "PGNs and fields whose position depends on earlier variable-length data.\n") + n_fields = sum(len(p["fields"]) for p in table["pgns"].values()) + print(f"{len(table['pgns'])} PGNs, {n_fields} fields, {len(table['lookups'])} lookups " + f"from {table['source']}; skipped {table['skipped']}") + print(f"wrote {OUT} ({OUT.stat().st_size / 1e3:.0f} kB)") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())