GT06 GPS Tracker Communication Protocol v1.8.1
GT06 GPS Tracker Communication Protocol v1.8.1
December 6, 1999
Notice:
GARMIN Corporation makes no warranties, express or implied, to companies or individuals accessing GARMIN
Corporation’s GPS Interface, or any other person, with respect to the GPS Interface, including without limitation,
any warranties of merchantability or fitness for a particular purpose, or arising from course of performance or trade
usage, all of which are hereby excluded and disclaimed by GARMIN Corporation.
GARMIN Corporation shall not be liable for any indirect, incidental, consequential, punitive or special damages,
even if GARMIN Corporation has been advised of the possibility of such damages. Some states may not allow the
exclusion on limitation of liability from consequential or incidental damages, so the foregoing limitation on liability
for damages may not apply to you.
WARNING:
All companies and individuals accessing the GPS Interface are advised to ensure the correctness of their GPS
Interface software and to avoid the use of undocumented GPS Interface features, particularly with respect to packet
ID, command ID, and packet data content. Any software implementation errors or use of undocumented features,
whether intentional or not, may result in damage to and/or unsafe operation of the GPS.
GARMIN Corporation cannot provide technical support for questions relating to the GPS Interface. However, if you
would like to comment on this document, or if you would like to report a document error, you may send email to
[email protected], or write to the address shown below.
GARMIN Corporation
1200 E. 151st St.
Olathe, Kansas USA 66062
(913) 397-8200
1. Introduction ................................................................................................................................................. 5
1.1. Overview ................................................................................................................................................ 5
1.2. Definition of Terms................................................................................................................................. 5
1.3. Specification of Data Types..................................................................................................................... 5
2. Protocol Layers............................................................................................................................................ 6
3. Physical Protocols........................................................................................................................................ 7
3.1. P000 – Default Physical Protocol ............................................................................................................ 7
6. Application Protocols................................................................................................................................. 14
6.1. A000 – Product Data Protocol ............................................................................................................... 14
6.1.1. Product_Data_Type ....................................................................................................................... 14
6.2. A001 – Protocol Capability Protocol ..................................................................................................... 15
6.2.1. Protocol_Array_Type .................................................................................................................... 15
6.2.2. Protocol_Data_Type...................................................................................................................... 15
6.2.3. Tag Values for Protocol_Data_Type .............................................................................................. 15
6.2.4. Protocol Capabilities Example ....................................................................................................... 16
6.3. Device Command Protocols .................................................................................................................. 17
6.3.1. A010 – Device Command Protocol 1 ............................................................................................. 17
6.3.2. A011 – Device Command Protocol 2 ............................................................................................. 17
6.4. A100 – Waypoint Transfer Protocol ...................................................................................................... 19
6.5. Route Transfer Protocol ........................................................................................................................ 20
6.5.1. Database Matching for Route Waypoints ....................................................................................... 20
6.5.2. A200 – Route Transfer Protocol..................................................................................................... 20
6.5.3. A201 – Route Transfer Protocol..................................................................................................... 21
6.6. Track Log Transfer Protocol.................................................................................................................. 22
6.6.1. Time Values Ignored by GPS......................................................................................................... 22
6.6.2. A300 – Track Log Transfer Protocol.............................................................................................. 22
6.6.3. A301 – Track Log Transfer Protocol.............................................................................................. 23
6.7. A400 – Proximity Waypoint Transfer Protocol ...................................................................................... 24
6.8. A500 – Almanac Transfer Protocol........................................................................................................ 25
6.9. A600 – Date and Time Initialization Protocol ........................................................................................ 26
6.10. A700 – Position Initialization Protocol .................................................................................................. 27
7. Data Types................................................................................................................................................. 29
7.1. Serialization of Data ............................................................................................................................. 29
7.2. Character Sets....................................................................................................................................... 29
7.3. Basic C Data Types............................................................................................................................... 29
7.3.1. char............................................................................................................................................... 29
7.3.2. int ................................................................................................................................................. 29
7.3.3. long............................................................................................................................................... 30
7.3.4. float .............................................................................................................................................. 30
7.3.5. double ........................................................................................................................................... 30
7.4. Basic GARMIN Data Types .................................................................................................................. 30
7.4.1. Character Arrays ........................................................................................................................... 30
7.4.2. Variable-Length Strings................................................................................................................. 30
7.4.3. byte ............................................................................................................................................... 31
7.4.4. word.............................................................................................................................................. 31
7.4.5. longword....................................................................................................................................... 31
7.4.6. boolean ......................................................................................................................................... 31
7.4.7. Semicircle_Type............................................................................................................................ 31
7.4.8. Radian_Type ................................................................................................................................. 31
7.4.9. Symbol_Type ................................................................................................................................ 32
7.5. Product-Specific Data Types ................................................................................................................. 35
7.5.1. D100_Wpt_Type........................................................................................................................... 35
7.5.2. D101_Wpt_Type........................................................................................................................... 35
7.5.3. D102_Wpt_Type........................................................................................................................... 36
7.5.4. D103_Wpt_Type........................................................................................................................... 36
7.5.5. D104_Wpt_Type........................................................................................................................... 36
7.5.6. D105_Wpt_Type........................................................................................................................... 37
7.5.7. D106_Wpt_Type........................................................................................................................... 37
7.5.8. D107_Wpt_Type........................................................................................................................... 38
7.5.9. D108_Wpt_Type ........................................................................................................................... 38
7.5.10. D150_Wpt_Type........................................................................................................................... 40
7.5.11. D151_Wpt_Type........................................................................................................................... 40
7.5.12. D152_Wpt_Type........................................................................................................................... 41
7.5.13. D154_Wpt_Type........................................................................................................................... 42
7.5.14. D155_Wpt_Type........................................................................................................................... 43
7.5.15. D200_Rte_Hdr_Type .................................................................................................................... 44
7.5.16. D201_Rte_Hdr_Type .................................................................................................................... 44
7.5.17. D202_Rte_Hdr_Type .................................................................................................................... 44
7.5.18. D210_Rte_Link_Type ................................................................................................................... 44
7.5.19. D300_Trk_Point_Type .................................................................................................................. 45
7.5.20. D301_Trk_Point_Type .................................................................................................................. 45
7.5.21. D310_Trk_Hdr_Type .................................................................................................................... 45
7.5.22. D400_Prx_Wpt_Type.................................................................................................................... 45
7.5.23. D403_Prx_Wpt_Type.................................................................................................................... 46
7.5.24. D450_Prx_Wpt_Type.................................................................................................................... 46
7.5.25. D500_Almanac_Type.................................................................................................................... 46
7.5.26. D501_Almanac_Type.................................................................................................................... 46
7.5.27. D550_Almanac_Type.................................................................................................................... 47
7.5.28. D551_Almanac_Type.................................................................................................................... 47
7.5.29. D600_Date_Time_Type ................................................................................................................ 48
7.5.30. D700_Position_Type ..................................................................................................................... 48
7.5.31. D800_Pvt_Data_Type ................................................................................................................... 48
1.1. Overview
This document describes the GARMIN GPS Interface, which is used to communicate with a GARMIN GPS
product. The GPS Interface supports bi-directional transfer of data such as waypoints, routes, track logs, proximity
waypoints, and satellite almanac. In the sections below, detailed descriptions of the interface protocols and data
types are given, and differences among GARMIN GPS products are identified.
Protocol Layer
Application (highest)
Link
Physical (lowest)
The Physical layer is based on RS-232. The Link layer uses packets with minimal overhead. At the Application
layer, there are several protocols used to implement data transfers between a Host and a GPS. These protocols are
described in more detail later in this document.
The other electrical characteristics are full duplex, serial data, 9600 baud, 8 data bits, no parity bits, and 1 stop bit.
Provisions are made to support other Physical protocols (primarily higher baud rates), but each GPS product will
always operate with the default Physical protocol after power up.
The mechanical characteristics vary among GARMIN products; most products have custom-designed interface
connectors in order to meet GARMIN packaging requirements. The electrical and mechanical connections to
standard DB-9 or DB-25 connectors can be accomplished with special cables that are available from GARMIN.
The ACK packet has a Packet ID equal to 6 decimal (the ASCII ACK character), while the NAK packet has a
Packet ID equal to 21 decimal (the ASCII NAK character). Both ACK and NAK packets contain a 8-bit integer in
their packet data to indicate the Packet ID of the acknowledged packet. Note: some GPS units will report a Packet
Data Size of two bytes for ACK and NAK packets; however, only the first byte should be considered.
Some GPS products may send NAK packets during communication timeout conditions. For example, when the GPS
is waiting for a packet in the middle of a protocol sequence, it will periodically send NAK packets (typically every
2-5 seconds) if no data is received from the Host. The purpose of this NAK Packet is to guard against a deadlock
condition in which the Host is waiting for an ACK or NAK in response to a data packet that was never received by
the GPS (perhaps due to cable disconnection during the middle of a protocol sequence). Not all GPS products
provide NAKs during timeout conditions, so the Host should not rely on this behavior. It is recommended that the
Host implement its own timeout and retransmission strategy to guard against deadlock. For example, if the Host
does not receive an ACK within a reasonable amount of time, it could warn the user and give the option of aborting
or re-initiating the transfer.
enum
{
Pid_Ack_Byte = 6,
Pid_Nak_Byte = 21,
Pid_Protocol_Array = 253, /* may not be implemented in all products */
Pid_Product_Rqst = 254,
Pid_Product_Data = 255
};
Additional Packet IDs are defined by other Link protocols (see below); however, the values of ASCII DLE (16
decimal) and ASCII ETX (3 decimal) are reserved and will never be used as Packet IDs in any Link protocol. This
allows more efficient detection of packet boundaries in the link-layer software implementation.
enum
{
Pid_Almanac_Data = 4,
Pid_Command_Data = 11,
Pid_Xfer_Cmplt = 12,
Pid_Date_Time_Data = 20,
Pid_Position_Data = 24,
Pid_Records = 35,
Pid_Rte_Hdr = 37,
Pid_Rte_Wpt_Data = 39,
Pid_Wpt_Data = 43
};
In this example, there are five packets exchanged: three from Device1 to Device2 and two in the other direction.
Each of these five packets must be acknowledged, but the acknowledgement packets are omitted from the table for
clarity. Most of the protocols are symmetric, meaning that the protocol for transfers in one direction (e.g., GPS to
Host) is the same as the protocol for transfers in the other direction (e.g., Host to GPS). For symmetric protocols,
either the GPS or the Host may assume the role of Device1 or Device2. For non-symmetric protocols, the sequence
table will explicitly show the roles of the GPS and Host instead of showing Device1 and Device2.
The first column of the table shows the packet number (used only for reference; this number is not encoded into the
packet). The second column shows the direction of each packet transfer. The third column shows the Packet ID
enumeration name (to determine the actual value for a Packet ID, see Section 4, Link Protocols, on page 8). The last
column shows the Packet Data Type.
These product-specific data types must be determined dynamically by the Host depending on which type of GPS is
currently connected. For older products, this determination is made through the use of a lookup table within the Host
(see Section 8.2, GPS Product Protocol Capabilities, on page 51), however, newer GPS products are able to
dynamically report their protocols and data types (see Section 6.2, A001 – Protocol Capability Protocol, on page
15).
The first packet (Packet 0) provides Device2 with an indication of the number of data packets to follow, excluding
the Pid_Xfer_Cmplt packet (i.e., Packet 1 through n-2). This allows Device2 to monitor the progress of the transfer.
The last packet (Packet n-1) indicates that the transfer is complete. This last packet also contains data to indicate
which kind of transfer has been completed in the Command_Id_Type data type (see Section 6.3, Device Command
Protocols, on page 17).
The Command_Id_Type value for each kind of transfer matches the command ID used to initiate that kind of
transfer (see Section 6.3, Device Command Protocols, on page 17). As a result, the actual Command_Id_Type value
depends on which Device Command protocol is implemented by the GPS. Because of this dependency, enumeration
names (not values) for Command_Id_Type are given in the description of each Application protocol later in this
document.
5.3.1. Records_Type
The Records_Type contains a 16-bit integer that indicates the number of data packets to follow, excluding the
Pid_Xfer_Cmplt packet. The type definition for the Records_Type is shown below:
The packet sequence for the Product Data Protocol is shown below:
Packet 0 (Pid_Product_Rqst) is a special product request packet that is sent to the GPS. Packet 1
(Pid_Product_Data) is returned to the Host and contains data to identify the GPS, which is provided in the data type
Product_Data_Type.
6.1.1. Product_Data_Type
The Product_Data_Type contains two 16-bit integers followed by one or more null-terminated strings. The first
integer indicates the Product ID, and the second integer indicates the software version number multiplied by 100
(e.g., version 3.11 will be indicated by 311 decimal). Following these integers, there will be one or more null-
terminated strings. The first string provides a textual description of the GPS product and its software version; this
string is intended to be displayed by the Host to the user in an “about” dialog box. The Host should ignore all
subsequent strings; they are used during manufacturing to identify other properties of the product and are not
formatted for display to the end user.
typedef struct
{
int product_ID;
int software_version;
/* char product_description[]; null-terminated string */
/* ... zero or more additional null-terminated strings */
} Product_Data_Type;
The packet sequence for the Protocol Capability Protocol is shown below:
Packet 0 (Pid_Protocol_Array) contains an array of Protocol_Data_Type structures, each of which contains tag-
encoded protocol information.
The order of array elements is used to associate data types with protocols. For example, a protocol that requires two
data types <D0> and <D1> is indicated by a tag-encoded protocol ID followed by two tag-encoded data type IDs,
where the first data type ID identifies <D0> and the second data type ID identifies <D1>.
6.2.1. Protocol_Array_Type
The Protocol_Array_Type is an array of Protocol_Data_Type structures. The number of Protocol_Data_Type
structures contained in the array is determined by observing the size of the received packet data.
6.2.2. Protocol_Data_Type
The Protocol_Data_Type is comprised of a one-byte tag field and a two-byte data field. The tag identifies which
kind of ID is contained in the data field, and the data field contains the actual ID.
typedef struct
{
byte tag;
word data;
} Protocol_Data_Type;
The combination of tag value and data value must correspond to one of the protocols or data types specified in this
document. For example, this document specifies a Waypoint Transfer Protocol identified as “A100.” This protocol
is represented by a tag value of ‘A’and a data field value of 100.
The GPS omits the following protocols from the above transmission:
A000 is omitted because all products support it. A001 is omitted because it is the very protocol being used to
communicate the protocol information.
Note that either the Host or GPS is allowed to initiate a transfer without a command from the other device (for
example, when the Host transfers data to the GPS, or when the user presses buttons on the GPS to initiate a transfer).
The packet sequence for each Device Command protocol is shown below:
Packet 0 (Pid_Command_Data) contains data to indicate a command, which is provided in the data type
Command_Id_Type. The Command_Id_Type contains a 16-bit integer that indicates a particular command. The
type definition for Command_Id_Type is shown below:
enum
{
Cmnd_Abort_Transfer = 0, /* abort current transfer */
Cmnd_Transfer_Alm = 1, /* transfer almanac */
Cmnd_Transfer_Posn = 2, /* transfer position */
Cmnd_Transfer_Prx = 3, /* transfer proximity waypoints */
Cmnd_Transfer_Rte = 4, /* transfer routes */
Cmnd_Transfer_Time = 5, /* transfer time */
Cmnd_Transfer_Trk = 6, /* transfer track log */
Cmnd_Transfer_Wpt = 7, /* transfer waypoints */
Cmnd_Turn_Off_Pwr = 8, /* turn off power */
Cmnd_Start_Pvt_Data = 49, /* start transmitting PVT data */
Cmnd_Stop_Pvt_Data = 50 /* stop transmitting PVT data */
};
The packet sequence for the Waypoint Transfer Protocol is shown below:
The first and last packets (Packet 0 and Packet n-1) are the standard beginning and ending packets (see Section 5.3,
Standard Beginning and Ending Packets, on page 12). The Command_Id_Type value contained in Packet n-1 is
Cmnd_Transfer_Wpt, which is also the command value used by the Host to initiate a transfer of waypoints from the
GPS.
Packets 1 through n-2 (Pid_Wpt_Data) each contain data for one waypoint, which is provided in product-specific
data type <D0>. This data type usually contains an identifier string, latitude and longitude, and other product-
specific data.
The first and last packets (Packet 0 and Packet n-1) are the standard beginning and ending packets (see Section 5.3,
Standard Beginning and Ending Packets, on page 12). The Command_Id_Type value contained in Packet n-1 is
Cmnd_Transfer_Rte, which is also the command value used by the Host to initiate a transfer of routes from the GPS.
Packet 1 (Pid_Rte_Hdr) contains route header information, which is provided in product-specific data type <D0>.
This data type usually contains information that uniquely identifies the route. Packets 2 through n-2
(Pid_Rte_Wpt_Data) each contain data for one route waypoint, which is provided in product-specific data type
<D1>. This data type usually contains the same waypoint data that is transferred in the Waypoint Transfer Protocol.
More than one route can be transferred during the protocol by sending another set of packets that resemble Packets 1
through n-2 in the table above. This additional set of packets is sent immediately after the previous set of route
packets. In other words, it is not necessary to send Pid_Xfer_Cmplt until all route packets have been sent for the
The first and last packets (Packet 0 and Packet n-1) are the standard beginning and ending packets (see Section 5.3,
Standard Beginning and Ending Packets, on page 12). The Command_Id_Type value contained in Packet n-1 is
Cmnd_Transfer_Rte, which is also the command value used by the Host to initiate a transfer of routes from the GPS.
Packet 1 (Pid_Rte_Hdr) contains route header information, which is provided in product-specific data type <D0>.
This data type usually contains information that uniquely identifies the route. Even numbered packets starting with
packet 2 and excluding packet n-1 (Pid_Rte_Wpt_Data) contain data for one route waypoint, which is provided in
product-specific data type <D1>. Odd numbered packets starting with packet 3 and excluding packet n-1
(Pid_Rte_Link_Data) contain data for one link between the adjacent waypoints. This link data provided in product-
specific data type <D2>.
More than one route can be transferred during the protocol by sending another set of packets that resemble Packets 1
through n-2 in the table above. This additional set of packets is sent immediately after the previous set of route
packets. In other words, it is not necessary to send Pid_Xfer_Cmplt until all route packets have been sent for the
multiple routes. Device2 must monitor the Packet ID to detect the beginning of a new route, which is indicated by a
Packet ID equal to Pid_Rte_Hdr. Any number of routes may be transferred in this fashion.
NOTE: Some GPS units use 0x7FFFFFFF or 0xFFFFFFFF instead of zero to indicate an invalid time value.
The packet sequence for the Track Log Transfer Protocol is shown below:
The first and last packets (Packet 0 and Packet n-1) are the standard beginning and ending packets (see Section 5.3,
Standard Beginning and Ending Packets, on page 12). The Command_Id_Type value contained in Packet n-1 is
Cmnd_Transfer_Trk, which is also the command value used by the Host to initiate a transfer of track logs from the
GPS.
Packets 1 through n-2 (Pid_Trk_Data) each contain data for one track log point, which is provided in product-
specific data type <D0>. This data type usually contains four elements: latitude, longitude, time, and a Boolean flag
indicating whether the point marks the beginning of a new track log segment.
The first and last packets (Packet 0 and Packet n-1) are the standard beginning and ending packets (see Section 5.3,
Standard Beginning and Ending Packets, on page 12). The Command_Id_Type value contained in Packet n-1 is
Cmnd_Transfer_Trk, which is also the command value used by the Host to initiate a transfer of track logs from the
GPS.
Packet 1 (Pid_Trk_Hdr) contains track header information, which is provided in product-specific data type <D0>.
This data type usually contains information that uniquely identifies the track log. Packets 2 through n-2
(Pid_Trk_Data) each contain data for one track log point, which is provided in product-specific data type <D1>.
More than one track log can be transferred during the protocol by sending another set of packets that resemble
packets 1 through n-2 in the table above. This additional set of packets is sent immediately after the previous set of
track log packets. In other words, it is not necessary to send Pid_Xfer_Cmplt until all track log packets have been
sent for the multiple track logs. Device2 must monitor the Packet ID to detect the beginning of a new track log,
which is indicated by a Packet ID of Pid_Trk_Hdr. Any number of track logs may be transferred in this fashion.
The packet sequence for the Proximity Waypoint Transfer Protocol is shown below:
The first and last packets (Packet 0 and Packet n-1) are the standard beginning and ending packets (see Section 5.3,
Standard Beginning and Ending Packets, on page 12). The Command_Id_Type value contained in Packet n-1 is
Cmnd_Transfer_Prx, which is also the command value used by the Host to initiate a transfer of proximity waypoints
from the GPS.
Packets 1 through n-2 (Pid_Prx_Wpt_Data) each contain data for one proximity waypoint, which is provided in
product-specific data type <D0>. This data type usually contains the same waypoint data that is transferred during
the Waypoint Transfer Protocol, plus a valid proximity alarm distance.
The GPS is also able to transmit almanac to the Host, allowing the user to archive the almanac or transfer the
almanac to another GPS.
The packet sequence for the Almanac Transfer Protocol is shown below:
The first and last packets (Packet 0 and Packet n-1) are the standard beginning and ending packets (see Section 5.3,
Standard Beginning and Ending Packets, on page 12). The Command_Id_Type value contained in Packet n-1 is
Cmnd_Transfer_Alm, which is also the command value used by the Host to initiate a transfer of the almanac from
the GPS
Packets 1 through n-2 (Pid_Almanac_Data) each contain almanac data for one satellite, which is provided in
product-specific data type <D0>. This data type contains data that describes the satellite’s orbit characteristics.
Some product-specific data types (<D0>) do not include a satellite ID to relate each data packet to a particular
satellite in the GPS constellation. For these data types, Device1 must transmit exactly 32 Pid_Almanac_Data
packets, and these packets must be sent in PRN order (i.e., the first packet contains data for PRN-01 and so on up to
PRN-32). If the data for a particular satellite is missing or if the satellite is non-existent, then the week number for
that satellite must be set to a negative number to indicate that the data is invalid.
The packet sequence for the Date and Time Initialization Protocol is shown below:
Packet 0 (Pid_Date_Time_Data) contains date and time data, which is provided in product-specific data type <D0>.
The packet sequence for the Position Initialization Protocol is shown below:
Packet 0 (Pid_Position_Data) contains position data, which is provided in product-specific data type <D0>. The
GPS may ignore the position data provided by this protocol whenever the GPS has a valid position fix or whenever
the GPS is in simulator mode.
The Host can turn PVT data on or off by using a Device Command Protocol (see Section 6.3, Device Command
Protocols, on page 17). PVT data is turned on when the Host sends the Cmnd_Start_Pvt_Data command and is
turned off when the Host sends the Cmnd_Stop_Pvt_Data command. Note that, as a side effect, most GPS products
turn off PVT data whenever they respond to the Product Data Protocol.
ACK and NAK packets are optional for this protocol; however, unlike other protocols, the GPS will not retransmit a
PVT data packet in response to receiving a NAK from the Host.
The packet sequence for the PVT Data Protocol is shown below:
Packet 0 (Pid_Pvt_Data) contains position, velocity, and time data, which is provided in product-specific data type
<D0>.
Some products may allow additional characters beyond those mentioned above, but no attempt is made in this
document to identify these product-specific additions. The Host should be prepared to receive any ASCII character
from the GPS, but only transmit the characters shown above back to the GPS.
7.3.1. char
The char data type is 8-bit integer or ASCII data. This data type is signed unless the unsigned keyword is present.
7.3.2. int
The int data type is 16-bit integer data. This data type is signed unless the unsigned keyword is present.
7.3.4. float
The float data type is 32-bit IEEE-format floating point data (1 sign bit, 8 exponent bits, and 23 mantissa bits).
7.3.5. double
The double data type is 64-bit IEEE-format floating point data (1 sign bit, 11 exponent bits, and 52 mantissa bits).
The word “CAT” would be stored in this data type as shown below:
xyz[0] = ‘C’;
xyz[1] = ‘A’;
xyz[2] = ‘T’;
xyz[3] = ‘ ’;
xyz[4] = ‘ ’;
xyz[5] = ‘ ’;
Character arrays provide a way to transfer strings between the Host and the GPS. However, the size of a character
array may exceed the number of characters that a GPS has allotted for the string being transferred. If this is the case,
the GPS will ignore any characters beyond the size of its allotted string. For example, a “cmnt” character array may
allow 40 characters to be transferred, but a GPS may only have 16 characters allotted for a “cmnt” string. In this
case, the GPS will ignore the last 24 characters of the transferred character array.
typedef struct
{
int ABC;
/* char XYZ[] null-terminated string */
int DEF;
} example_type;
7.4.3. byte
The byte type is used for 8-bit unsigned integers:
7.4.4. word
The word type is used for 16-bit unsigned integers:
7.4.5. longword
The longword type is used for 32-bit unsigned integers:
7.4.6. boolean
The boolean type an 8-bit integer used to indicate true (non-zero) or false (zero):
7.4.7. Semicircle_Type
The integer Semicircle_Type is used to indicate latitude and longitude in semicircles, where 231 semicircles equals
180 degrees. North latitudes and East longitudes are indicated with positive numbers; South latitudes and West
longitudes are indicated with negative numbers.
typedef struct
{
long lat; /* latitude in semicircles */
long lon; /* longitude in semicircles */
} Semicircle_Type;
The following formulas show how to convert between degrees and semicircles:
7.4.8. Radian_Type
The floating point Radian_Type is used to indicate latitude and longitude in radians, where πradians equals 180
degrees. North latitudes and East longitudes are indicated with positive numbers; South latitudes and West
longitudes are indicated with negative numbers.
The following formulas show how to convert between degrees and radians:
7.4.9. Symbol_Type
The Symbol_Type is used in certain GPS products to indicate the symbol for a waypoint:
The enumerated values for Symbol_Type are shown below. Note that most GPS products that use this type are
limited to a much smaller subset of these symbols, and no attempt is made in this document to indicate which
subsets are valid for each of these GPS products. However, the GPS will ignore any unallowed symbol values that
are received and instead substitute the value for a generic dot symbol. Therefore, there is no harm in attempting to
use any value shown in the table below except that the GPS may not accept the requested value.
/*------------------------------------------------------
marine navaid symbols
------------------------------------------------------*/
sym_buoy_ambr = 22, /* amber map buoy symbol */
sym_buoy_blck = 23, /* black map buoy symbol */
sym_buoy_blue = 24, /* blue map buoy symbol */
sym_buoy_grn = 25, /* green map buoy symbol */
sym_buoy_grn_red = 26, /* green/red map buoy symbol */
sym_buoy_grn_wht = 27, /* green/white map buoy symbol */
sym_buoy_orng = 28, /* orange map buoy symbol */
sym_buoy_red = 29, /* red map buoy symbol */
sym_buoy_red_grn = 30, /* red/green map buoy symbol */
sym_buoy_red_wht = 31, /* red/white map buoy symbol */
sym_buoy_violet = 32, /* violet map buoy symbol */
sym_buoy_wht = 33, /* white map buoy symbol */
sym_buoy_wht_grn = 34, /* white/green map buoy symbol */
sym_buoy_wht_red = 35, /* white/red map buoy symbol */
sym_dot = 36, /* white dot symbol */
sym_rbcn = 37, /* radio beacon symbol */
/*------------------------------------------------------
leave space for more navaids (up to 128 total)
------------------------------------------------------*/
/*---------------------------------------------------------------
Symbols for land (group 1...8192-16383...bits 15-13=001).
---------------------------------------------------------------*/
sym_is_hwy = 8192, /* interstate hwy symbol */
sym_us_hwy = 8193, /* us hwy symbol */
sym_st_hwy = 8194, /* state hwy symbol */
sym_mi_mrkr = 8195, /* mile marker symbol */
sym_trcbck = 8196, /* TracBack (feet) symbol */
sym_golf = 8197, /* golf symbol */
sym_sml_cty = 8198, /* small city symbol */
sym_med_cty = 8199, /* medium city symbol */
sym_lrg_cty = 8200, /* large city symbol */
sym_freeway = 8201, /* intl freeway hwy symbol */
sym_ntl_hwy = 8202, /* intl national hwy symbol */
sym_cap_cty = 8203, /* capitol city symbol (star) */
sym_amuse_pk = 8204, /* amusement park symbol */
sym_bowling = 8205, /* bowling symbol */
sym_car_rental = 8206, /* car rental symbol */
sym_car_repair = 8207, /* car repair symbol */
sym_fastfood = 8208, /* fast food symbol */
sym_fitness = 8209, /* fitness symbol */
sym_movie = 8210, /* movie symbol */
sym_museum = 8211, /* museum symbol */
sym_pharmacy = 8212, /* pharmacy symbol */
sym_pizza = 8213, /* pizza symbol */
sym_post_ofc = 8214, /* post office symbol */
sym_rv_park = 8215, /* RV park symbol */
sym_school = 8216, /* school symbol */
sym_stadium = 8217, /* stadium symbol */
sym_store = 8218, /* dept. store symbol */
sym_zoo = 8219, /* zoo symbol */
sym_gas_plus = 8220, /* convenience store symbol */
sym_faces = 8221, /* live theater symbol */
sym_ramp_int = 8222, /* ramp intersection symbol */
sym_st_int = 8223, /* street intersection symbol */
sym_weigh_sttn = 8226, /* inspection/weigh station symbol */
sym_toll_booth = 8227, /* toll booth symbol */
sym_elev_pt = 8228, /* elevation point symbol */
sym_ex_no_srvc = 8229, /* exit without services symbol */
sym_geo_place_mm = 8230, /* Geographic place name, man-made */
sym_geo_place_wtr = 8231, /* Geographic place name, water */
sym_geo_place_lnd = 8232, /* Geographic place name, land */
sym_bridge = 8233, /* bridge symbol */
sym_building = 8234, /* building symbol */
sym_cemetery = 8235, /* cemetery symbol */
sym_church = 8236, /* church symbol */
sym_civil = 8237, /* civil location symbol */
sym_crossing = 8238, /* crossing symbol */
sym_hist_town = 8239, /* historical town symbol */
sym_levee = 8240, /* levee symbol */
sym_military = 8241, /* military location symbol */
sym_oil_field = 8242, /* oil field symbol */
sym_tunnel = 8243, /* tunnel symbol */
sym_beach = 8244, /* beach symbol */
sym_forest = 8245, /* forest symbol */
sym_summit = 8246, /* summit symbol */
sym_lrg_ramp_int = 8247, /* large ramp intersection symbol */
sym_lrg_ex_no_srvc = 8248, /* large exit without services smbl */
sym_badge = 8249, /* police/official badge symbol */
sym_cards = 8250, /* gambling/casino symbol */
/*---------------------------------------------------------------
Symbols for aviation (group 2...16383-24575...bits 15-13=010).
---------------------------------------------------------------*/
sym_airport = 16384, /* airport symbol */
sym_int = 16385, /* intersection symbol */
sym_ndb = 16386, /* non-directional beacon symbol */
sym_vor = 16387, /* VHF omni-range symbol */
sym_heliport = 16388, /* heliport symbol */
sym_private = 16389, /* private field symbol */
sym_soft_fld = 16390, /* soft field symbol */
sym_tall_tower = 16391, /* tall tower symbol */
sym_short_tower = 16392, /* short tower symbol */
sym_glider = 16393, /* glider symbol */
sym_ultralight = 16394, /* ultralight symbol */
sym_parachute = 16395, /* parachute symbol */
sym_vortac = 16396, /* VOR/TACAN symbol */
sym_vordme = 16397, /* VOR-DME symbol */
sym_faf = 16398, /* first approach fix */
sym_lom = 16399, /* localizer outer marker */
sym_map = 16400, /* missed approach point */
sym_tacan = 16401, /* TACAN symbol */
sym_seaplane = 16402, /* Seaplane Base */
};
7.5.1. D100_Wpt_Type
Example products: GPS 38, GPS 40, GPS 45, GPS 75 and GPS II.
typedef struct
{
char ident[6]; /* identifier */
Semicircle_Type posn; /* position */
longword unused; /* should be set to zero */
char cmnt[40]; /* comment */
} D100_Wpt_Type;
7.5.2. D101_Wpt_Type
Example products: GPSMAP 210 and GPSMAP 220 (both prior to version 4.00).
typedef struct
{
char ident[6]; /* identifier */
Semicircle_Type posn; /* position */
longword unused; /* should be set to zero */
char cmnt[40]; /* comment */
float dst; /* proximity distance (meters) */
byte smbl; /* symbol id */
} D101_Wpt_Type;
The enumerated values for the “smbl” member of the D101_Wpt_Type are the same as those for Symbol_Type (see
Section 7.4.9 on page 32). However, since the “smbl” member of the D101_Wpt_Type is only 8-bits (instead of 16-
bits), all Symbol_Type values whose upper byte is non-zero are unallowed in the D101_Wpt_Type.
The “dst” member is valid only during the Proximity Waypoint Transfer Protocol.
typedef struct
{
char ident[6]; /* identifier */
Semicircle_Type posn; /* position */
longword unused; /* should be set to zero */
char cmnt[40]; /* comment */
float dst; /* proximity distance (meters) */
Symbol_Type smbl; /* symbol id */
} D102_Wpt_Type;
The “dst” member is valid only during the Proximity Waypoint Transfer Protocol.
7.5.4. D103_Wpt_Type
Example products: GPS 12, GPS 12 XL, GPS 48 and GPS II Plus.
typedef struct
{
char ident[6]; /* identifier */
Semicircle_Type posn; /* position */
longword unused; /* should be set to zero */
char cmnt[40]; /* comment */
byte smbl; /* symbol id */
byte dspl; /* display option */
} D103_Wpt_Type;
The enumerated values for the “smbl” member of the D103_Wpt_Type are shown below:
enum
{
smbl_dot = 0, /* dot symbol */
smbl_house = 1, /* house symbol */
smbl_gas = 2, /* gas symbol */
smbl_car = 3, /* car symbol */
smbl_fish = 4, /* fish symbol */
smbl_boat = 5, /* boat symbol */
smbl_anchor = 6, /* anchor symbol */
smbl_wreck = 7, /* wreck symbol */
smbl_exit = 8, /* exit symbol */
smbl_skull = 9, /* skull symbol */
smbl_flag = 10, /* flag symbol */
smbl_camp = 11, /* camp symbol */
smbl_circle_x = 12, /* circle with x symbol */
smbl_deer = 13, /* deer symbol */
smbl_1st_aid = 14, /* first aid symbol */
smbl_back_track = 15 /* back track symbol */
};
The enumerated values for the “dspl” member of the D103_Wpt_Type are shown below:
enum
{
dspl_name = 0, /* Display symbol with waypoint name */
dspl_none = 1, /* Display symbol by itself */
dspl_cmnt = 2 /* Display symbol with comment */
};
7.5.5. D104_Wpt_Type
Example products: GPS III.
The enumerated values for the “dspl” member of the D104_Wpt_Type are shown below:
enum
{
dspl_smbl_none = 0, /* Display symbol by itself */
dspl_smbl_only = 1, /* Display symbol by itself */
dspl_smbl_name = 3, /* Display symbol with waypoint name */
dspl_smbl_cmnt = 5, /* Display symbol with comment */
};
The “dst” member is valid only during the Proximity Waypoint Transfer Protocol.
7.5.6. D105_Wpt_Type
Example products: StreetPilot (user waypoints).
typedef struct
{
Semicircle_Type posn; /* position */
Symbol_Type smbl; /* symbol id */
/* char wpt_ident[]; null-terminated string */
} D105_Wpt_Type;
7.5.7. D106_Wpt_Type
Example products: StreetPilot (route waypoints).
typedef struct
{
byte wpt_class; /* class */
byte subclass[13]; /* subclass */
Semicircle_Type posn; /* position */
Symbol_Type smbl; /* symbol id */
/* char wpt_ident[]; null-terminated string */
/* char lnk_ident[]; null-terminated string */
} D106_Wpt_Type;
The enumerated values for the “wpt_class” member of the D106_Wpt_Type are as follows:
For non-user waypoints (such as a city in the GPS map database), the GPS will provide a non-zero value in the
“wpt_class” member, and the “subclass” member will contain valid data to further identify the non-user waypoint. If
the Host wishes to transfer this waypoint back to the GPS (as part of a route), the Host must leave the “wpt_class”
and “subclass” members unmodified. For user waypoints, the Host must ensure that the “wpt_class” member is zero,
but the “subclass” member will be ignored and should be set to zero.
7.5.8. D107_Wpt_Type
Example products: GPS 12CX.
typedef struct
{
char ident[6]; /* identifier */
Semicircle_Type posn; /* position */
longword unused; /* should be set to zero */
char cmnt[40]; /* comment */
byte smbl; /* symbol id */
byte dspl; /* display option */
float dst; /* proximity distance (meters) */
byte color; /* waypoint color */
} D107_Wpt_Type;
The enumerated values for the “smbl” member of the D107_Wpt_Type are the same as the the “smbl” member of
the D103_Wpt_Type.
The enumerated values for the “dspl” member of the D107_Wpt_Type are the same as the the “dspl” member of the
D103_Wpt_Type.
The enumerated values for the “color” member of the D107_Wpt_Type are shown below:
enum
{
clr_default = 0, /* Default waypoint color */
clr_red = 1, /* Red */
clr_green = 2, /* Green */
clr_blue = 3 /* Blue */
};
7.5.9. D108_Wpt_Type
Example products: GPSMAP 162/168, eMap, GPSMAP 295.
The enumerated values for the “wpt_class” member of the D108_Wpt_Type are defined as follows:
enum
{
USER_WPT = 0x00, /* User waypoint */
AVTN_APT_WPT = 0x40, /* Aviation Airport waypoint */
AVTN_INT_WPT = 0x41, /* Aviation Intersection waypoint */
AVTN_NDB_WPT = 0x42, /* Aviation NDB waypoint */
AVTN_VOR_WPT = 0x43, /* Aviation VOR waypoint */
AVTN_ARWY_WPT = 0x44, /* Aviation Airport Runway waypoint */
AVTN_AINT_WPT = 0x45, /* Aviation Airport Intersection */
AVTN_ANDB_WPT = 0x46, /* Aviation Airport NDB waypoint */
MAP_PNT_WPT = 0x80, /* Map Point waypoint */
MAP_AREA_WPT = 0x81, /* Map Area waypoint */
MAP_INT_WPT = 0x82, /* Map Intersection waypoint */
MAP_ADRS_WPT = 0x83, /* Map Address waypoint */
MAP_LABEL_WPT = 0x84, /* Map Label Waypoint */
MAP_LINE_WPT = 0x85, /* Map Line Waypoint */
};
The enumerated values for the “dspl” member of the D108_Wpt_Type are the same as the the “dspl” member of the
D103_Wpt_Type.
The “subclass” member of the D108_Wpt_Type is used for map waypoints only, and should be set to 0x0000
0x00000000 0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF for other classes of waypoints.
The “alt” and “dpth” members may or may not be supported on a given unit. A value of 1.0e25 in either of these
fields indicates that this parameter is not supported or is unknown for this waypoint.
The “comment” member of the D108_Wpt_Type is used for user waypoints only, and should be an empty string for
other waypoint classes.
The “facility” and “city” members are used only for aviation waypoints, and should be empty strings for other
waypoint classes.
The “addr” member is only valid for MAP_ADRS_WPT class waypoints and will be an empty string otherwise.
The “cross_road” member is valid only for MAP_INT_WPT class waypoints, and will be an empty string otherwise.
7.5.10. D150_Wpt_Type
Example products: GPS 150, GPS 155, GNC 250 and GNC 300.
typedef struct
{
char ident[6]; /* identifier */
char cc[2]; /* country code */
byte wpt_class; /* class */
Semicircle_Type posn; /* position */
int alt; /* altitude (meters) */
char city[24]; /* city */
char state[2]; /* state */
char name[30]; /* facility name */
char cmnt[40]; /* comment */
} D150_Wpt_Type;
The enumerated values for the “wpt_class” member of the D150_Wpt_Type are shown below:
enum
{
apt_wpt_class = 0, /* airport waypoint class */
int_wpt_class = 1, /* intersection waypoint class */
ndb_wpt_class = 2, /* NDB waypoint class */
vor_wpt_class = 3, /* VOR waypoint class */
usr_wpt_class = 4, /* user defined waypoint class */
rwy_wpt_class = 5, /* airport runway threshold waypoint class */
aint_wpt_class = 6, /* airport intersection waypoint class */
locked_wpt_class = 7 /* locked waypoint class */
};
The “locked_wpt_class” code indicates that a route within a GPS contains an aviation database waypoint that the
GPS could not find in its aviation database (presumably because the aviation database was updated to a newer
version). The Host should never send the “locked_wpt_class” code to the GPS.
The “city,” “state,” “name,” and “cc” members are invalid when the “wpt_class” member is equal to usr_wpt_class.
The “alt” member is valid only when the “wpt_class” member is equal to apt_wpt_class.
7.5.11. D151_Wpt_Type
Example products: GPS 55 AVD, GPS 89.
The enumerated values for the “wpt_class” member of the D151_Wpt_Type are shown below:
enum
{
apt_wpt_class = 0, /* airport waypoint class */
vor_wpt_class = 1, /* VOR waypoint class */
usr_wpt_class = 2, /* user defined waypoint class */
locked_wpt_class = 3 /* locked waypoint class */
};
The “locked_wpt_class” code indicates that a route within a GPS contains an aviation database waypoint that the
GPS could not find in its aviation database (presumably because the aviation database was updated to a newer
version). The Host should never send the “locked_wpt_class” code to the GPS.
The “dst” member is valid only during the Proximity Waypoint Transfer Protocol.
The “city,” “state,” “name,” and “cc” members are invalid when the “wpt_class” member is equal to usr_wpt_class.
The “alt” member is valid only when the “wpt_class” member is equal to apt_wpt_class.
7.5.12. D152_Wpt_Type
Example products: GPS 90, GPS 95 AVD, GPS 95 XL and GPSCOM 190.
typedef struct
{
char ident[6]; /* identifier */
Semicircle_Type posn; /* position */
longword unused; /* should be set to zero */
char cmnt[40]; /* comment */
float dst; /* proximity distance (meters) */
char name[30]; /* facility name */
char city[24]; /* city */
char state[2]; /* state */
int alt; /* altitude (meters) */
char cc[2]; /* country code */
char unused2; /* should be set to zero */
byte wpt_class; /* class */
} D152_Wpt_Type;
The enumerated values for the “wpt_class” member of the D152_Wpt_Type are shown below:
The “locked_wpt_class” code indicates that a route within a GPS contains an aviation database waypoint that the
GPS could not find in its aviation database (presumably because the aviation database was updated to a newer
version). The Host should never send the “locked_wpt_class” code to the GPS.
The “dst” member is valid only during the Proximity Waypoint Transfer Protocol.
The “city,” “state,” “name,” and “cc” members are invalid when the “wpt_class” member is equal to usr_wpt_class.
The “alt” member is valid only when the “wpt_class” member is equal to apt_wpt_class.
7.5.13. D154_Wpt_Type
Example products: GPSMAP 195.
typedef struct
{
char ident[6]; /* identifier */
Semicircle_Type posn; /* position */
longword unused; /* should be set to zero */
char cmnt[40]; /* comment */
float dst; /* proximity distance (meters) */
char name[30]; /* facility name */
char city[24]; /* city */
char state[2]; /* state */
int alt; /* altitude (meters) */
char cc[2]; /* country code */
char unused2; /* should be set to zero */
byte wpt_class; /* class */
Symbol_Type smbl; /* symbol id */
} D154_Wpt_Type;
The enumerated values for the “wpt_class” member of the D154_Wpt_Type are shown below:
enum
{
apt_wpt_class = 0, /* airport waypoint class */
int_wpt_class = 1, /* intersection waypoint class */
ndb_wpt_class = 2, /* NDB waypoint class */
vor_wpt_class = 3, /* VOR waypoint class */
usr_wpt_class = 4, /* user defined waypoint class */
rwy_wpt_class = 5, /* airport runway threshold waypoint class */
aint_wpt_class = 6, /* airport intersection waypoint class */
andb_wpt_class = 7, /* airport NDB waypoint class */
sym_wpt_class = 8, /* user defined symbol-only waypoint class */
locked_wpt_class = 9 /* locked waypoint class */
};
The “locked_wpt_class” code indicates that a route within a GPS contains an aviation database waypoint that the
GPS could not find in its aviation database (presumably because the aviation database was updated to a newer
version). The Host should never send the “locked_wpt_class” code to the GPS.
The “city,” “state,” “name,” and “cc” members are invalid when the “wpt_class” member is equal to usr_wpt_class
or sym_wpt_class. The “alt” member is valid only when the “wpt_class” member is equal to apt_wpt_class.
7.5.14. D155_Wpt_Type
Example products: GPS III Pilot.
typedef struct
{
char ident[6]; /* identifier */
Semicircle_Type posn; /* position */
longword unused; /* should be set to zero */
char cmnt[40]; /* comment */
float dst; /* proximity distance (meters) */
char name[30]; /* facility name */
char city[24]; /* city */
char state[2]; /* state */
int alt; /* altitude (meters) */
char cc[2]; /* country code */
char unused2; /* should be set to zero */
byte wpt_class; /* class */
Symbol_Type smbl; /* symbol id */
byte dspl; /* display option */
} D155_Wpt_Type;
The enumerated values for the “dspl” member of the D155_Wpt_Type are shown below:
enum
{
dspl_smbl_only = 1, /* Display symbol by itself */
dspl_smbl_name = 3, /* Display symbol with waypoint name */
dspl_smbl_cmnt = 5, /* Display symbol with comment */
};
The enumerated values for the “wpt_class” member of the D155_Wpt_Type are shown below:
enum
{
apt_wpt_class = 0, /* airport waypoint class */
int_wpt_class = 1, /* intersection waypoint class */
ndb_wpt_class = 2, /* NDB waypoint class */
vor_wpt_class = 3, /* VOR waypoint class */
usr_wpt_class = 4, /* user defined waypoint class */
locked_wpt_class = 5 /* locked waypoint class */
};
The “locked_wpt_class” code indicates that a route within a GPS contains an aviation database waypoint that the
GPS could not find in its aviation database (presumably because the aviation database was updated to a newer
version). The Host should never send the “locked_wpt_class” code to the GPS.
The “dst” member is valid only during the Proximity Waypoint Transfer Protocol.
The “city,” “state,” “name,” and “cc” members are invalid when the “wpt_class” member is equal to usr_wpt_class.
The “alt” member is valid only when the “wpt_class” member is equal to apt_wpt_class.
The route number contained in the D200_Rte_Hdr_Type must be unique for each route.
7.5.16. D201_Rte_Hdr_Type
Example products: all products unless otherwise noted.
typedef struct
{
byte nmbr; /* route number */
char cmnt[20]; /* comment */
} D201_Rte_Hdr_Type;
The “nmbr” member must be unique for each route. Some GPS units require a unique “cmnt” for each route, and
other GPS units do not. There is no mechanism available for the Host to determine whether a GPS requires a unique
“cmnt”, and the Host must be prepared to receive unique or non-unique “cmnt” from the GPS.
7.5.17. D202_Rte_Hdr_Type
Example products: StreetPilot.
typedef struct
{
/* char rte_ident[]; null-terminated string */
} D202_Rte_Hdr_Type;
7.5.18. D210_Rte_Link_Type
Example products: GPSMAP 162/168, eMap, GPSMAP 295.
typedef struct
{
word class; /* link class; see below */
byte subclass[18]; /* sublcass */
/* char ident[]; variable length string */
};
enum
{
line = 0,
link = 1,
net = 2,
direct = 3,
snap = 0xFF
};
The “ident” member has a maximum length of 51 characters, including the terminating NULL.
If “class” is set to “direct” or “snap”, subclass should be set to its default value of 0x0000 0x00000000 0xFFFFFFFF
0xFFFFFFFF 0xFFFFFFFF.
typedef struct
{
Semicircle_Type posn; /* position */
longword time; /* time */
boolean new_trk; /* new track segment? */
} D300_Trk_Point_Type;
The “time” member provides a timestamp for the track log point. This time is expressed as the number of seconds
since UTC 12:00 AM on December 31st, 1989.
When true, the “new_trk” member indicates that the track log point marks the beginning of a new track log segment.
7.5.20. D301_Trk_Point_Type
Example products: GPSMAP 162/168, eMap, GPSMAP 295.
typedef struct
{
Semicircle_Type posn; /* position */
longword time; /* time */
float alt; /* altitude in meters */
float dpth; /* depth in meters */
boolean new_trk; /* new track segment? */
} D301_Trk_Point_Type;
The “time” member provides a timestamp for the track log point. This time is expressed as the number of seconds
since UTC 12:00 AM on December 31st, 1989.
The ‘alt’and ‘dpth’members may or may not be supported on a given unit. A value of 1.0e25 in either of these
fields indicates that this parameter is not supported or is unknown for this track point.
When true, the “new_trk” member indicates that the track log point marks the beginning of a new track log segment.
7.5.21. D310_Trk_Hdr_Type
Example products: GPSMAP 162/168, eMap, GPSMAP 295.
typedef struct
{
boolean dspl; /* display on the map? */
byte color; /* color (same as D108) */
/* char trk_ident[]; null-terminated string */
} D310_Trk_Hdr_Type;
The ‘trk_ident’member has a maximum length of 51 characters including the terminating NULL.
7.5.22. D400_Prx_Wpt_Type
Example products: GPS 55 and GPS 75.
The “dst” member is valid only during the Proximity Waypoint Transfer Protocol.
7.5.23. D403_Prx_Wpt_Type
Example products: GPS 12, GPS 12 XL and GPS 48.
typedef struct
{
D103_Wpt_Type wpt; /* waypoint */
float dst; /* proximity distance (meters) */
} D403_Prx_Wpt_Type;
The “dst” member is valid only during the Proximity Waypoint Transfer Protocol.
7.5.24. D450_Prx_Wpt_Type
Example products: GPS 150, GPS 155, GNC 250 and GNC 300.
typedef struct
{
int idx; /* proximity index */
D150_Wpt_Type wpt; /* waypoint */
float dst; /* proximity distance (meters) */
} D450_Prx_Wpt_Type;
The “dst” member is valid only during the Proximity Waypoint Transfer Protocol.
7.5.25. D500_Almanac_Type
Example products: GPS 38, GPS 40, GPS 45, GPS 55, GPS 75, GPS 95 and GPS II.
typedef struct
{
int wn; /* week number (weeks) */
float toa; /* almanac data reference time (s) */
float af0; /* clock correction coefficient (s) */
float af1; /* clock correction coefficient (s/s) */
float e; /* eccentricity (-) */
float sqrta; /* square root of semi-major axis (a) (m**1/2) */
float m0; /* mean anomaly at reference time (r) */
float w; /* argument of perigee (r) */
float omg0; /* right ascension (r) */
float odot; /* rate of right ascension (r/s) */
float i; /* inclination angle (r) */
} D500_Almanac_Type;
7.5.26. D501_Almanac_Type
Example products: GPS 12, GPS 12 XL, GPS 48, GPS II Plus and GPS III.
7.5.27. D550_Almanac_Type
Example products: GPS 150, GPS 155, GNC 250 and GNC 300.
typedef struct
{
char svid; /* satellite id */
int wn; /* week number (weeks) */
float toa; /* almanac data reference time (s) */
float af0; /* clock correction coefficient (s) */
float af1; /* clock correction coefficient (s/s) */
float e; /* eccentricity (-) */
float sqrta; /* square root of semi-major axis (a) (m**1/2) */
float m0; /* mean anomaly at reference time (r) */
float w; /* argument of perigee (r) */
float omg0; /* right ascension (r) */
float odot; /* rate of right ascension (r/s) */
float i; /* inclination angle (r) */
} D550_Almanac_Type;
The “svid” member identifies a satellite in the GPS constellation as follows: PRN-01 through PRN-32 are indicated
by “svid” equal to 0 through 31, respectively.
7.5.28. D551_Almanac_Type
Example products: GPS 150 XL, GPS 155 XL, GNC 250 XL and GNC 300 XL.
typedef struct
{
char svid; /* satellite id */
int wn; /* week number (weeks) */
float toa; /* almanac data reference time (s) */
float af0; /* clock correction coefficient (s) */
float af1; /* clock correction coefficient (s/s) */
float e; /* eccentricity (-) */
float sqrta; /* square root of semi-major axis (a) (m**1/2) */
float m0; /* mean anomaly at reference time (r) */
float w; /* argument of perigee (r) */
float omg0; /* right ascension (r) */
float odot; /* rate of right ascension (r/s) */
float i; /* inclination angle (r) */
byte hlth; /* almanac health bits 17:24 (coded) */
} D551_Almanac_Type;
The “svid” member identifies a satellite in the GPS constellation as follows: PRN-01 through PRN-32 are indicated
by “svid” equal to 0 through 31, respectively.
typedef struct
{
byte month; /* month (1-12) */
byte day; /* day (1-31) */
word year; /* year (1990 means 1990) */
int hour; /* hour (0-23) */
byte minute; /* minute (0-59) */
byte second; /* second (0-59) */
} D600_Date_Time_Type;
7.5.30. D700_Position_Type
Example products: all products unless otherwise noted.
7.5.31. D800_Pvt_Data_Type
Example products: GPS III and StreetPilot.
typedef struct
{
float alt; /* altitude above WGS 84 ellipsoid (meters) */
float epe; /* estimated position error, 2 sigma (meters) */
float eph; /* epe, but horizontal only (meters) */
float epv; /* epe, but vertical only (meters) */
int fix; /* type of position fix */
double tow; /* time of week (seconds) */
Radian_Type posn; /* latitude and longitude (radians) */
float east; /* velocity east (meters/second) */
float north; /* velocity north (meters/second) */
float up; /* velocity up (meters/second) */
float msl_hght; /* height of WGS 84 ellipsoid above MSL (meters) */
int leap_scnds; /* difference between GPS and UTC (seconds) */
long wn_days; /* week number days */
} D800_Pvt_Data_Type;
The “alt” parameter provides the altitude above the WGS 84 ellipsoid. To find the altitude above mean sea level, add
“msl_ hght” to “alt” (“msl_hght” gives the height of the WGS 84 ellipsoid above mean sea level at the current
position).
The “tow” parameter provides the number of seconds (excluding leap seconds) since the beginning of the current
week, which begins on Sunday at 12:00 AM (i.e., midnight Saturday night-Sunday morning). The “tow” parameter
is based on Universal Coordinated Time (UTC), except UTC is periodically corrected for leap seconds while “tow”
is not corrected for leap seconds. To find UTC, subtract “leap_scnds” from “tow.” Since this may cause a negative
result for the first few seconds of the week (i.e., when “tow” is less than “leap_scnds”), care must be taken to
properly translate this negative result to a positive time value in the previous day. Also, since “tow” is a floating
point number and may contain fractional seconds, care must be taken to properly round off when using “tow” in
integer conversions and calculations.
The enumerated values for the “fix” member of the D800_Pvt_Data_Type are shown below. It is important for the
Host to inspect this value to ensure that other data members in the D800_Pvt_Data_Type are valid. No indication is
given as to whether the GPS is in simulator mode versus having an actual position fix.
enum
{
unusable = 0, /* failed integrity check */
invalid = 1, /* invalid or unavailable */
2D = 2, /* two dimensional */
3D = 3, /* three dimensional */
2D_diff = 4, /* two dimensional differential */
3D_diff = 5 /* three dimensional differential */
};
The presence of a product in the table below indicates that the product did not originally implement the Protocol
Capabilities Protocol (A001). However, if the Host detects that one of these products now provides Protocol
Capabilities Protocol data (due to a new version of software loaded in the product), then Protocol Capabilities
Protocol data shall take precedence over the data provided in the table below.
The following protocols are omitted from the table because all products in the table implement them:
All products in the table use the D600 data type in conjunction with the A600 protocol; similarly, all products in the
table use the D700 data type in conjunction with the A700 protocol. The A800/D800 protocol and data type are
omitted from the table because none of the products in the table implements PVT Data transfer.
A: Part of the goal of the document is to separate what GARMIN thinks is safe versus what is unsafe when
interfacing to our GPS products. Any items left out of the document are considered to be “testing aids” for use by
our engineering and manufacturing departments only. As such, we do not require all products to have all testing
aids, nor do we require the testing aids to be implemented in the same way in every product. In fact, there is a wide
A: Having both decimal and hexadecimal numbers introduces dual-maintenance, which is twice the work and prone
to errors. Therefore, we chose to use a single numbering system. We chose decimal because it made the overall
document easier to understand.
A: Prior to having a definitive interface specification, this was probably the best approach. However, now you
should follow the recommendations of the specification and use the Protocol Capabilities Protocol or the lookup
table in Section 8.2 to explicitly determine the waypoint format. Validating data based on length is undesirable
because: 1) it doesn’t validate the integrity of the data (this is done at the link layer using a checksum); and 2) there
is some possibility that the GPS will transmit a few extra bytes at the end of the data, which would invalidate an
otherwise valid packet (you can safely ignore the extra bytes).
A: Only a few of our very early products used this field for creation date. All other products treat it as “unused.”
Your program should ignore this field when receiving and set it to zero when transmitting.
A: No definitions for these parameters are given other than what is provided in the comments. In most cases, a
program should simply upload and download this data. Otherwise, the comments should suffice for most
applications.
A: We believe the document contains all the necessary information with minimal duplication. Additional sorting
may be performed by the copy/pasting the data into your favorite spreadsheet.
A: We are currently unable to take the time to compile this information. The purpose of the table is to allow you to
determine the Product IDs for the products you wish to support. For example, to support a GPS 12 you must support
Product IDs 77, 87, and 96 and their associated protocols from the table in Section 8.2.