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())