Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
executable file 5238 lines (4810 sloc) 206 KB
/*
Analyzes NMEA 2000 PGNs.
(C) 2009-2015, Kees Verruijt, Harlingen, The Netherlands.
This file is part of CANboat.
CANboat is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
CANboat is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with CANboat. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdbool.h>
#include <stdint.h>
#define UINT16_OUT_OF_RANGE (MAX_UINT16 - 1)
#define UINT16_UNKNOWN (MAX_UINT16)
#ifndef ARRAY_SIZE
# define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
/*
* Notes on the NMEA 2000 packet structure
* ---------------------------------------
*
* http://www.nmea.org/Assets/pgn059392.pdf tells us that:
* - All messages shall set the reserved bit in the CAN ID field to zero on transmit.
* - Data field reserve bits or reserve bytes shall be filled with ones. i.e. a reserve
* byte will be set to a hex value of FF, a single reservie bit would be set to a value of 1.
* - Data field extra bytes shall be illed with a hex value of FF.
* - If the PGN in a Command or Request is not recognized by the destination it shall
* reply with the PGN 059392 ACK or NACK message using a destination specific address.
*
*/
/*
* NMEA 2000 uses the 8 'data' bytes as follows:
* data[0] is an 'order' that increments, or not (depending a bit on implementation).
* If the size of the packet <= 7 then the data follows in data[1..7]
* If the size of the packet > 7 then the next byte data[1] is the size of the payload
* and data[0] is divided into 5 bits index into the fast packet, and 3 bits 'order
* that increases.
* This means that for 'fast packets' the first bucket (sub-packet) contains 6 payload
* bytes and 7 for remaining. Since the max index is 31, the maximal payload is
* 6 + 31 * 7 = 223 bytes
*/
/*
* Some packets include a "SID", explained by Maretron as follows:
* SID: The sequence identifier field is used to tie related PGNs together. For example,
* the DST100 will transmit identical SIDs for Speed (PGN 128259) and Water depth
* (128267) to indicate that the readings are linked together (i.e., the data from each
* PGN was taken at the same time although reported at slightly different times).
*/
#define FASTPACKET_INDEX (0)
#define FASTPACKET_SIZE (1)
#define FASTPACKET_BUCKET_0_SIZE (6)
#define FASTPACKET_BUCKET_N_SIZE (7)
#define FASTPACKET_BUCKET_0_OFFSET (2)
#define FASTPACKET_BUCKET_N_OFFSET (1)
#define FASTPACKET_MAX_INDEX (0x1f)
#define FASTPACKET_MAX_SIZE (FASTPACKET_BUCKET_0_SIZE + FASTPACKET_BUCKET_N_SIZE * (FASTPACKET_MAX_INDEX - 1))
#define Pi (3.141592654)
#define RadianToDegree (360.0 / 2 / Pi)
#define BYTES(x) ((x)*(8))
#define RES_LAT_LONG_PRECISION (10000000) /* 1e7 */
#define RES_LAT_LONG (1.0e-7)
#define RES_LAT_LONG_64 (1.0e-16)
#define RES_PERCENTAGE (100.0 / 25000.0)
typedef struct
{
char * name;
uint32_t size; /* Size in bits. All fields are contiguous in message; use 'reserved' fields to fill in empty bits. */
# define LEN_VARIABLE (0)
double resolution; /* Either a positive real value or one of the following RES_ special values */
# define RES_NOTUSED (0)
# define RES_RADIANS (1e-4)
# define RES_ROTATION (1e-3/32.0)
# define RES_HIRES_ROTATION (1e-6/32.0)
# define RES_ASCII (-1.0)
# define RES_LATITUDE (-2.0)
# define RES_LONGITUDE (-3.0)
# define RES_DATE (-4.0)
# define RES_TIME (-5.0)
# define RES_TEMPERATURE (-6.0)
# define RES_6BITASCII (-7.0) /* Actually not used in N2K, only in N183 AIS */
# define RES_INTEGER (-8.0)
# define RES_LOOKUP (-9.0)
# define RES_BINARY (-10.0)
# define RES_MANUFACTURER (-11.0)
# define RES_STRING (-12.0)
# define RES_FLOAT (-13.0)
# define RES_PRESSURE (-14.0)
# define RES_STRINGLZ (-15.0) /* ASCII string starting with length byte and terminated by zero byte */
# define RES_STRINGLAU (-16.0) /* ASCII or UNICODE string starting with length byte and ASCII/Unicode byte */
# define RES_DECIMAL (-17.0)
# define RES_BITFIELD (-18.0)
# define RES_TEMPERATURE_HIGH (-19.0)
# define RES_TEMPERATURE_HIRES (-20.0)
# define RES_PRESSURE_HIRES (-21.0)
# define MAX_RESOLUTION_LOOKUP 21
bool hasSign; /* Is the value signed, e.g. has both positive and negative values? */
char * units; /* String containing the 'Dimension' (e.g. s, h, m/s, etc.) unless it starts with , in which
* case it contains a set of lookup values.
*/
char * description;
int32_t offset; /* Only used for SAE J1939 values with sign; these are in Offset/Excess-K notation instead
* of two's complement as used by NMEA 2000.
* See http://en.wikipedia.org/wiki/Offset_binary
*/
char * camelName; /* Filled by C, no need to set in initializers. */
} Field;
typedef struct
{
const char * name;
const char * resolution;
} Resolution;
static const Resolution types[MAX_RESOLUTION_LOOKUP] =
{ { "ASCII text", 0 }
, { "Latitude", 0 }
, { "Longitude", 0 }
, { "Date", "1" }
, { "Time", "0.0001" }
, { "Temperature", "0.01" }
, { "6 Bit ASCII text", 0 }
, { "Integer", "1" }
, { "Lookup table", 0 }
, { "Binary data", 0 }
, { "Manufacturer code", 0 }
, { "String with start/stop byte", 0 }
, { "IEEE Float", 0 }
, { "Pressure", 0 }
, { "ASCII string starting with length byte", 0 }
, { "ASCII or UNICODE string starting with length and control byte", 0 }
, { "Decimal encoded number", 0 }
, { "Bitfield", 0 }
, { "Temperature", "0.1" }
, { "Temperature (hires)", "0.001" }
, { "Pressure (hires)", "0.1" }
};
#define LOOKUP_INDUSTRY_CODE (",0=Global,1=Highway,2=Agriculture,3=Construction,4=Marine,5=Industrial")
#define LOOKUP_SHIP_TYPE ( \
",0=unavailable" \
",20=Wing In Ground,29=Wing In Ground (no other 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 carrying dangerous goods,42=High speed craft hazard cat B,43=High speed craft hazard cat C,44=High speed craft hazard cat D,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=RR Resolution No.18" \
",60=Passenger ship,69=Passenger ship (no additional information)" \
",70=Cargo ship,71=Cargo ship carrying dangerous goods,72=Cargo ship hazard cat B,73=Cargo ship hazard cat C,74=Cargo ship hazard cat D,79=Cargo ship (no additional information)" \
",80=Tanker,81=Tanker carrying dangerous goods,82=Tanker hazard cat B,83=Tanker hazard cat C,84=Tanker hazard cat D,89=Tanker (no additional information)" \
",90=Other,91=Other carrying dangerous goods,92=Other hazard cat B,93=Other hazard cat C,94=Other hazard cat D,99=Other (no additional information)" \
)
/* http://www.nmea.org/Assets/20120726%20nmea%202000%20class%20&%20function%20codes%20v%202.00.pdf */
#define LOOKUP_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" \
",120=Display" \
",125=Entertainment" \
)
#define LOOKUP_REPEAT_INDICATOR ( \
",0=Initial,1=First retransmission,2=Second retransmission,3=Final retransmission" \
)
#define LOOKUP_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" \
)
#define LOOKUP_AIS_ASSIGNED_MODE ( \
",0=Autonomous and continuous" \
",1=Assigned mode" \
)
#define LOOKUP_ATON_TYPE ( \
",0=Default: Type of AtoN not specified" \
",1=Referece 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" \
",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" \
)
#define LOOKUP_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" \
",15=Internal GNSS" \
)
#define LOOKUP_ENGINE_INSTANCE ( ",0=Single Engine or Dual Engine Port,1=Dual Engine Starboard" )
// http://www.osukl.com/wp-content/uploads/2015/04/3155-UM.pdf
#define LOOKUP_ENGINE_STATUS_1 ( ",0=Check Engine,1=Over Temperature,2=Low Oil Pressure,3=Low Oil Level,4=Low Fuel Pressure,5=Low System Voltage,6=Low Coolant Level,7=Water Flow,8=Water In Fuel,9=Charge Indicator,10=Preheat Indicator,11=High Boost Pressure,12=Rev Limit Exceeded,13=EGR System,14=Throttle Position Sensor,15=Emergency Stop" )
#define LOOKUP_ENGINE_STATUS_2 ( ",0=Warning Level 1,1=Warning Level 2,2=Power Reduction,3=Maintenance Needed,4=Engine Comm Error,5=Sub or Secondary Throttle,6=Neutral Start Protect,7=Engine Shutting Down" )
#define LOOKUP_GEAR_STATUS ( ",0=Forward,1=Neutral,2=Reverse" )
#define LOOKUP_POSITION_ACCURACY ( ",0=Low,1=High" )
#define LOOKUP_RAIM_FLAG ( ",0=not in use,1=in use" )
#define LOOKUP_TIME_STAMP ( ",60=Not available,61=Manual input mode,62=Dead reckoning mode,63=Positioning system is inoperative" )
#define LOOKUP_GNS_AIS ( ",0=undefined,1=GPS,2=GLONASS,3=GPS+GLONASS,4=Loran-C,5=Chayka,6=integrated,7=surveyed,8=Galileo" )
#define LOOKUP_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" )
#define LOOKUP_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" )
#define LOOKUP_GNS_INTEGRITY ( ",0=No integrity checking,1=Safe,2=Caution" )
#define LOOKUP_SYSTEM_TIME ( ",0=GPS,1=GLONASS,2=Radio Station,3=Local Cesium clock,4=Local Rubidium clock,5=Local Crystal clock" )
#define LOOKUP_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"\
)
#define LOOKUP_RESIDUAL_MODE ( ",0=Autonomous,1=Differential enhanced,2=Estimated,3=Simulator,4=Manual" )
#define LOOKUP_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)" )
#define LOOKUP_WATER_REFERENCE ( ",0=Paddle wheel,1=Pitot tube,2=Doppler,3=Correlation (ultra sound),4=Electro Magnetic" )
#define LOOKUP_YES_NO ( ",0=No,1=Yes" )
#define LOOKUP_OK_WARNING ( ",0=OK,1=Warning" )
#define LOOKUP_DIRECTION_REFERENCE ( ",0=True,1=Magnetic" )
#define LOOKUP_NAV_STATUS ( \
",0=Under way using engine" \
",1=At anchor" \
",2=Not under command" \
",3=Restricted manoeuverability" \
",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" \
",14=AIS-SART" )
#define LOOKUP_POWER_FACTOR ( ",0=Leading,1=Lagging,2=Error" )
#define LOOKUP_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=Refridgeration 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" )
#define LOOKUP_HUMIDITY_SOURCE ( \
",0=Inside" \
",1=Outside" )
#define LOOKUP_PRESSURE_SOURCE ( \
",0=Atmospheric" \
",1=Water" \
",2=Steam" \
",3=Compressed Air" \
",4=Hydraulic" )
#define LOOKUP_DSC_FORMAT ( \
",102=Geographical area" \
",112=Distress" \
",114=Common interest" \
",116=All ships" \
",120=Individual stations" \
",121=Non-calling purpose" \
",123=Individual station automatic" )
#define LOOKUP_DSC_CATEGORY ( \
",100=Routine" \
",108=Safety" \
",110=Urgency" \
",112=Distress" )
#define LOOKUP_DSC_NATURE ( \
",100=Fire" \
",101=Flooding" \
",102=Collision" \
",103=Grounding" \
",104=Listing" \
",105=Sinking" \
",106=Disabled and adrift" \
",107=Undesignated" \
",108=Abandoning ship" \
",109=Piracy" \
",110=Man overboard" \
",112=EPIRB emission" )
#define LOOKUP_DSC_FIRST_TELECOMMAND ( \
",100=F3E/G3E All modes TP" \
",101=F3E/G3E duplex TP" \
",103=Polling" \
",104=Unable to comply" \
",105=End of call" \
",106=Data" \
",109=J3E TP" \
",110=Distress acknowledgement" \
",112=Distress relay" \
",113=F1B/J2B TTY-FEC" \
",115=F1B/J2B TTY-ARQ" \
",118=Test" \
",121=Ship position or location registration updating" \
",126=No information" )
#define LOOKUP_DSC_SECOND_TELECOMMAND ( \
",100=No reason given" \
",101=Congestion at MSC" \
",102=Busy" \
",103=Queue indication" \
",104=Station barred" \
",105=No operator available" \
",106=Operator temporarily unavailable" \
",107=Equipment disabled" \
",108=Unable to use proposed channel" \
",109=Unable to use proposed mode" \
",110=Ships and aircraft of States not parties to an armed conflict" \
",111=Medical transports" \
",112=Pay phone/public call office" \
",113=Fax/data" \
",126=No information" )
#define LOOKUP_DSC_EXPANSION_DATA ( \
",100=Enhanced position" \
",101=Source and datum of position" \
",102=SOG" \
",103=COG" \
",104=Additional station identification" \
",105=Enhanced geographic area" \
",106=Number of persons on board" )
#define LOOKUP_SEATALK_ALARM_STATUS ( \
",0=Alarm condition not met" \
",1=Alarm condition met and not silenced" \
",2=Alarm condition met and silenced")
#define LOOKUP_SEATALK_ALARM_ID ( \
",0=No Alarm" \
",1=Shallow Depth" \
",2=Deep Depth" \
",3=Shallow Anchor" \
",4=Deep Anchor" \
",5=Off Course" \
",6=AWA High" \
",7=AWA Low" \
",8=AWS High" \
",9=AWS Low" \
",10=TWA High" \
",11=TWA Low" \
",12=TWS High" \
",13=TWS Low" \
",14=WP Arrival" \
",15=Boat Speed High" \
",16=Boat Speed Low" \
",17=Sea Temp High" \
",18=Sea Temp Low" \
",19=Pilot Watch" \
",20=Pilot Off Course" \
",21=Pilot Wind Shift" \
",22=Pilot Low Battery" \
",23=Pilot Last Minute Of Watch" \
",24=Pilot No NMEA Data" \
",25=Pilot Large XTE" \
",26=Pilot NMEA DataError" \
",27=Pilot CU Disconnected" \
",28=Pilot Auto Release" \
",29=Pilot Way Point Advance" \
",30=Pilot Drive Stopped" \
",31=Pilot Type Unspecified" \
",32=Pilot Calibration Required" \
",33=Pilot Last Heading" \
",34=Pilot No Pilot" \
",35=Pilot Route Complete" \
",36=Pilot Variable Text" \
",37=GPS Failure" \
",38=MOB" \
",39=Seatalk1 Anchor" \
",40=Pilot Swapped Motor Power" \
",41=Pilot Standby Too Fast To Fish" \
",42=Pilot No GPS Fix" \
",43=Pilot No GPS COG" \
",44=Pilot Start Up" \
",45=Pilot Too Slow" \
",46=Pilot No Compass" \
",47=Pilot Rate Gyro Fault" \
",48=Pilot Current Limit" \
",49=Pilot Way Point Advance Port" \
",50=Pilot Way Point Advance Stbd" \
",51=Pilot No Wind Data" \
",52=Pilot No Speed Data" \
",53=Pilot Seatalk Fail1" \
",54=Pilot Seatalk Fail2" \
",55=Pilot Warning Too Fast To Fish" \
",56=Pilot Auto Dockside Fail" \
",57=Pilot Turn Too Fast" \
",58=Pilot No Nav Data" \
",59=Pilot Lost Waypoint Data" \
",60=Pilot EEPROM Corrupt" \
",61=Pilot Rudder Feedback Fail" \
",62=Pilot Autolearn Fail1" \
",63=Pilot Autolearn Fail2" \
",64=Pilot Autolearn Fail3" \
",65=Pilot Autolearn Fail4" \
",66=Pilot Autolearn Fail5" \
",67=Pilot Autolearn Fail6" \
",68=Pilot Warning Cal Required" \
",69=Pilot Warning OffCourse" \
",70=Pilot Warning XTE" \
",71=Pilot Warning Wind Shift" \
",72=Pilot Warning Drive Short" \
",73=Pilot Warning Clutch Short" \
",74=Pilot Warning Solenoid Short" \
",75=Pilot Joystick Fault" \
",76=Pilot No Joystick Data" \
",77=not assigned" \
",78=not assigned" \
",79=not assigned" \
",80=Pilot Invalid Command" \
",81=AIS TX Malfunction" \
",82=AIS Antenna VSWR fault" \
",83=AIS Rx channel 1 malfunction" \
",84=AIS Rx channel 2 malfunction" \
",85=AIS No sensor position in use" \
",86=AIS No valid SOG information" \
",87=AIS No valid COG information" \
",88=AIS 12V alarm" \
",89=AIS 6V alarm" \
",90=AIS Noise threshold exceeded channel A" \
",91=AIS Noise threshold exceeded channel B" \
",92=AIS Transmitter PA fault" \
",93=AIS 3V3 alarm" \
",94=AIS Rx channel 70 malfunction" \
",95=AIS Heading lost/invalid" \
",96=AIS internal GPS lost" \
",97=AIS No sensor position" \
",98=AIS Lock failure" \
",99=AIS Internal GGA timeout" \
",100=AIS Protocol stack restart" \
",101=Pilot No IPS communications" \
",102=Pilot Power-On or Sleep-Switch Reset While Engaged " \
",103=Pilot Unexpected Reset While Engaged" \
",104=AIS Dangerous Target" \
",105=AIS Lost Target" \
",106=AIS Safety Related Message (used to silence)" \
",107=AIS Connection Lost" \
",108=No Fix" )
#define LOOKUP_SEATALK_ALARM_GROUP ( \
",0=Instrument" \
",1=Autopilot" \
",2=Radar" \
",3=Chart Plotter" \
",4=AIS" )
#define LOOKUP_ENTERTAINMENT_ZONE ( \
",0=All zones" \
",1=Zone 1" \
",2=Zone 2" \
",3=Zone 3" \
",4=Zone 4" )
#define LOOKUP_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" )
#define LOOKUP_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)" \
",25=Source renaming" )
#define LOOKUP_ENTERTAINMENT_REPEAT_STATUS ( \
",0=Off" \
",1=One" \
",2=All" )
#define LOOKUP_ENTERTAINMENT_SHUFFLE_STATUS ( \
",0=Off" \
",1=Play queue" \
",2=All" )
#define LOOKUP_ENTERTAINMENT_LIKE_STATUS ( \
",0=None" \
",1=Thumbs up" \
",2=Thumbs down" )
#define LOOKUP_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" )
#define LOOKUP_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" )
#define LOOKUP_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" )
#define LOOKUP_ENTERTAINMENT_EQ ( \
",0=Flat" \
",1=Rock" \
",2=Hall" \
",3=Jazz" \
",4=Pop" \
",5=Live" \
",6=Classic" \
",7=Vocal" \
",8=Arena" \
",9=Cinema" \
",10=Custom" )
#define LOOKUP_ENTERTAINMENT_FILTER ( \
",0=Full range" \
",1=High pass" \
",2=Low pass" \
",3=Band pass" \
",4=Notch filter" )
#define ACTISENSE_BEM 0x40000 /* Actisense specific fake PGNs */
typedef struct
{
char * description;
uint32_t pgn;
bool known; /* Are we pretty sure we've got all fields with correct definitions? */
uint32_t size; /* (Minimal) size of this PGN. Helps to determine fast/single frame and initial malloc */
uint32_t repeatingFields; /* How many fields at the end repeat until the PGN is exhausted? */
Field fieldList[30]; /* Note fixed # of fields; increase if needed. RepeatingFields support means this is enough for now. */
uint32_t fieldCount; /* Filled by C, no need to set in initializers. */
char * camelDescription; /* Filled by C, no need to set in initializers. */
bool unknownPgn; /* true = this is a catch-all for unknown PGNs */
} Pgn;
typedef struct
{
char timestamp[30 + 1];
uint8_t prio;
uint32_t pgn;
uint8_t dst;
uint8_t src;
uint8_t len;
uint8_t data[FASTPACKET_MAX_SIZE];
} RawMessage;
// Returns the first pgn that matches the given id, or 0 if not found.
Pgn* searchForPgn(int pgn);
// Returns a pointer (potentially invalid) to the first png that does not match "first".
Pgn* endPgn(Pgn* first);
Pgn* getMatchingPgn(int pgnId, uint8_t *dataStart, int length);
bool printPgn(RawMessage* msg, uint8_t *dataStart, int length, bool showData, bool showJson);
void checkPgnList(void);
Field * getField(uint32_t pgn, uint32_t field);
void extractNumber(const Field * field, uint8_t * data, size_t startBit, size_t bits, int64_t * value, int64_t * maxValue);
int parseRawFormatPlain(char * msg, RawMessage * m, bool showJson);
int parseRawFormatFast(char * msg, RawMessage * m, bool showJson);
int parseRawFormatAirmar(char * msg, RawMessage * m, bool showJson);
int parseRawFormatChetco(char * msg, RawMessage * m, bool showJson);
int parseRawFormatGarminCSV(char * msg, RawMessage * m, bool showJson, bool absolute);
#ifdef GLOBALS
Pgn pgnList[] =
{
/* PDU1 (addressed) single-frame range 0E800 to 0xEEFF (59392 - 61183) */
{ "Unknown single-frame addressed", 0, false, 8, 0,
{ { "Data", BYTES(8), RES_BINARY, false, 0, "" }
, { 0 }
}
, 0, 0, true
}
/************ Protocol PGNs ************/
/* http://www.nmea.org/Assets/july%202010%20nmea2000_v1-301_app_b_pgn_field_list.pdf */
/* http://www.maretron.com/products/pdf/J2K100-Data_Sheet.pdf */
/* http://www.nmea.org/Assets/pgn059392.pdf */
/* http://www8.garmin.com/manuals/GPSMAP4008_NMEA2000NetworkFundamentals.pdf */
/* http://www.furunousa.com/Furuno/Doc/0/8JT2BMDDIB249FCNUK64DKLV67/GP330B%20NMEA%20PGNs.pdf */
/* http://www.nmea.org/Assets/20140710%20nmea-2000-060928%20iso%20address%20claim%20pgn%20corrigendum.pdf */
,
{ "ISO Acknowledgement", 59392, true, 8, 0,
{ { "Control", BYTES(1), RES_LOOKUP, false, ",0=ACK,1=NAK,2=Access Denied,3=Address Busy", "" }
, { "Group Function", BYTES(1), 1, false, 0, "" }
, { "Reserved", 24, RES_BINARY, false, 0, "Reserved" }
, { "PGN", 24, RES_INTEGER, false, 0, "Parameter Group Number of requested information" }
, { 0 }
}
}
,
{ "ISO Request", 59904, true, 3, 0,
{ { "PGN", 24, RES_INTEGER, false, 0, "" }
, { 0 }
}
}
/* For a good explanation of ISO 11783 transport protocol (as used in J1939) see
* http://www.simmasoftware.com/j1939-presentation.pdf
*
* First: Transmit a RTS message to the specific address that says:
* 1. I'm about to send the following PGN in multiple packets.
* 2. I'm sending X amount of data.
* 3. I'm sending Y number of packets.
* 4. I can send Z number of packets at once.
* Second: Wait for CTS: CTS says:
* 1. I can receive M number of packets at once.
* 2. Start sending with sequence number N.
* Third: Send data. Then repeat steps starting with #2. When all data sent, wait for ACK.
*/
// ISO 11783 defines this PGN as part of the transport protocol method used for transmitting messages that have 9 or more data bytes. This PGN represents a single packet of a multipacket message.
,
{ "ISO Transport Protocol, Data Transfer", 60160, false, 8, 1,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Data", BYTES(7), 1, false, 0, "" }
, { 0 }
}
}
// ''ISO 11783 defines this group function PGN as part of the transport protocol method used for transmitting messages that have 9 or more data bytes. This PGN's role in the transport process is determined by the group function value found in the first data byte of the PGN.''
,
{ "ISO Transport Protocol, Connection Management - Request To Send", 60416, false, 8, 1,
{ { "Group Function Code", BYTES(1), 1, false, "=16", "RTS" }
, { "Message size", BYTES(2), 1, false, 0, "bytes" }
, { "Packets", BYTES(1), 1, false, 0, "packets" }
, { "Packets reply", BYTES(1), 1, false, 0, "packets sent in response to CTS" } // This one is still mysterious to me...
, { "PGN", BYTES(3), RES_INTEGER, false, 0, "PGN" }
, { 0 }
}
}
,
{ "ISO Transport Protocol, Connection Management - Clear To Send", 60416, false, 8, 1,
{ { "Group Function Code", BYTES(1), 1, false, "=17", "CTS" }
, { "Max packets", BYTES(1), 1, false, 0, "packets before waiting for next CTS" }
, { "Next SID", BYTES(1), 1, false, 0, "packet" }
, { "Reserved", BYTES(2), RES_BINARY, false, 0, "" }
, { "PGN", BYTES(3), RES_INTEGER, false, 0, "PGN" }
, { 0 }
}
}
,
{ "ISO Transport Protocol, Connection Management - End Of Message", 60416, false, 8, 1,
{ { "Group Function Code", BYTES(1), 1, false, "=19", "EOM" }
, { "Total message size", BYTES(2), 1, false, 0, "bytes" }
, { "Total number of packets received", BYTES(1), 1, false, 0, "packets" }
, { "Reserved", BYTES(1), RES_BINARY, false, 0, "" }
, { "PGN", BYTES(3), RES_INTEGER, false, 0, "PGN" }
, { 0 }
}
}
,
{ "ISO Transport Protocol, Connection Management - Broadcast Announce", 60416, false, 8, 1,
{ { "Group Function Code", BYTES(1), 1, false, "=32", "BAM" }
, { "Message size", BYTES(2), 1, false, 0, "bytes" }
, { "Packets", BYTES(1), 1, false, 0, "frames" }
, { "Reserved", BYTES(1), RES_BINARY, false, 0, "" }
, { "PGN", BYTES(3), RES_INTEGER, false, 0, "PGN" }
, { 0 }
}
}
,
{ "ISO Transport Protocol, Connection Management - Abort", 60416, false, 8, 1,
{ { "Group Function Code", BYTES(1), 1, false, "=255", "Abort" }
, { "Reason", BYTES(1), RES_BINARY, false, 0, "" }
, { "Reserved", BYTES(2), RES_BINARY, false, 0, "" }
, { "PGN", BYTES(3), RES_INTEGER, false, 0, "PGN" }
, { 0 }
}
}
,
{ "ISO Address Claim", 60928, true, 8, 0,
{ { "Unique Number", 21, RES_BINARY, false, 0, "ISO Identity Number" }
, { "Manufacturer Code", 11, RES_MANUFACTURER, false, 0, "" }
, { "Device Instance Lower", 3, 1, false, 0, "ISO ECU Instance" }
, { "Device Instance Upper", 5, 1, false, 0, "ISO Function Instance" }
, { "Device Function", 8, 1, false, 0, "ISO Function" }
, { "Reserved", 1, RES_BINARY, false, 0, "" }
, { "Device Class", 7, RES_LOOKUP, false, LOOKUP_DEVICE_CLASS, "" }
, { "System Instance", 4, 1, false, 0, "ISO Device Class Instance" }
, { "Industry Group", 3, RES_LOOKUP, false, LOOKUP_INDUSTRY_CODE, "" }
, { "Reserved", 1, RES_BINARY, false, 0, "ISO Self Configurable" }
, { 0 }
}
}
/* PDU1 (addressed) single-frame range 0EF00 to 0xEFFF (61184 - 61439) */
/* The following probably have the wrong Proprietary ID */
,
{ "Seatalk: Wireless Keypad Light Control", 61184, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=1", "Wireless Keypad Light Control" }
, { "Variant", BYTES(1), 1, false, 0, "" }
, { "Wireless Setting", BYTES(1), 1, false, 0, "" }
, { "Wired Setting", BYTES(1), 1, false, 0, "" }
}
}
,
{ "Seatalk: Wireless Keypad Light Control", 61184, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "PID", BYTES(1), 1, false, 0, "" }
, { "Variant", BYTES(1), 1, false, 0, "" }
, { "Beep Control", BYTES(1), 1, false, 0, "" }
}
}
,
{ "Victron Battery Register", 61184, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=358", "Victron" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Register Id", BYTES(2), 1, false, 0, "" }
, { "Payload", BYTES(4), 1, false, 0, "" }
}
}
,
{ "Manufacturer Proprietary single-frame addressed", 61184, false, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, 0, "" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, LOOKUP_INDUSTRY_CODE, "" }
, { "Data", BYTES(6), RES_BINARY, false, 0, "" }
, { 0 }
}
, 0, 0, true
}
/* PDU2 non-addressed single-frame PGN range 0xF000 - 0xFEFF (61440 - 65279) */
,
{ "Unknown single-frame non-addressed", 61440, false, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, 0, "" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, LOOKUP_INDUSTRY_CODE, "" }
, { "Data", BYTES(6), RES_BINARY, false, 0, "" }
, { 0 }
}
, 0, 0, true
}
/* Maretron ACM 100 manual documents PGN 65001-65030 */
,
{ "Bus #1 Phase C Basic AC Quantities", 65001, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { 0 }
}
}
,
{ "Bus #1 Phase B Basic AC Quantities", 65002, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { 0 }
}
}
,
{ "Bus #1 Phase A Basic AC Quantities", 65003, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { 0 }
}
}
,
{ "Bus #1 Average Basic AC Quantities", 65004, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { 0 }
}
}
,
{ "Utility Total AC Energy", 65005, false, 8, 0,
{ { "Total Energy Export", BYTES(4), 1, false, "kWh", "" }
, { "Total Energy Import", BYTES(4), 1, false, "kWh", "" }
, { 0 }
}
}
,
{ "Utility Phase C AC Reactive Power", 65006, false, 8, 0,
{ { "Reactive Power", BYTES(2), 1, false, "var", "" }
, { "Power Factor", BYTES(2), 1/16384, false, 0, "" }
, { "Power Factor Lagging", 2, RES_LOOKUP, false, LOOKUP_POWER_FACTOR, "" }
, { 0 }
}
}
,
{ "Utility Phase C AC Power", 65007, false, 8, 0,
{ { "Real Power", BYTES(4), 1, true, "W", "", -2000000000 }
, { "Apparent Power", BYTES(4), 1, true, "VA", "", -2000000000 }
, { 0 }
}
}
,
{ "Utility Phase C Basic AC Quantities", 65008, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { "AC RMS Current", BYTES(2), 1, false, "A", "" }
, { 0 }
}
}
,
{ "Utility Phase B AC Reactive Power", 65009, false, 8, 0,
{ { "Reactive Power", BYTES(2), 1, false, "var", "" }
, { "Power Factor", BYTES(2), 1/16384, false, 0, "" }
, { "Power Factor Lagging", 2, RES_LOOKUP, false, LOOKUP_POWER_FACTOR, "" }
, { 0 }
}
}
,
{ "Utility Phase B AC Power", 65010, false, 8, 0,
{ { "Real Power", BYTES(4), 1, true, "W", "", -2000000000 }
, { "Apparent Power", BYTES(4), 1, true, "VA", "", -2000000000 }
, { 0 }
}
}
,
{ "Utility Phase B Basic AC Quantities", 65011, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { "AC RMS Current", BYTES(2), 1, false, "A", "" }
, { 0 }
}
}
,
{ "Utility Phase A AC Reactive Power", 65012, false, 8, 0,
{ { "Reactive Power", BYTES(4), 1, true, "var", "", -2000000000 }
, { "Power Factor", BYTES(2), 1/16384, true, 0, "" }
, { "Power Factor Lagging", 2, RES_LOOKUP, false, LOOKUP_POWER_FACTOR, "" }
, { 0 }
}
}
,
{ "Utility Phase A AC Power", 65013, false, 8, 0,
{ { "Real Power", BYTES(4), 1, true, "W", "", -2000000000 }
, { "Apparent Power", BYTES(4), 1, true, "VA", "", -2000000000 }
, { 0 }
}
}
,
{ "Utility Phase A Basic AC Quantities", 65014, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { "AC RMS Current", BYTES(2), 1, false, "A", "" }
, { 0 }
}
}
,
{ "Utility Total AC Reactive Power", 65015, false, 8, 0,
{ { "Reactive Power", BYTES(4), 1, true, "var", "", -2000000000 }
, { "Power Factor", BYTES(2), 1/16384, false, 0, "" }
, { "Power Factor Lagging", 2, RES_LOOKUP, false, LOOKUP_POWER_FACTOR, "" }
, { 0 }
}
}
,
{ "Utility Total AC Power", 65016, false, 8, 0,
{ { "Real Power", BYTES(4), 1, true, "W", "", -2000000000 }
, { "Apparent Power", BYTES(4), 1, true, "VA", "", -2000000000 }
, { 0 }
}
}
,
{ "Utility Average Basic AC Quantities", 65017, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { "AC RMS Current", BYTES(2), 1, false, "A", "" }
, { 0 }
}
}
,
{ "Generator Total AC Energy", 65018, false, 8, 0,
{ { "Total Energy Export", BYTES(4), 1, false, "kWh", "" }
, { "Total Energy Import", BYTES(4), 1, false, "kWh", "" }
, { 0 }
}
}
,
{ "Generator Phase C AC Reactive Power", 65019, false, 8, 0,
{ { "Reactive Power", BYTES(2), 1, false, "var", "", -2000000000 }
, { "Power Factor", BYTES(2), 1/16384, false, 0, "" }
, { "Power Factor Lagging", 2, RES_LOOKUP, false, LOOKUP_POWER_FACTOR, "" }
, { 0 }
}
}
,
{ "Generator Phase C AC Power", 65020, false, 8, 0,
{ { "Real Power", BYTES(2), 1, false, "W", "", -2000000000 }
, { "Apparent Power", BYTES(2), 1, false, "VA", "", -2000000000 }
, { 0 }
}
}
,
{ "Generator Phase C Basic AC Quantities", 65021, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { "AC RMS Current", BYTES(2), 1, false, "A", "" }
, { 0 }
}
}
,
{ "Generator Phase B AC Reactive Power", 65022, false, 8, 0,
{ { "Reactive Power", BYTES(2), 1, false, "var", "", -2000000000 }
, { "Power Factor", BYTES(2), 1/16384, false, 0, "" }
, { "Power Factor Lagging", 2, RES_LOOKUP, false, LOOKUP_POWER_FACTOR, "" }
, { 0 }
}
}
,
{ "Generator Phase B AC Power", 65023, false, 8, 0,
{ { "Real Power", BYTES(2), 1, false, "W", "", -2000000000 }
, { "Apparent Power", BYTES(2), 1, false, "VA", "", -2000000000 }
, { 0 }
}
}
,
{ "Generator Phase B Basic AC Quantities", 65024, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { "AC RMS Current", BYTES(2), 1, false, "A", "" }
, { 0 }
}
}
,
{ "Generator Phase A AC Reactive Power", 65025, false, 8, 0,
{ { "Reactive Power", BYTES(2), 1, false, "var", "", -2000000000 }
, { "Power Factor", BYTES(2), 1/16384, false, 0, "" }
, { "Power Factor Lagging", 2, RES_LOOKUP, false, LOOKUP_POWER_FACTOR, "" }
, { 0 }
}
}
,
{ "Generator Phase A AC Power", 65026, false, 8, 0,
{ { "Real Power", BYTES(2), 1, false, "W", "", -2000000000 }
, { "Apparent Power", BYTES(2), 1, false, "VA", "", -2000000000 }
, { 0 }
}
}
,
{ "Generator Phase A Basic AC Quantities", 65027, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { "AC RMS Current", BYTES(2), 1, false, "A", "" }
, { 0 }
}
}
,
{ "Generator Total AC Reactive Power", 65028, false, 8, 0,
{ { "Reactive Power", BYTES(2), 1, false, "var", "", -2000000000 }
, { "Power Factor", BYTES(2), 1/16384, false, 0, "" }
, { "Power Factor Lagging", 2, RES_LOOKUP, false, LOOKUP_POWER_FACTOR, "" }
, { 0 }
}
}
,
{ "Generator Total AC Power", 65029, false, 8, 0,
{ { "Real Power", BYTES(2), 1, false, "W", "", -2000000000 }
, { "Apparent Power", BYTES(2), 1, false, "VA", "", -2000000000 }
, { 0 }
}
}
,
{ "Generator Average Basic AC Quantities", 65030, false, 8, 0,
{ { "Line-Line AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "Line-Neutral AC RMS Voltage", BYTES(2), 1, false, "V", "" }
, { "AC Frequency", BYTES(2), 1/128.0, false, "Hz", "" }
, { "AC RMS Current", BYTES(2), 1, false, "A", "" }
, { 0 }
}
}
,
{ "ISO Commanded Address", 65240, false, 9, 0,
/* ISO 11783 defined this message to provide a mechanism for assigning a network address to a node. The NAME information in the
data portion of the message must match the name information of the node whose network address is to be set. */
{ { "Unique Number", 21, RES_BINARY, false, 0, "ISO Identity Number" }
, { "Manufacturer Code", 11, 1, false, 0, "" }
, { "Device Instance Lower", 3, 1, false, 0, "ISO ECU Instance" }
, { "Device Instance Upper", 5, 1, false, 0, "ISO Function Instance" }
, { "Device Function", BYTES(1), 1, false, 0, "ISO Function" }
, { "Reserved", 1, RES_BINARY , false, 0, "" }
, { "Device Class", 7, RES_LOOKUP, false, LOOKUP_DEVICE_CLASS, "" }
, { "System Instance", 4, 1, false, 0, "ISO Device Class Instance" }
, { "Industry Code", 3, RES_LOOKUP, false, LOOKUP_INDUSTRY_CODE, "" }
, { "Reserved", 1, RES_BINARY, false, 0, "ISO Self Configurable" }
, { "New Source Address", BYTES(1), 1, false, 0, "" }
, { 0 }
}
}
/* proprietary PDU2 (non addressed) single-frame range 0xFF00 to 0xFFFF (65280 - 65535) */
,
{ "Manufacturer Proprietary single-frame non-addressed", 65280, false, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, 0, "" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, LOOKUP_INDUSTRY_CODE, "" }
, { "Data", BYTES(6), RES_BINARY, false, 0, "" }
, { 0 }
}
, 0, 0, true
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Boot State Acknowledgment", 65285, true, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Boot State", 4, RES_LOOKUP, false, ",0=in Startup Monitor,1=running Bootloader,2=running Application", "" }
, { 0 }
}
}
,
{ "Lowrance: Temperature", 65285, false, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=140", "Lowrance" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Temperature Source", BYTES(1), RES_LOOKUP, false, LOOKUP_TEMPERATURE_SOURCE, "" }
, { "Actual Temperature", BYTES(2), RES_TEMPERATURE, false, "K", "" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Boot State Request", 65286, true, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Access Level", 65287, true, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Format Code", 3, RES_LOOKUP, false, ",1=Format code 1", "" }
, { "Access Level", 3, RES_LOOKUP, false, ",0=Locked,1=unlocked level 1,2=unlocked level 2", "" }
, { "Reserved", 2, RES_BINARY, false, 0, "" }
, { "Access Seed/Key", BYTES(4), RES_INTEGER, false, 0, "When transmitted, it provides a seed for an unlock operation. It is used to provide the key during PGN 126208." }
, { 0 }
}
}
,
{ "Simnet: Configure Temperature Sensor", 65287, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1857", "Simrad" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
}
}
,
{ "Seatalk: Alarm", 65288, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "SID", BYTES(1), RES_BINARY, false, 0, "" }
, { "Alarm Status", BYTES(1), RES_LOOKUP, false, LOOKUP_SEATALK_ALARM_STATUS, "" }
, { "Alarm ID", BYTES(1), RES_LOOKUP, false, LOOKUP_SEATALK_ALARM_ID, "" }
, { "Alarm Group", BYTES(1), RES_LOOKUP, false, LOOKUP_SEATALK_ALARM_GROUP, "" }
, { "Alarm Priority", BYTES(2), RES_BINARY, false, 0, "" }
}
}
,
{ "Simnet: Trim Tab Sensor Calibration", 65289, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1857", "Simrad" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
}
}
,
{ "Simnet: Paddle Wheel Speed Configuration", 65290, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1857", "Simrad" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
}
}
,
{ "Simnet: Clear Fluid Level Warnings", 65292, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1857", "Simrad" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
}
}
,
{ "Simnet: LGC-2000 Configuration", 65293, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1857", "Simrad" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
}
}
,
{ "Navico: Wireless Battery Status", 65309, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=275", "Navico" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Status", BYTES(1), 1, false, 0, "" }
, { "Battery Status", BYTES(1), 1, false, "%", "" }
, { "Battery Charge Status", BYTES(1), 1, false, "%", "" }
, { "Reserved", BYTES(3), 1, false, 0, "" }
, { 0 }
}
}
,
{ "Navico: Wireless Signal Status", 65312, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=275", "Navico" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Unknown", BYTES(1), 1, false, 0, "" }
, { "Signal Strength", BYTES(1), 1, false, "%", "" }
, { "Reserved", BYTES(3), 1, false, 0, "" }
, { 0 }
}
}
,
{ "Simnet: Reprogram Status", 65325, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1857", "Simrad" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
}
}
,
{ "Simnet: Autopilot Mode", 65341, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1857", "Simrad" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
}
}
,
{ "Seatalk: Pilot Wind Datum", 65345, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Wind Datum", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Rolling Average Wind Angle", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Reserved", BYTES(2), 1, false, 0, "" }
}
}
,
{ "Seatalk: Pilot Heading", 65359, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "SID", BYTES(1), RES_BINARY, false, 0, "" }
, { "Heading True", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Heading Magnetic", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Reserved", BYTES(1), 1, false, 0, "" }
}
}
,
{ "Seatalk: Pilot Locked Heading", 65360, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "SID", BYTES(1), RES_BINARY, false, 0, "" }
, { "Target Heading True", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Target Heading Magnetic", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Reserved", BYTES(1), RES_BINARY, false, 0, "" }
}
}
,
{ "Seatalk: Silence Alarm", 65361, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Alarm ID", BYTES(1), RES_LOOKUP, false, LOOKUP_SEATALK_ALARM_ID, "" }
, { "Alarm Group", BYTES(1), RES_LOOKUP, false, LOOKUP_SEATALK_ALARM_GROUP, "" }
, { "Reserved", 32, RES_BINARY, false, 0, "" }
}
}
,
{ "Seatalk: Keypad Message", 65371, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), 1, false, 0, "" }
, { "First key", BYTES(1), 1, false, 0, "" }
, { "Second key", BYTES(1), 1, false, 0, "" }
, { "First key state", 2, 1, false, 0, "" }
, { "Second key state", 2, 1, false, 0, "" }
, { "Reserved", 4, RES_BINARY, false, 0, "" }
, { "Encoder Position", BYTES(1), 1, false, 0, "" }
}
}
,
{ "SeaTalk: Keypad Heartbeat", 65374, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), 1, false, 0, "" }
, { "Variant", BYTES(1), 1, false, 0, "" }
, { "Status", BYTES(1), 1, false, 0, "" }
}
}
,
{ "Seatalk: Pilot Mode", 65379, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Pilot Mode", BYTES(1), RES_BINARY, false, 0, "" }
, { "Sub Mode", BYTES(1), RES_BINARY, false, 0, "" }
, { "Pilot Mode Data", BYTES(1), RES_BINARY, false, 0, "" }
, { "Reserved", BYTES(3), RES_BINARY, false, 0, "" }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Depth Quality Factor", 65408, false, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "SID", BYTES(1), 1, false, 0, "" }
, { "Depth Quality Factor", 4, RES_LOOKUP, false, ",0=No Depth Lock", "" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Device Information", 65410, false, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "SID", BYTES(1), 1, false, 0, "" }
, { "Internal Device Temperature", BYTES(2), RES_TEMPERATURE, false, "K", "" }
, { "Supply Voltage", BYTES(2), 0.01, false, "V", "" }
, { "Reserved", BYTES(1), RES_BINARY, false, 0, "" }
, { 0 }
}
}
,
{ "Simnet: Autopilot Mode", 65480, false, 0x08, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1857", "Simrad" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { 0 }
}
}
/* PDU1 (addressed) fast-packet range 0x10000 to 0x1EEFF (65536 - 126719) */
,
{ "Unknown fast-packet addressed", 65536, false, 255, 0,
{ { "Data", BYTES(255), RES_BINARY, false, 0, "" }
, { 0 }
}
, 0, 0, true
}
/* http://www.maretron.com/support/manuals/DST100UM_1.2.pdf */
/* http://www.nmea.org/Assets/20140109%20nmea-2000-corrigendum-tc201401031%20pgn%20126208.pdf */
,
{ "NMEA - Request group function", 126208, true, 12, 2,
{ { "Function Code", BYTES(1), RES_INTEGER, false, "=0", "Request" }
, { "PGN", BYTES(3), RES_INTEGER, false, 0, "Requested PGN" }
, { "Transmission interval", BYTES(4), 0.001, false, "s", "" }
, { "Transmission interval offset", BYTES(2), 0.01, false, "s", "" }
, { "# of Parameters", BYTES(1), 1, false, 0, "How many parameter pairs will follow" }
, { "Parameter", BYTES(1), RES_INTEGER, false, 0, "Parameter index" }
, { "Value", LEN_VARIABLE, RES_INTEGER, false, 0, "Parameter value, variable length" }
, { 0 }
}
}
,
{ "NMEA - Command group function", 126208, true, 8, 2,
{ { "Function Code", BYTES(1), RES_INTEGER, false, "=1", "Command" }
, { "PGN", BYTES(3), RES_INTEGER, false, 0, "Commanded PGN" }
, { "Priority", 4, 1, false, 0, ",8=Leave priority unchanged,9=Reset to default" }
, { "Reserved", 4, RES_BINARY, false, 0, "" }
, { "# of Parameters", BYTES(1), 1, false, 0, "How many parameter pairs will follow" }
, { "Parameter", BYTES(1), RES_INTEGER, false, 0, "Parameter index" }
, { "Value", LEN_VARIABLE, RES_INTEGER, false, 0, "Parameter value, variable length" }
, { 0 }
}
}
,
{ "NMEA - Acknowledge group function", 126208, true, 8, 1,
{ { "Function Code", BYTES(1), RES_INTEGER, false, "=2", "Acknowledge" }
, { "PGN", 24, RES_INTEGER, false, 0, "Commanded PGN" }
, { "PGN error code", 4, RES_LOOKUP, false, ",0=Acknowledge,1=PGN not supported,2=PGN not available,3=Access denied,4=Not supported,5=Tag not supported,6=Read or Write not supported", "" }
, { "Transmission interval/Priority error code", 4, RES_LOOKUP, false, ",0=Acknowledge,1=Transmit Interval/Priority not supported,2=Transmit Interval to low,3=Access denied,4=Not supported", "" }
, { "# of Parameters", 8, 1, false, 0, "" }
, { "Parameter", 4, RES_LOOKUP, false, ",0=Acknowledge,1=Invalid parameter field,2=Temporary error,3=Parameter out of range,4=Access denied,5=Not supported,6=Read or Write not supported", "" }
, { 0 }
}
}
,
{ "NMEA - Read Fields group function", 126208, false, 8, 102,
{ { "Function Code", BYTES(1), RES_INTEGER, false, "=3", "Read Fields" }
, { "PGN", 24, RES_INTEGER, false, 0, "Commanded PGN" }
, { "Manufacturer Code", 11, RES_MANUFACTURER, false, 0, "" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Reserved", 2, RES_NOTUSED, false, 0, "" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Industry Code", 3, RES_LOOKUP, false, LOOKUP_INDUSTRY_CODE, "" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Unique ID", 8, RES_INTEGER, false, 0, "" }
, { "# of Selection Pairs", 8, 1, false, 0, "" }
, { "# of Parameters", 8, 1, false, 0, "" }
, { "Selection Parameter", BYTES(1), RES_INTEGER, false, 0, "" }
, { "Selection Value", LEN_VARIABLE, RES_INTEGER, false, 0, "" }
, { "Parameter", BYTES(1), RES_INTEGER, false, 0, "" }
, { 0 }
}
}
/* The following won't work when analyzing non-proprietary PGNs */
,
{ "NMEA - Read Fields reply group function", 126208, true, 8, 202,
{ { "Function Code", BYTES(1), RES_INTEGER, false, "=4", "Read Fields Reply" }
, { "PGN", 24, RES_INTEGER, false, 0, "Commanded PGN" }
, { "Manufacturer Code", 11, RES_MANUFACTURER, false, 0, "Only for proprietary PGNs" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Reserved", 2, RES_NOTUSED, false, 0, "Only for proprietary PGNs" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Industry Code", 3, RES_LOOKUP, false, LOOKUP_INDUSTRY_CODE, "Only for proprietary PGNs" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Unique ID", 8, RES_INTEGER, false, 0, "" }
, { "# of Selection Pairs", 8, 1, false, 0, "" }
, { "# of Parameters", 8, 1, false, 0, "" }
, { "Selection Parameter", BYTES(1), RES_INTEGER, false, 0, "" }
, { "Selection Value", LEN_VARIABLE, RES_INTEGER, false, 0, "" }
, { "Parameter", BYTES(1), RES_INTEGER, false, 0, "" }
, { "Value", LEN_VARIABLE, RES_INTEGER, false, 0, "" }
, { 0 }
}
}
/* The following won't work when analyzing non-proprietary PGNs */
,
{ "NMEA - Write Fields group function", 126208, true, 8, 202,
{ { "Function Code", BYTES(1), RES_INTEGER, false, "=5", "Write Fields" }
, { "PGN", 24, RES_INTEGER, false, 0, "Commanded PGN" }
, { "Manufacturer Code", 11, RES_MANUFACTURER, false, 0, "Only for proprietary PGNs" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Reserved", 2, RES_NOTUSED, false, 0, "Only for proprietary PGNs" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Industry Code", 3, RES_LOOKUP, false, LOOKUP_INDUSTRY_CODE, "Only for proprietary PGNs" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Unique ID", 8, RES_INTEGER, false, 0, "" }
, { "# of Selection Pairs", 8, 1, false, 0, "" }
, { "# of Parameters", 8, 1, false, 0, "" }
, { "Selection Parameter", BYTES(1), RES_INTEGER, false, 0, "" }
, { "Selection Value", LEN_VARIABLE, RES_INTEGER, false, 0, "" }
, { "Parameter", BYTES(1), RES_INTEGER, false, 0, "" }
, { "Value", LEN_VARIABLE, RES_INTEGER, false, 0, "" }
, { 0 }
}
}
/* The following won't work when analyzing non-proprietary PGNs */
,
{ "NMEA - Write Fields reply group function", 126208, true, 8, 202,
{ { "Function Code", BYTES(1), RES_INTEGER, false, "=6", "Write Fields Reply" }
, { "PGN", 24, RES_INTEGER, false, 0, "Commanded PGN" }
, { "Manufacturer Code", 11, RES_MANUFACTURER, false, 0, "Only for proprietary PGNs" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Reserved", 2, RES_NOTUSED, false, 0, "Only for proprietary PGNs" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Industry Code", 3, RES_LOOKUP, false, LOOKUP_INDUSTRY_CODE, "Only for proprietary PGNs" } // TODO: Only in PGN when field PGN is proprietary. Sigh.
, { "Unique ID", 8, RES_INTEGER, false, 0, "" }
, { "# of Selection Pairs", 8, 1, false, 0, "" }
, { "# of Parameters", 8, 1, false, 0, "" }
, { "Selection Parameter", BYTES(1), RES_INTEGER, false, 0, "" }
, { "Selection Value", LEN_VARIABLE, RES_INTEGER, false, 0, "" }
, { "Parameter", BYTES(1), RES_INTEGER, false, 0, "" }
, { "Value", LEN_VARIABLE, RES_INTEGER, false, 0, "" }
, { 0 }
}
}
/************ RESPONSE TO REQUEST PGNS **************/
,
{ "Maretron: Slave Response", 126270, false, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=137", "Maretron" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Product code", BYTES(2), 1, false, 0, "0x1b2=SSC200" }
, { "Software code", BYTES(2), 1, false, 0, "" }
, { "Command", BYTES(1), 1, false, 0, "0x50=Deviation calibration result" }
, { "Status", BYTES(1), 1, false, 0, "" }
, { 0 }
}
}
,
{ "PGN List (Transmit and Receive)", 126464, false, 8, 1,
{ { "Function Code", BYTES(1), RES_LOOKUP, false, ",0=Transmit PGN list,1=Receive PGN list", "Transmit or receive PGN Group Function Code" }
, { "PGN", 24, RES_INTEGER, false, 0, }
, { 0 }
}
}
/* proprietary PDU1 (addressed) fast-packet range 0x1EF00 to 0x1EFFF (126720 - 126975) */
/* Seatalk1 code from http://thomasknauf.de/rap/seatalk2.htm */
,
{ "Seatalk1: Keystroke", 126720, false, 21, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(2), RES_INTEGER, false, "=33264", "0x81f0" }
, { "command", BYTES(1), RES_BINARY, false, "=134", "0x86" }
, { "device", BYTES(1), RES_LOOKUP, false, ",33=S100", "" }
, { "key", BYTES(2), RES_LOOKUP, false, ",64005=-1,63495=+1,64770=Standby,65025=Auto,63240=+10,63750=-10,56865=-1 and -10,56610=+1 and +10", "" }
, { "Unknown data", BYTES(14), RES_BINARY, false, 0, "" } // xx xx xx xx xx c1 c2 cd 64 80 d3 42 f1 c8 (if xx=0xff =>working or xx xx xx xx xx = [A5 FF FF FF FF | 00 00 00 FF FF | FF FF FF FF FF | 42 00 F8 02 05])
, { 0 }
}
}
,
{ "Seatalk1: Device Indentification", 126720, false, 8, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=1851", "Raymarine" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(2), RES_INTEGER, false, "=33264", "0x81f0" }
, { "command", BYTES(1), RES_BINARY, false, "=144", "0x90" }
, { "Reserved", BYTES(1), RES_NOTUSED, false, 0, "" } // 0x00
, { "device", BYTES(1), RES_LOOKUP, false, ",3=S100,5=Course Computer", "" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/PB200UserManual.pdf */
,
{ "Airmar: Attitude Offset", 126720, true, 9, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=32", "Attitude Offsets" }
, { "Azimuth offset", BYTES(2), RES_RADIANS, true, "rad", "Positive: sensor rotated to port, negative: sensor rotated to starboard" }
, { "Pitch offset", BYTES(2), RES_RADIANS, true, "rad", "Positive: sensor tilted to bow, negative: sensor tilted to stern" }
, { "Roll offset", BYTES(2), RES_RADIANS, true, "rad", "Positive: sensor tilted to port, negative: sensor tilted to starboard" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/PB200UserManual.pdf */
,
{ "Airmar: Calibrate Compass", 126720, true, 24, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=33", "Calibrate Compass" }
, { "Calibrate Function", BYTES(1), RES_LOOKUP, false, ",0=Normal/cancel calibration,1=Enter calibration mode,2=Reset calibration to 0,3=Verify,4=Reset compass to defaults,5=Reset damping to defaults", "" }
, { "Calibration Status", BYTES(1), RES_LOOKUP, false, ",0=Queried,1=Passed,2=Failed - timeout,3=Failed - tilt error,4=Failed - other,5=In progress", "" }
, { "Verify Score", BYTES(1), RES_INTEGER, false, 0, "TBD" }
, { "X-axis gain value", BYTES(2), 0.01, true, 0, "default 100, range 50 to 500" }
, { "Y-axis gain value", BYTES(2), 0.01, true, 0, "default 100, range 50 to 500" }
, { "Z-axis gain value", BYTES(2), 0.01, true, 0, "default 100, range 50 to 500" }
, { "X-axis linear offset", BYTES(2), 0.01, true, "Tesla", "default 0, range -320.00 to 320.00" }
, { "Y-axis linear offset", BYTES(2), 0.01, true, "Tesla", "default 0, range -320.00 to 320.00" }
, { "Z-axis linear offset", BYTES(2), 0.01, true, "Tesla", "default 0, range -320.00 to 320.00" }
, { "X-axis angular offset", BYTES(2), 0.1, true, "deg", "default 0, range 0 to 3600" }
, { "Pitch and Roll damping", BYTES(2), 0.05, true, "s", "default 30, range 0 to 200" }
, { "Compass/Rate gyro damping", BYTES(2), 0.05, true, "s", "default -30, range -2400 to 2400, negative indicates rate gyro is to be used in compass calculations" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/PB200UserManual.pdf */
,
{ "Airmar: True Wind Options", 126720, true, 6, 0,//FIXME Single Frame: No
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=34", "True Wind Options" }
, { "COG substition for HDG", 2, RES_LOOKUP, false, ",0=Use HDG only,1=Allow COG to replace HDG", "Allow use of COG when HDG not available?" }
, { "Calibration Status", BYTES(1), RES_LOOKUP, false, ",0=Queried,1=Passed,2=Failed - timeout,3=Failed - tilt error,4=Failed - other,5=In progress", "" }
, { "Verify Score", BYTES(1), RES_INTEGER, false, 0, "TBD" }
, { "X-axis gain value", BYTES(2), 0.01, true, 0, "default 100, range 50 to 500" }
, { "Y-axis gain value", BYTES(2), 0.01, true, 0, "default 100, range 50 to 500" }
, { "Z-axis gain value", BYTES(2), 0.01, true, 0, "default 100, range 50 to 500" }
, { "X-axis linear offset", BYTES(2), 0.01, true, "Tesla", "default 0, range -320.00 to 320.00" }
, { "Y-axis linear offset", BYTES(2), 0.01, true, "Tesla", "default 0, range -320.00 to 320.00" }
, { "Z-axis linear offset", BYTES(2), 0.01, true, "Tesla", "default 0, range -320.00 to 320.00" }
, { "X-axis angular offset", BYTES(2), 0.1, true, "deg", "default 0, range 0 to 3600" }
, { "Pitch and Roll damping", BYTES(2), 0.05, true, "s", "default 30, range 0 to 200" }
, { "Compass/Rate gyro damping", BYTES(2), 0.05, true, "s", "default -30, range -2400 to 2400, negative indicates rate gyro is to be used in compass calculations" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Simulate Mode", 126720, true, 6, 0,//FIXME Single Frame: No
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=35", "Simulate Mode" }
, { "Simulate Mode", 2, RES_LOOKUP, false, ",0=Off,1=On", "" }
, { "Reserved", 22, RES_BINARY, false, 0, "Reserved" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Calibrate Depth", 126720, true, 6, 0,//FIXME Single Frame: No
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=40", "Calibrate Depth" }
, { "Speed of Sound Mode", BYTES(2), 0.1, false, "m/s", "actual allowed range is 1350.0 to 1650.0 m/s" }
, { "Reserved", 8, RES_BINARY, false, 0, "Reserved" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Calibrate Speed", 126720, true, 12, 2,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=41", "Calibrate Speed" }
, { "Number of pairs of data points", BYTES(1), RES_INTEGER, false, 0, "actual range is 0 to 25. 254=restore default speed curve"
}
, { "Input frequency", BYTES(2), 0.1, false, "Hz", "" }
, { "Output speed", BYTES(2), 0.01, false, "m/s", "" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Calibrate Temperature", 126720, true, 6, 2,//FIXME Single Frame: No
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=42", "Calibrate Temperature" }
, { "Temperature instance", 2, RES_LOOKUP, false, ",0=Device Sensor,1=Onboard Water Sensor,2=Optional Water Sensor", "" }
, { "Reserved", 6, RES_BINARY, false, 0, "Reserved" }
, { "Temperature offset", BYTES(2), 0.1, false, "Hz", "" }
, { "Temperature offset", BYTES(2), 0.001, true, "K", "actual range is -9.999 to +9.999 K" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Speed Filter", 126720, true, 8, 2,//FIXME Single Frame: No (type 0: NDB=6; type 1:NDB=8)
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=43", "Speed Filter" }
, { "Filter type", 4, RES_LOOKUP, false, ",0=no filter,1=basic IIR filter", "" }
, { "Reserved", 4, RES_BINARY, false, 0, "Reserved" }
, { "Sample interval", BYTES(2), 0.01, false, "s", "" }
, { "Filter duration", BYTES(2), 0.01, false, "s", "" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: Temperature Filter", 126720, true, 8, 2,//FIXME Single Frame: No (type 0: NDB=6; type 1:NDB=8)
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=44", "Temperature Filter" }
, { "Filter type", 4, RES_LOOKUP, false, ",0=no filter,1=basic IIR filter,15=data not available", "" }
, { "Reserved", 4, RES_BINARY, false, 0, "Reserved" }
, { "Sample interval", BYTES(2), 0.01, false, "s", "" }
, { "Filter duration", BYTES(2), 0.01, false, "s", "" }
, { 0 }
}
}
/* http://www.airmartechnology.com/uploads/installguide/DST200UserlManual.pdf */
,
{ "Airmar: NMEA 2000 options", 126720, true, 6, 2,//FIXME Single Frame: No
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, "=46", "NMEA 2000 options" }
, { "Transmission Interval", 2, RES_LOOKUP, false, ",0=Measure Interval,1=Requested by user,2=reserved,3=data not available", "" }
, { "Reserved", 22, RES_BINARY, false, 0, "Reserved" }
, { 0 }
}
}
,
{ "Airmar: Addressable Multi-Frame", 126720, true, 4, 0,//FIXME Single Frame: No
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, "=135", "Airmar" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, "=4", "Marine Industry" }
, { "Proprietary ID", BYTES(1), RES_INTEGER, false, 0, "" }
, { 0 }
}
}
,
{ "Manufacturer Proprietary fast-packet addressed", 126720, true, 223, 0,
{ { "Manufacturer Code", 11, RES_MANUFACTURER, false, 0, "" }
, { "Reserved", 2, RES_NOTUSED, false, 0, "" }
, { "Industry Code", 3, RES_LOOKUP, false, LOOKUP_INDUSTRY_CODE, "" }
, { "Data", BYTES(221), RES_BINARY, false, 0, "" }
, { 0 }
}
, 0, 0, true
}
/* PDU2 (non addressed) fast packet range 0x1F000 to 0x1FEFF (126976 - 130815) */
,
{ "Unknown fast-packet non-addressed", 126976, false, 255, 0,
{ { "Data", BYTES(255), RES_BINARY, false, 0, "" }
, { 0 }
}
, 0, 0, true
}
,
{ "Alert", 126983, false, 8, 0,
{ { 0 }
}
}
,
{ "Alert Response", 126984, false, 8, 0,
{ { 0 }
}
}
,
{ "Alert Text", 126985, false, 8, 0,
{ { 0 }
}
}
,
{ "Alert Configuration", 126986, false, 8, 0,
{ { 0 }
}
}
,
{ "Alert Threshold", 126987, false, 8, 0,
{ { 0 }
}
}
,
{ "Alert Value", 126988, false, 8, 0,
{ { 0 }
}
}
/* http://www.maretron.com/support/manuals/GPS100UM_1.2.pdf */
,
{ "System Time", 126992, true, 8, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Source", 4, RES_LOOKUP, false, LOOKUP_SYSTEM_TIME, "" }
, { "Reserved", 4, RES_BINARY, false, 0, "Reserved" }
, { "Date", BYTES(2), RES_DATE, false, "days", "Days since January 1, 1970" }
, { "Time", BYTES(4), RES_TIME, false, "s", "Seconds since midnight" }
, { 0 }
}
}
/* http://www.nmea.org/Assets/20130905%20nmea%202000%20heartbeat%20amendment%20final.pdf */
,
{ "Heartbeat", 126993, true, 8, 0,
{ { "Data transmit offset", BYTES(2), 0.01, false, "s", "Offset in transmit time from time of request command: 0x0 = transmit immediately, 0xFFFF = Do not change offset." }
, { "Sequence Counter", BYTES(1), RES_INTEGER, false, 0, "" }
, { "Reserved", BYTES(3), RES_BINARY, false, 0, "Reserved" }
, { 0 }
}
}
,
{ "Product Information", 126996, false, 0x86, 0,
{ { "NMEA 2000 Version", BYTES(2), 1, false, 0, "" }
, { "Product Code", BYTES(2), 1, false, 0, "" }
, { "Model ID", BYTES(32), RES_ASCII, false, 0, "" }
, { "Software Version Code", BYTES(32), RES_ASCII, false, 0, "" }
, { "Model Version", BYTES(32), RES_ASCII, false, 0, "" }
, { "Model Serial Code", BYTES(32), RES_ASCII, false, 0, "" }
, { "Certification Level", BYTES(1), 1, false, 0, "" }
, { "Load Equivalency", BYTES(1), 1, false, 0, "" }
, { 0 }
}
}
,
{ "Configuration Information", 126998, false, 0x2a, 0,
{ { "Station ID", BYTES(2), 1, false, 0, "" }
, { "Station Name", BYTES(2), 1, false, 0, "" }
, { "A", BYTES(2), 1, false, 0, "" }
, { "Manufacturer", BYTES(36), RES_ASCII, false, 0, "" }
, { "Installation Description #1", BYTES(2), 1, false, 0, "" }
, { "Installation Description #2", BYTES(2), 1, false, 0, "" }
, { 0 }
}
}
/************ PERIODIC DATA PGNs **************/
/* http://www.nmea.org/Assets/july%202010%20nmea2000_v1-301_app_b_pgn_field_list.pdf */
/* http://www.maretron.com/support/manuals/USB100UM_1.2.pdf */
/* http://www8.garmin.com/manuals/GPSMAP4008_NMEA2000NetworkFundamentals.pdf */
/* http://www.nmea.org/Assets/20130906%20nmea%202000%20%20man%20overboard%20notification%20%28mob%29%20pgn%20127233%20amendment.pdf */
,
{ "Man Overboard Notification", 127233, true, 35, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "MOB Emitter ID", BYTES(4), RES_INTEGER, false, 0, "Identifier for each MOB emitter, unique to the vessel" }
, { "Man Overboard Status", 3, RES_LOOKUP, false, ",0=MOB Emitter Activated,1=Manual on-board MOB Button Activation,2=Test Mode,3=MOB Not Active", "" }
, { "Reserved", 5, RES_BINARY, false, 0, "" }
, { "Activation Time", BYTES(4), RES_TIME, false, "s", "Time of day (UTC) when MOB was activated" }
, { "Position Source", 3, RES_LOOKUP, false, ",0=Position estimated by the Vessel,1=Position reported by MOB emitter", "" }
, { "Reserved", 5, RES_BINARY, false, 0, "" }
, { "Position Date", BYTES(2), RES_DATE, false, "", "Date of MOB position" }
, { "Position Time", BYTES(4), RES_TIME, false, "s", "Time of day of MOB position (UTC)" }
, { "Latitude", BYTES(4), RES_LATITUDE, true, "deg", "" }
, { "Longitude", BYTES(4), RES_LONGITUDE, true, "deg", "" }
, { "COG Reference", 2, RES_LOOKUP, false, LOOKUP_DIRECTION_REFERENCE, "" }
, { "Reserved", 6, RES_BINARY, false, 0, "" }
, { "COG", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "SOG", BYTES(2), 0.01, false, "m/s", "" }
, { "MMSI of vessel of origin", BYTES(4), RES_INTEGER, false, "MMSI", "" }
, { "MOB Emitter Battery Status", 3, RES_LOOKUP, false, ",0=Good,1=Low", "" }
, { "Reserved", 5, RES_BINARY, false, 0, "" }
, { 0 }
}
}
,
{ "Heading/Track control", 127237, false, 0x15, 0,
{ { "Rudder Limit Exceeded", 2, 1, false, 0, "" }
, { "Off-Heading Limit Exceeded", 2, 1, false, 0, "" }
, { "Off-Track Limit Exceeded", 2, 1, false, 0, "" }
, { "Override", 2, 1, false, 0, "" }
, { "Steering Mode", 4, 1, false, 0, "" }
, { "Turn Mode", 4, 1, false, 0, "" }
, { "Heading Reference", 3, 1, false, 0, "" }
, { "Reserved", 3, RES_BINARY, false, 0, "" }
, { "Commanded Rudder Direction", 2, 1, false, 0, "" }
, { "Commanded Rudder Angle", BYTES(2), RES_RADIANS, true, "rad", "" }
, { "Heading-To-Steer (Course)", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Track", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Rudder Limit", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Off-Heading Limit", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Radius of Turn Order", BYTES(2), RES_RADIANS, true, "rad", "" }
, { "Rate of Turn Order", BYTES(2), RES_ROTATION, true, "rad/s", "" }
, { "Off-Track Limit", BYTES(2), 1, true, "m", "" }
, { "Vessel Heading", BYTES(2), RES_RADIANS, false, "rad", "" }
, { 0 }
}
}
/* http://www.maretron.com/support/manuals/RAA100UM_1.0.pdf */
/* Haven't actually seen this value yet, lengths are guesses */
,
{ "Rudder", 127245, false, 8, 0,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "Direction Order", 2, 1, false, 0, "" }
, { "Reserved", 6, RES_BINARY, false, 0, "Reserved" }
, { "Angle Order", BYTES(2), RES_RADIANS, true, "rad", "" }
, { "Position", BYTES(2), RES_RADIANS, true, "rad", "" }
, { 0 }
}
}
/* NMEA + Simrad AT10 */
/* http://www.maretron.com/support/manuals/SSC200UM_1.7.pdf */
/* molly_rose_E80start.kees */
,
{ "Vessel Heading", 127250, true, 8, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Heading", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Deviation", BYTES(2), RES_RADIANS, true, "rad", "" }
, { "Variation", BYTES(2), RES_RADIANS, true, "rad", "" }
, { "Reference", 2, RES_LOOKUP, false, LOOKUP_DIRECTION_REFERENCE, "" }
, { 0 }
}
}
/* http://www.maretron.com/support/manuals/SSC200UM_1.7.pdf */
/* Lengths observed from Simrad RC42 */
,
{ "Rate of Turn", 127251, true, 5, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Rate", BYTES(4), RES_HIRES_ROTATION, true, "rad/s", "" }
, { 0 }
}
}
,
{ "Attitude", 127257, true, 7, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Yaw", BYTES(2), RES_RADIANS, true, "rad", "" }
, { "Pitch", BYTES(2), RES_RADIANS, true, "rad", "" }
, { "Roll", BYTES(2), RES_RADIANS, true, "rad", "" }
, { 0 }
}
}
/* NMEA + Simrad AT10 */
/* http://www.maretron.com/support/manuals/GPS100UM_1.2.pdf */
,
{ "Magnetic Variation", 127258, true, 6, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Source", 4, RES_LOOKUP, false, LOOKUP_MAGNETIC_VARIATION, "" }
, { "Reserved", 4, RES_BINARY, false, 0, "Reserved" }
, { "Age of service", BYTES(2), RES_DATE, false, "days", "Days since January 1, 1970" }
, { "Variation", BYTES(2), RES_RADIANS, true, "rad", "" }
, { 0 }
}
}
/* Engine group PGNs all derived PGN Numbers from */
/* http://www.maretron.com/products/pdf/J2K100-Data_Sheet.pdf */
/* http://www.floscan.com/html/blue/NMEA2000.php */
// http://www.osukl.com/wp-content/uploads/2015/04/3155-UM.pdf
,
{ "Engine Parameters, Rapid Update", 127488, true, 8, 0,
{ { "Instance", BYTES(1), RES_LOOKUP, false, LOOKUP_ENGINE_INSTANCE, "" }
, { "Speed", BYTES(2), 0.25, false, "rpm", "" }
, { "Boost Pressure", BYTES(2), RES_PRESSURE, false, "hPa", "" }
, { "Tilt/Trim", BYTES(1), 1, true, "", "" }
, { 0 }
}
}
// http://www.osukl.com/wp-content/uploads/2015/04/3155-UM.pdf
,
{ "Engine Parameters, Dynamic", 127489, true, 26, 0,
{ { "Instance", BYTES(1), RES_LOOKUP, false, LOOKUP_ENGINE_INSTANCE, "" }
, { "Oil pressure", BYTES(2), RES_PRESSURE, false, "hPa", "" }
, { "Oil temperature", BYTES(2), RES_TEMPERATURE_HIGH, false, "K", "" }
, { "Temperature", BYTES(2), RES_TEMPERATURE, false, "K", "" }
, { "Alternator Potential", BYTES(2), 0.01, true, "V", "" }
, { "Fuel Rate", BYTES(2), 0.1, true, "L/h", "" }
, { "Total Engine hours", BYTES(4), 1.0, false, "s", "" }
, { "Coolant Pressure", BYTES(2), RES_PRESSURE, false, "hPa", "" }
, { "Fuel Pressure", BYTES(2), 1, false, "hPa", "" }
, { "Reserved", BYTES(1), RES_BINARY, false, 0, "" }
, { "Discrete Status 1", BYTES(2), RES_BITFIELD, false, LOOKUP_ENGINE_STATUS_1, "" }
, { "Discrete Status 2", BYTES(2), RES_BITFIELD, false, LOOKUP_ENGINE_STATUS_2, "" }
, { "Percent Engine Load", BYTES(1), RES_INTEGER, true, "%", "" }
, { "Percent Engine Torque", BYTES(1), RES_INTEGER, true, "%", "" }
, { 0 }
}
}
,
{ "Transmission Parameters, Dynamic", 127493, true, 8, 0,
{ { "Instance", 8, RES_LOOKUP, false, LOOKUP_ENGINE_INSTANCE, "" }
, { "Transmission Gear", 2, RES_LOOKUP, false, LOOKUP_GEAR_STATUS, "" }
, { "Reserved", 6, RES_BINARY, false, 0, "" }
, { "Oil pressure", BYTES(2), RES_PRESSURE, false, "hPa", "" }
, { "Oil temperature", BYTES(2), RES_TEMPERATURE_HIGH, false, "K", "" }
, { "Discrete Status 1", BYTES(1), RES_INTEGER, false, 0, "" }
, { "Reserved", BYTES(1), RES_BINARY, false, 0, "" }
, { 0 }
}
}
,
{ "Trip Parameters, Vessel", 127496, true, 10, 0,
{ { "Time to Empty", BYTES(4), 0.001, false, "s", "" }
, { "Distance to Empty", BYTES(4), 0.01, false, "m", "" }
, { "Estimated Fuel Remaining", BYTES(2), 1, false, "L", "" }
, { "Trip Run Time", BYTES(4), 0.001, false, "s", "" }
, { 0 }
}
}
,
{ "Trip Parameters, Engine", 127497, true, 9, 0,
{ { "Instance", BYTES(1), RES_LOOKUP, false, LOOKUP_ENGINE_INSTANCE, "" }
, { "Trip Fuel Used", BYTES(2), 1, false, "L", "" }
, { "Fuel Rate, Average", BYTES(2), 0.1, true, "L/h", "" }
, { "Fuel Rate, Economy", BYTES(2), 0.1, true, "L/h", "" }
, { "Instantaneous Fuel Economy", BYTES(2), 0.1, true, "L/h", "" }
, { 0 }
}
}
,
{ "Engine Parameters, Static", 127498, true, 8, 0,
{ { "Instance", BYTES(1), RES_LOOKUP, false, LOOKUP_ENGINE_INSTANCE, "" }
, { "Rated Engine Speed", BYTES(2), 1, false, 0, "" }
, { "VIN", BYTES(1), 1, false, 0, "" }
, { "Software ID", BYTES(2), 1, false, 0, "" }
, { 0 }
}
}
,
{ "Binary Switch Bank Status", 127501, false, 8, 1,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "Indicator1", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator2", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator3", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator4", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator5", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator6", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator7", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator8", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator9", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator10", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator11", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator12", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator13", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator14", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator15", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator16", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator17", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator18", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator19", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator20", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator21", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator22", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator23", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator24", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator25", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator26", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator27", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { "Indicator28", 2, RES_LOOKUP, false, ",0=Off,1=On,2=Failed", "" }
, { 0 }
}
}
,
{ "Switch Bank Control", 127502, false, 8, 1,
{ { "Switch Bank Instance", BYTES(1), 1, false, 0, "" }
, { "Switch", 2, RES_LOOKUP, false, ",0=Off,1=On", "" }
, { 0 }
}
}
/* http://www.nmea.org/Assets/nmea-2000-corrigendum-1-2010-1.pdf */
,
{ "AC Input Status", 127503, true, 8, 10,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "Number of Lines", BYTES(1), 1, false, 0, "" }
, { "Line", 2, RES_LOOKUP, false, ",0=Line 1,1=Line 2,2=Line 3,3=Reserved", "" }
, { "Acceptability", 2, RES_LOOKUP, false, ",0=Bad Level,1=Bad Frequency,2=Being Qualified,3=Good", "" }
, { "Reserved", 4, RES_BINARY, false, 0, "" }
, { "Voltage", BYTES(2), 0.01, false, "V", "" }
, { "Current", BYTES(2), 0.1, false, "A", "" }
, { "Frequency", BYTES(2), 0.01, false, "Hz", "" }
, { "Breaker Size", BYTES(2), 0.1, false, "A", "" }
, { "Real Power", BYTES(4), RES_INTEGER, false, "W", "" }
, { "Reactive Power", BYTES(4), RES_INTEGER, false, "VAR", "" }
, { "Power Factor", BYTES(1), 0.01, false, "Cos Phi", "" }
, { 0 }
}
}
/* http://www.nmea.org/Assets/nmea-2000-corrigendum-1-2010-1.pdf */
,
{ "AC Output Status", 127504, true, 8, 10,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "Number of Lines", BYTES(1), 1, false, 0, "" }
, { "Line", 2, RES_LOOKUP, false, ",0=Line 1,1=Line 2,2=Line 3", "" }
, { "Waveform", 3, RES_LOOKUP, false, ",0=Sine Wave,1=Modified Sine Wave,6=Error,7=Data Not Available", "" }
, { "Reserved", 3, RES_BINARY, false, 0, "" }
, { "Voltage", BYTES(2), 0.01, false, "V", "" }
, { "Current", BYTES(2), 0.1, false, "A", "" }
, { "Frequency", BYTES(2), 0.01, false, "Hz", "" }
, { "Breaker Size", BYTES(2), 0.1, false, "A", "" }
, { "Real Power", BYTES(4), RES_INTEGER, false, "W", "" }
, { "Reactive Power", BYTES(4), RES_INTEGER, false, "VAR", "" }
, { "Power Factor", BYTES(1), 0.01, false, "Cos Phi", "" }
, { 0 }
}
}
/* http://www.maretron.com/support/manuals/TLA100UM_1.2.pdf */
/* Observed from EP65R */
,
{ "Fluid Level", 127505, true, 7, 0,
{ { "Instance", 4, 1, false, 0, "" }
, { "Type", 4, RES_LOOKUP, false, ",0=Fuel,1=Water,2=Gray water,3=Live well,4=Oil,5=Black water", "" }
, { "Level", BYTES(2), RES_PERCENTAGE, false, "%", "" }
, { "Capacity", BYTES(4), 0.1, false, "L", "" }
, { 0 }
}
}
,
{ "DC Detailed Status", 127506, false, 9, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Instance", BYTES(1), 1, false, 0, "" }
, { "DC Type", BYTES(1), 1, false, 0, "" }
, { "State of Charge", BYTES(1), 1, false, 0, "" }
, { "State of Health", BYTES(1), 1, false, 0, "" }
, { "Time Remaining", BYTES(2), 1, false, 0, "" }
, { "Ripple Voltage", BYTES(2), 0.01, false, "V", "" }
, { 0 }
}
}
// http://www.osukl.com/wp-content/uploads/2015/04/3155-UM.pdf
,
{ "Charger Status", 127507, false, 8, 0,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "Battery Instance", BYTES(1), 1, false, 0, "" }
, { "Operating State", 4, RES_LOOKUP, false, ",0=Not charging,1=Bulk,2=Absorption,3=Overcharge,4=Equalise,5=Float,6=No Float,7=Constant VI,8=Disabled,9=Fault", "" }
, { "Charge Mode", 4, RES_LOOKUP, false, ",0=Standalone mode,1=Primary mode,2=Secondary mode,3=Echo mode", "" }
, { "Operating State", 2, RES_LOOKUP, false, ",0=Off,1=On", "" }
, { "Equalization Pending", 2, RES_LOOKUP, false, ",0=Off,1=On", "" }
, { "Reserved", 4, RES_BINARY, false, 0, "" }
, { "Equalization Time Remaining", BYTES(2), 1, false, 0, "" }
, { 0 }
}
}
,
{ "Battery Status", 127508, true, 8, 0,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "Voltage", BYTES(2), 0.01, true, "V", "" }
, { "Current", BYTES(2), 0.1, true, "A", "" }
, { "Temperature", BYTES(2), RES_TEMPERATURE, false, "K", "" }
, { "SID", BYTES(1), 1, false, 0, "" }
, { 0 }
}
}
,
{ "Inverter Status", 127509, false, 8, 0,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "AC Instance", BYTES(1), 1, false, 0, "" }
, { "DC Instance", BYTES(1), 1, false, 0, "" }
, { "Operating State", 4, RES_LOOKUP, false, ",0=Standby,1=On", "" }
, { "Inverter", 2, RES_LOOKUP, false, ",0=Standby,1=On", "" }
, { 0 }
}
}
,
{ "Charger Configuration Status", 127510, false, 8, 0,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "Battery Instance", BYTES(1), 1, false, 0, "" }
, { "Charger Enable/Disable", 2, 1, false, 0, "" }
, { "Reserved", 6, RES_BINARY, false, 0, "" }
, { "Charge Current Limit", BYTES(2), 0.1, false, "A", "" }
, { "Charging Algorithm", BYTES(1), 1, false, 0, "" }
, { "Charger Mode", BYTES(1), 1, false, 0, "" }
, { "Estimated Temperature", BYTES(2), RES_TEMPERATURE, false, 0, "When no sensor present" }
, { "Equalize One Time Enable/Disable", 4, 1, false, 0, "" }
, { "Over Charge Enable/Disable", 4, 1, false, 0, "" }
, { "Equalize Time", BYTES(2), 1, false, 0, "" }
, { 0 }
}
}
,
{ "Inverter Configuration Status", 127511, false, 8, 0,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "AC Instance", BYTES(1), 1, false, 0, "" }
, { "DC Instance", BYTES(1), 1, false, 0, "" }
, { "Inverter Enable/Disable", 2, 1, false, 0, "" }
, { "Inverter Mode", BYTES(1), 1, false, 0, "" }
, { "Load Sense Enable/Disable", BYTES(1), 1, false, 0, "" }
, { "Load Sense Power Threshold", BYTES(1), 1, false, 0, "" }
, { "Load Sense Interval", BYTES(1), 1, false, 0, "" }
, { 0 }
}
}
,
{ "AGS Configuration Status", 127512, false, 8, 0,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "Generator Instance", BYTES(1), 1, false, 0, "" }
, { "AGS Mode", BYTES(1), 1, false, 0, "" }
, { 0 }
}
}
,
{ "Battery Configuration Status", 127513, false, 8, 0,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "Battery Type", BYTES(1), 1, false, 0, "" }
, { "Supports Equalization", 2, 1, false, 0, "" }
, { "Reserved", 6, RES_BINARY, false, 0, "" }
, { "Nominal Voltage", BYTES(2), 0.01, false, "V", "" }
, { "Chemistry", BYTES(1), 1, false, 0, "" }
, { "Capacity", BYTES(2), 1, false, 0, "" }
, { "Temperature Coefficient", BYTES(2), 1, false, 0, "" }
, { "Peukert Exponent", BYTES(2), 1, false, 0, "" }
, { "Charge Efficiency Factor", BYTES(2), 1, false, 0, "" }
, { 0 }
}
}
,
{ "AGS Status", 127514, false, 8, 0,
{ { "Instance", BYTES(1), 1, false, 0, "" }
, { "Generator Instance", BYTES(1), 1, false, 0, "" }
, { "AGS Operating State", BYTES(1), 1, false, 0, "" }
, { "Generator State", BYTES(1), 1, false, 0, "" }
, { "Generator On Reason", BYTES(1), 1, false, 0, "" }
, { "Generator Off Reason", BYTES(1), 1, false, 0, "" }
, { 0 }
}
}
/* https://www.nmea.org/Assets/20170204%20nmea%202000%20leeway%20pgn%20final.pdf */
,
{ "Leeway Angle", 128000, true, 8, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Leeway Angle", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Reserved", BYTES(5), RES_BINARY, false, 0, "" }
, { 0 }
}
}
/* http://www.maretron.com/support/manuals/DST100UM_1.2.pdf */
,
{ "Speed", 128259, true, 6, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Speed Water Referenced", BYTES(2), 0.01, false, "m/s", "" }
, { "Speed Ground Referenced", BYTES(2), 0.01, false, "m/s", "" }
, { "Speed Water Referenced Type", BYTES(1), RES_LOOKUP, false, LOOKUP_WATER_REFERENCE, "" }
, { "Speed Direction", 4, 1, false, 0, "" }
, { 0 }
}
}
/* http://www.maretron.com/support/manuals/DST100UM_1.2.pdf */
,
{ "Water Depth", 128267, true, 5, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Depth", BYTES(4), 0.01, false, "m", "Depth below transducer" }
, { "Offset", BYTES(2), 0.001, true, "m", "Distance between transducer and surface (positive) or keel (negative)" }
, { "Range", BYTES(1), 10, false, "m", "Max measurement range" }
, { 0 }
}
}
/* http://www.nmea.org/Assets/nmea-2000-digital-interface-white-paper.pdf */
,
{ "Distance Log", 128275, true, 14, 0,
{ { "Date", BYTES(2), RES_DATE, false, "days", "Timestamp of last reset in Days since January 1, 1970" }
, { "Time", BYTES(4), RES_TIME, false, "s", "Timestamp of last reset Seconds since midnight" }
, { "Log", BYTES(4), 1, false, "m", "Total cumulative distance" }
, { "Trip Log", BYTES(4), 1, false, "m", "Distance since last reset" }
, { 0 }
}
}
,
{ "Tracked Target Data", 128520, true, 27, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Target ID #", BYTES(1), 1, false, 0, "Number of route, waypoint, event, mark, etc." }
, { "Track Status", 2, RES_LOOKUP, false, ",0=Cancelled,1=Acquiring,2=Tracking,3=Lost", "" }
, { "Reported Target", 1, RES_LOOKUP, false, LOOKUP_YES_NO, "" }
, { "Target Acquisition", 1, RES_LOOKUP, false, ",0=Manual,1=Automatic", "" }
, { "Bearing Reference", 2, RES_LOOKUP, false, LOOKUP_DIRECTION_REFERENCE, "" }
, { "Reserved", 2, RES_BINARY, false, 0, "" }
, { "Bearing", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Distance", BYTES(4), 0.001, false, "m", "" }
, { "Course", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Speed", BYTES(2), 0.01, false, "m/s", "" }
, { "CPA", BYTES(4), 0.01, false, "m", "" }
, { "TCPA", BYTES(4), 0.001, false, "s", "negative = time elapsed since event, positive = time to go" }
, { "UTC of Fix", BYTES(4), RES_TIME, false, "s", "Seconds since midnight" }
, { "Name", BYTES(255), RES_ASCII, false, 0, "" }
, { 0 }
}
}
,
{ "Position, Rapid Update", 129025, true, 8, 0,
{ { "Latitude", BYTES(4), RES_LATITUDE, true, "deg", "" }
, { "Longitude", BYTES(4), RES_LONGITUDE, true, "deg", "" }
, { 0 }
}
}
/* http://www.maretron.com/support/manuals/GPS100UM_1.2.pdf */
,
{ "COG & SOG, Rapid Update", 129026, true, 8, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "COG Reference", 2, RES_LOOKUP, false, LOOKUP_DIRECTION_REFERENCE, "" }
, { "Reserved", 6, RES_BINARY, false, 0, "Reserved" }
, { "COG", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "SOG", BYTES(2), 0.01, false, "m/s", "" }
, { "Reserved", BYTES(2), RES_BINARY, false, 0, "Reserved" }
, { 0 }
}
}
,
{ "Position Delta, Rapid Update", 129027, false, 8, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Time Delta", BYTES(2), 1, false, 0, "" }
, { "Latitude Delta", BYTES(2), 1, true, 0, "" }
, { "Longitude Delta", BYTES(2), 1, true, 0, "" }
, { 0 }
}
}
,
{ "Altitude Delta, Rapid Update", 129028, false, 8, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Time Delta", BYTES(2), 1, true, 0, "" }
, { "GNSS Quality", 2, 1, false, 0, "" }
, { "Direction", 2, 1, false, 0, "" }
, { "Reserved", 4, RES_BINARY, false, 0, "Reserved" }
, { "Course Over Ground", BYTES(4), RES_RADIANS, false, "rad", "" }
, { "Altitude Delta", BYTES(2), 1, true, 0, "" }
, { 0 }
}
}
/* http://www.maretron.com/support/manuals/GPS100UM_1.2.pdf */
,
{ "GNSS Position Data", 129029, true, 51, 3,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Date", BYTES(2), RES_DATE, false, "days", "Days since January 1, 1970" }
, { "Time", BYTES(4), RES_TIME, false, "s", "Seconds since midnight" }
, { "Latitude", BYTES(8), RES_LATITUDE, true, "deg", "" }
, { "Longitude", BYTES(8), RES_LONGITUDE, true, "deg", "" }
, { "Altitude", BYTES(8), 1e-6, true, "m", "Altitude referenced to WGS-84" }
, { "GNSS type", 4, RES_LOOKUP, false, LOOKUP_GNS, "" }
, { "Method", 4, RES_LOOKUP, false, LOOKUP_GNS_METHOD, "" }
, { "Integrity", 2, RES_LOOKUP, false, LOOKUP_GNS_INTEGRITY, "" }
, { "Reserved", 6, RES_BINARY, false, 0, "Reserved" }
, { "Number of SVs", BYTES(1), 1, false, 0, "Number of satellites used in solution" }
, { "HDOP", BYTES(2), 0.01, true, 0, "Horizontal dilution of precision" }
, { "PDOP", BYTES(2), 0.01, true, 0, "Probable dilution of precision" }
, { "Geoidal Separation", BYTES(4), 0.01, true, "m", "Geoidal Separation" }
, { "Reference Stations", BYTES(1), 1, false, 0, "Number of reference stations" }
, { "Reference Station Type", 4, RES_LOOKUP, false, LOOKUP_GNS, "" }
, { "Reference Station ID", 12, 1, false, "" }
, { "Age of DGNSS Corrections", BYTES(2), 0.01, false, "s", "" }
, { 0 }
}
}
,
{ "Time & Date", 129033, true, 8, 0,
{ { "Date", BYTES(2), RES_DATE, false, "days", "Days since January 1, 1970" }
, { "Time", BYTES(4), RES_TIME, false, "s", "Seconds since midnight" }
, { "Local Offset", BYTES(2), RES_INTEGER, true, "minutes", "Minutes" }
, { 0 }
}
}
,
{ "AIS Class A Position Report", 129038, true, 27, 0,
{ { "Message ID", 6, 1, false, 0, "" }
, { "Repeat Indicator", 2, RES_LOOKUP, false, LOOKUP_REPEAT_INDICATOR, "" }
, { "User ID", BYTES(4), RES_INTEGER, false, "MMSI", "" }
, { "Longitude", BYTES(4), RES_LATITUDE, true, "deg", "" }
, { "Latitude", BYTES(4), RES_LONGITUDE, true, "deg", "" }
, { "Position Accuracy", 1, RES_LOOKUP, false, LOOKUP_POSITION_ACCURACY, "" }
, { "RAIM", 1, RES_LOOKUP, false, LOOKUP_RAIM_FLAG, "" }
, { "Time Stamp", 6, RES_LOOKUP, false, LOOKUP_TIME_STAMP, "0-59 = UTC second when the report was generated" }
, { "COG", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "SOG", BYTES(2), 0.01, false, "m/s", "" }
, { "Communication State", 19, RES_BINARY, false, 0, "Information used by the TDMA slot allocation algorithm and synchronization information" }
, { "AIS Transceiver information", 5, RES_LOOKUP, false, LOOKUP_AIS_TRANSCEIVER, "" }
, { "Heading", BYTES(2), RES_RADIANS, false, "rad", "True heading" }
, { "Rate of Turn", BYTES(2), RES_ROTATION, true, "rad/s", "" }
, { "Nav Status", 4, RES_LOOKUP, false, LOOKUP_NAV_STATUS, "" }
, { "Reserved", 4, RES_BINARY, false, 0, "reserved" }
, { "Regional Application", 1, 1, false, 0, "" }
, { "Reserved", 7, RES_BINARY, false, 0, "reserved" }
, { 0 }
}
}
,
{ "AIS Class B Position Report", 129039, true, 0x1a, 0,
{ { "Message ID", 6, 1, false, 0, "" }
, { "Repeat Indicator", 2, RES_LOOKUP, false, LOOKUP_REPEAT_INDICATOR, "" }
, { "User ID", BYTES(4), RES_INTEGER, false, "MMSI", "" }
, { "Longitude", BYTES(4), RES_LATITUDE, true, "deg", "" }
, { "Latitude", BYTES(4), RES_LONGITUDE, true, "deg", "" }
, { "Position Accuracy", 1, RES_LOOKUP, false, LOOKUP_POSITION_ACCURACY, "" }
, { "RAIM", 1, RES_LOOKUP, false, LOOKUP_RAIM_FLAG, "" }
, { "Time Stamp", 6, RES_LOOKUP, false, LOOKUP_TIME_STAMP, "0-59 = UTC second when the report was generated" }
, { "COG", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "SOG", BYTES(2), 0.01, false, "m/s", "" }
, { "Communication State", 19, RES_BINARY, false, 0, "Information used by the TDMA slot allocation algorithm and synchronization information" }
, { "AIS Transceiver information", 5, RES_LOOKUP, false, LOOKUP_AIS_TRANSCEIVER, "" }
, { "Heading", BYTES(2), RES_RADIANS, false, "rad", "True heading" }
, { "Regional Application", BYTES(1), 1, false, 0, "" }
, { "Regional Application", 2, 1, false, 0, "" }
, { "Unit type", 1, RES_LOOKUP, false, ",0=SOTDMA,1=CS", "" }
, { "Integrated Display", 1, RES_LOOKUP, false, LOOKUP_YES_NO, "Whether the unit can show messages 12 and 14" }
, { "DSC", 1, RES_LOOKUP, false, LOOKUP_YES_NO, "" }
, { "Band", 1, RES_LOOKUP, false, ",0=top 525 kHz of marine band,1=entire marine band", "" }
, { "Can handle Msg 22", 1, RES_LOOKUP, false, LOOKUP_YES_NO, "Whether device supports message 22" }
, { "AIS mode", 1, RES_LOOKUP, false, ",0=Autonomous,1=Assigned", "" }
, { "AIS communication state", 1, RES_LOOKUP, false, ",0=SOTDMA,1=ITDMA", "" }
, { 0 }
}
}
,
{ "AIS Class B Extended Position Report", 129040, true, 33, 0,
{ { "Message ID", 6, 1, false, 0, "" }
, { "Repeat Indicator", 2, RES_LOOKUP, false, LOOKUP_REPEAT_INDICATOR, "" }
, { "User ID", BYTES(4), RES_INTEGER, false, "MMSI", "" }
, { "Longitude", BYTES(4), RES_LATITUDE, true, "deg", "" }
, { "Latitude", BYTES(4), RES_LONGITUDE, true, "deg", "" }
, { "Position Accuracy", 1, RES_LOOKUP, false, LOOKUP_POSITION_ACCURACY, "" }
, { "AIS RAIM flag", 1, RES_LOOKUP, false, LOOKUP_RAIM_FLAG, "" }
, { "Time Stamp", 6, RES_LOOKUP, false, LOOKUP_TIME_STAMP, "0-59 = UTC second when the report was generated" }
, { "COG", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "SOG", BYTES(2), 0.01, false, "m/s", "" }
, { "Regional Application", BYTES(1), 1, false, 0, "" }
, { "Regional Application", 4, 1, false, 0, "" }
, { "Reserved", 4, RES_BINARY, false, 0, "reserved" }
, { "Type of ship", BYTES(1), RES_LOOKUP, false, LOOKUP_SHIP_TYPE, "" }
, { "True Heading", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Reserved", 4, RES_BINARY, false, 0, "" }
, { "GNSS type", 4, RES_LOOKUP, false, LOOKUP_GNS_AIS, "" }
, { "Length", BYTES(2), 0.1, false, "m", "" }
, { "Beam", BYTES(2), 0.1, false, "m", "" }
, { "Position reference from Starboard", BYTES(2), 0.1, false, "m", "" }
, { "Position reference from Bow", BYTES(2), 0.1, false, "m", "" }
, { "Name", BYTES(20), RES_ASCII, false, 0, ",0=unavailable" }
, { "DTE", 1, RES_LOOKUP, false, ",0=Available,1=Not available", "" }
, { "AIS mode", 1, 1, false, ",0=Autonomous,1=Assigned", "" }
, { "Reserved", 4, RES_BINARY, false, 0, "" }
, { "AIS Transceiver information", 5, RES_LOOKUP, false, LOOKUP_AIS_TRANSCEIVER, "" }
, { 0 }
}
}
,
{ "AIS Aids to Navigation (AtoN) Report", 129041, true, 60, 0,
{ { "Message ID", 6, 1, false, 0, "" }
, { "Repeat Indicator", 2, RES_LOOKUP, false, LOOKUP_REPEAT_INDICATOR, "" }
, { "User ID", BYTES(4), RES_INTEGER, false, "MMSI", "" }
, { "Longitude", BYTES(4), RES_LATITUDE, true, "deg", "" }
, { "Latitude", BYTES(4), RES_LONGITUDE, true, "deg", "" }
, { "Position Accuracy", 1, RES_LOOKUP, false, LOOKUP_POSITION_ACCURACY, "" }
, { "AIS RAIM Flag", 1, RES_LOOKUP, false, LOOKUP_RAIM_FLAG, "" }
, { "Time Stamp", 6, RES_LOOKUP, false, LOOKUP_TIME_STAMP, "0-59 = UTC second when the report was generated" }
, { "Length/Diameter", BYTES(2), 0.1, false, "m", "" }
, { "Beam/Diameter", BYTES(2), 0.1, false, "m", "" }
, { "Position Reference from Starboard Edge", BYTES(2), 0.1, false, "m", "" }
, { "Position Reference from True North Facing Edge", BYTES(2), 0.1, false, "m", "" }
, { "AtoN Type", 5, RES_LOOKUP, false, LOOKUP_ATON_TYPE, "" }
, { "Off Position Indicator", 1, RES_LOOKUP, false, LOOKUP_YES_NO, "" }
, { "Virtual AtoN Flag", 1, RES_LOOKUP, false, LOOKUP_YES_NO, "" }
, { "Assigned Mode Flag", 1, RES_LOOKUP, false, LOOKUP_AIS_ASSIGNED_MODE, "" }
, { "AIS Spare", 1, RES_BINARY, false, 0, "" }
, { "Position Fixing Device Type", 4, RES_LOOKUP, false, LOOKUP_POSITION_FIX_DEVICE, "" }
, { "Reserved", 3, RES_BINARY, false, 0, "" }
, { "AtoN Status", 8, RES_BINARY, false, 0, "00000000 = default" }
, { "AIS Transceiver information", 5, RES_LOOKUP, false, LOOKUP_AIS_TRANSCEIVER, "" }
, { "Reserved", 3, RES_BINARY, false, 0, "" }
, { "AtoN Name", BYTES(34), RES_STRINGLAU, false, 0, "" }
, { 0 }
}
}
,
{ "Datum", 129044, true, 24, 0,
{ { "Local Datum", BYTES(4), RES_ASCII, false, 0, "defined in IHO Publication S-60, Appendices B and C."
" First three chars are datum ID as per IHO tables."
" Fourth char is local datum subdivision code." }
, { "Delta Latitude", BYTES(4), RES_LATITUDE, true, "deg", "" }
, { "Delta Longitude", BYTES(4), RES_LONGITUDE, true, "deg", "" }
, { "Delta Altitude", BYTES(4), 1e-6, true, "m", "" }
, { "Reference Datum", BYTES(4), RES_ASCII, false, 0, "defined in IHO Publication S-60, Appendices B and C."
" First three chars are datum ID as per IHO tables."
" Fourth char is local datum subdivision code." }
, { 0 }
}
}
,
{ "User Datum", 129045, true, 37, 0,
{ { "Delta X", BYTES(4), 0.01, true, "m", "Delta shift in X axis from WGS 84" }
, { "Delta Y", BYTES(4), 0.01, true, "m", "Delta shift in Y axis from WGS 84" }
, { "Delta Z", BYTES(4), 0.01, true, "m", "Delta shift in Z axis from WGS 84" }
, { "Rotation in X", BYTES(4), RES_FLOAT, true, 0, "Rotational shift in X axis from WGS 84. Rotations presented use the geodetic sign convention. When looking along the positive axis towards the origin, counter-clockwise rotations are positive." }
, { "Rotation in Y", BYTES(4), RES_FLOAT, true, 0, "Rotational shift in Y axis from WGS 84. Rotations presented use the geodetic sign convention. When looking along the positive axis towards the origin, counter-clockwise rotations are positive." }
, { "Rotation in Z", BYTES(4), RES_FLOAT, true, 0, "Rotational shift in Z axis from WGS 84. Rotations presented use the geodetic sign convention. When looking along the positive axis towards the origin, counter-clockwise rotations are positive." }
, { "Scale", BYTES(4), RES_FLOAT, true, "ppm", "Scale factor expressed in parts-per-million" }
, { "Ellipsoid Semi-major Axis", BYTES(4), 0.01, true, "m", "Semi-major axis (a) of the User Datum ellipsoid" }
, { "Ellipsoid Flattening Inverse", BYTES(4), RES_FLOAT, true, 0, "Flattening (1/f) of the User Datum ellipsoid" }
, { "Datum Name", BYTES(4), RES_ASCII, false, 0, "4 character code from IHO Publication S-60,Appendices B and C."
" First three chars are datum ID as per IHO tables."
" Fourth char is local datum subdivision code." }
, { 0 }
}
}
,
{ "Cross Track Error", 129283, false, 6, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "XTE mode", 4, RES_LOOKUP, false, LOOKUP_RESIDUAL_MODE, "" }
, { "Reserved", 2, RES_BINARY, false, 0, "reserved" }
, { "Navigation Terminated", 2, RES_LOOKUP, false, LOOKUP_YES_NO, "" }
, { "XTE", BYTES(4), 0.01, true, "m", "" }
, { 0 }
}
}
,
{ "Navigation Data", 129284, true, 0x22, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Distance to Waypoint", BYTES(4), 0.01, false, "m", "" }
, { "Course/Bearing reference", 2, RES_LOOKUP, false, LOOKUP_DIRECTION_REFERENCE, "" }
, { "Perpendicular Crossed", 2, RES_LOOKUP, false, LOOKUP_YES_NO, "" }
, { "Arrival Circle Entered", 2, RES_LOOKUP, false, LOOKUP_YES_NO, "" }
, { "Calculation Type", 2, RES_LOOKUP, false, ",0=Great Circle,1=Rhumb Line", "" }
, { "ETA Time", BYTES(4), RES_TIME, false, "s", "Seconds since midnight" }
, { "ETA Date", BYTES(2), RES_DATE, false, "days", "Days since January 1, 1970" }
, { "Bearing, Origin to Destination Waypoint", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Bearing, Position to Destination Waypoint", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Origin Waypoint Number", BYTES(4), 1, false, 0, "" }
, { "Destination Waypoint Number", BYTES(4), 1, false, 0, "" }
, { "Destination Latitude", BYTES(4), RES_LATITUDE, true, "deg", "" }
, { "Destination Longitude", BYTES(4), RES_LONGITUDE, true, "deg", "" }
, { "Waypoint Closing Velocity", BYTES(2), 0.01, true, "m/s", "" }
, { 0 }
}
}
,
{ "Navigation - Route/WP Information", 129285, true, 8, 4,
{ { "Start RPS#", BYTES(2), 1, false, 0, "" }
, { "nItems", BYTES(2), 1, false, 0, "" }
, { "Database ID", BYTES(2), 1, false, 0, "" }
, { "Route ID", BYTES(2), 1, false, 0, "" }
, { "Navigation direction in route", 2, 1, false, 0, "" }
, { "Supplementary Route/WP data available", 2, 1, false, 0, "" }
, { "Reserved", 4, RES_BINARY, false, 0, "Reserved" }
, { "Route Name", BYTES(255), RES_STRING, false, 0, "" }
, { "Reserved", BYTES(1), RES_BINARY, false, 0, "Reserved" }
, { "WP ID", BYTES(2), 1, false, 0, "" }
, { "WP Name", BYTES(255), RES_STRING, false, 0, "" }
, { "WP Latitude", BYTES(4), RES_LATITUDE, true, "deg", "" }
, { "WP Longitude", BYTES(4), RES_LONGITUDE, true, "deg", "" }
, { 0 }
}
}
,
{ "Set & Drift, Rapid Update", 129291, true, 8, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Set Reference", 2, RES_LOOKUP, false, LOOKUP_DIRECTION_REFERENCE, "" }
, { "Reserved", 6, RES_BINARY, false, 0, "Reserved" }
, { "Set", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Drift", BYTES(2), 0.01, false, "m/s", "" }
, { 0 }
}
}
,
{ "Navigation - Route / Time to+from Mark", 129301, true, 10, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Time to mark", BYTES(4), 0.001, true, "s", "negative = elapsed since event, positive = time to go" }
, { "Mark Type", 4, RES_LOOKUP, false, ",0=Collision,1=Turning point,2=Reference,3=Wheelover,4=Waypoint", "" }
, { "Reserved", 4, RES_BINARY, false, 0, "Reserved" }
, { "Mark ID", BYTES(4), 1, false, 0, "" }
, { 0 }
}
}
,
{ "Bearing and Distance between two Marks", 129302, false, 8, 0,
{ { "SID", BYTES(1), 1, false, 0, "" }
, { "Bearing Reference", 4, RES_LOOKUP, false, 0, "" }
, { "Calculation Type", 2, RES_LOOKUP, false, 0, "" }
, { "Reserved", 2, RES_BINARY, false, 0, "Reserved" }
, { "Bearing, Origin to Destination", BYTES(2), RES_RADIANS, false, "rad", "" }
, { "Distance", BYTES(4), 0.01, false, "m", "" }
, { "Origin Mark Type", 4, RES_LOOKUP, false, 0, "" }
, { "Destination Mark Type", 4, RES_LOOKUP, false, 0, "" }
, { "Origin Mark ID", BYTES(4), 1, false, 0, "" }
, { "Destination Mark ID", BYTES(4), 1, false, 0, "" }
, { 0 }
}
}
/* http://www.maretron.com/support/manuals/GPS100UM_1.2.pdf */
/* Haven't seen this yet (no way to send PGN 059904 yet) so lengths unknown */
,
{ "GNSS Control Status", 129538, false, 0, 0,
{ { "SV Elevation Mask", BYTES(2), 1, false, 0, "Will not use SV below this elevation" }
, { "PDOP Mask", BYTES(2), 0.01, false, 0, "Will not report position above this PDOP" }
, { "PDOP Switch", BYTES(2), 0.01, false, 0, "Will report 2D position above this PDOP" }
, { "SNR Mask", BYTES(2), 0.01, false, 0, "Will not use SV below this SNR" }
, { "GNSS Mode (desired)", 3, RES_LOOKUP, false, ",0=1D,1=2D,2=3D,3=Auto,4=Reserved,5=Reserved,6=Error", "" }
, { "DGNSS Mode (desired)", 3, RES_LOOKUP, false, ",0=no SBAS,1=SBAS,3=SBAS", "" }
, { "Position/Velocity Filter", 2, 1, false, 0, "" }
, { "Max Correction Age", BYTES(2), 1, false, 0, "" }
, { "Antenna Altitude for 2D Mode", BYTES(2), 0.01, false, "m", "" }
, { "Use Antenna Altitude for 2D Mode", 2, RES_LOOKUP, false, ",0=use last 3D height,1=Use antenna altitude", "" }