1106163Sroberto/* @(#) $Header$ (LBL) */
254359Sroberto
354359Sroberto/*
454359Sroberto * Rockwell Jupiter GPS receiver definitions
554359Sroberto *
654359Sroberto * This is all based on the "Zodiac GPS Receiver Family Designer's
754359Sroberto * Guide" (dated 12/96)
854359Sroberto */
954359Sroberto
1054359Sroberto#define JUPITER_SYNC		0x81ff	/* sync word (book says 0xff81 !?!?) */
1154359Sroberto#define JUPITER_ALL		0xffff	/* disable all output messages */
1254359Sroberto
1354359Sroberto/* Output messages (sent by the Jupiter board) */
1454359Sroberto#define JUPITER_O_GPOS		1000	/* geodetic position status */
1554359Sroberto#define JUPITER_O_EPOS		1001	/* ECEF position status */
1654359Sroberto#define JUPITER_O_CHAN		1002	/* channel summary */
1754359Sroberto#define JUPITER_O_VIS		1003	/* visible satellites */
1854359Sroberto#define JUPITER_O_DGPS		1005	/* differential GPS status */
1954359Sroberto#define JUPITER_O_MEAS		1007	/* channel measurement */
2054359Sroberto#define JUPITER_O_ID		1011	/* receiver id */
2154359Sroberto#define JUPITER_O_USER		1012	/* user-settings output */
2254359Sroberto#define JUPITER_O_TEST		1100	/* built-in test results */
2354359Sroberto#define JUPITER_O_MARK		1102	/* measurement time mark */
2454359Sroberto#define JUPITER_O_PULSE		1108	/* UTC time mark pulse output */
2554359Sroberto#define JUPITER_O_PORT		1130	/* serial port com parameters in use */
2654359Sroberto#define JUPITER_O_EUP		1135	/* EEPROM update */
2754359Sroberto#define JUPITER_O_ESTAT		1136	/* EEPROM status */
2854359Sroberto
2954359Sroberto/* Input messages (sent to the Jupiter board) */
3054359Sroberto#define JUPITER_I_PVTINIT	1200	/* geodetic position and velocity */
3154359Sroberto#define JUPITER_I_USER		1210	/* user-defined datum */
3254359Sroberto#define JUPITER_I_MAPSEL	1211	/* map datum select */
3354359Sroberto#define JUPITER_I_ELEV		1212	/* satellite elevation mask control */
3454359Sroberto#define JUPITER_I_CAND		1213	/* satellite candidate select */
3554359Sroberto#define JUPITER_I_DGPS		1214	/* differential GPS control */
3654359Sroberto#define JUPITER_I_COLD		1216	/* cold start control */
3754359Sroberto#define JUPITER_I_VALID		1217	/* solution validity criteria */
3854359Sroberto#define JUPITER_I_ALT		1219	/* user-entered altitude input */
3954359Sroberto#define JUPITER_I_PLAT		1220	/* application platform control */
4054359Sroberto#define JUPITER_I_NAV		1221	/* nav configuration */
4154359Sroberto#define JUPITER_I_TEST		1300	/* preform built-in test command */
4254359Sroberto#define JUPITER_I_RESTART	1303	/* restart command */
4354359Sroberto#define JUPITER_I_PORT		1330	/* serial port com parameters */
4454359Sroberto#define JUPITER_I_PROTO		1331	/* message protocol control */
4554359Sroberto#define JUPITER_I_RDGPS		1351	/* raw DGPS RTCM SC-104 data */
4654359Sroberto
4754359Srobertostruct jheader {
4854359Sroberto	u_short sync;		/* (JUPITER_SYNC) */
4954359Sroberto	u_short id;		/* message id */
5054359Sroberto	u_short len;		/* number of data short wordss (w/o cksum) */
5154359Sroberto	u_char reqid;		/* JUPITER_REQID_MASK bits available as id */
5254359Sroberto	u_char flags;		/* flags */
5354359Sroberto	u_short hsum;		/* header cksum */
5454359Sroberto};
5554359Sroberto
5654359Sroberto#define JUPITER_REQID_MASK	0x3f	/* bits available as id */
5754359Sroberto#define JUPITER_FLAG_NAK	0x01	/* negative acknowledgement */
5854359Sroberto#define JUPITER_FLAG_ACK	0x02	/* acknowledgement */
5954359Sroberto#define JUPITER_FLAG_REQUEST	0x04	/* request ACK or NAK */
6054359Sroberto#define JUPITER_FLAG_QUERY	0x08	/* request one shot output message */
6154359Sroberto#define JUPITER_FLAG_LOG	0x20	/* request periodic output message */
6254359Sroberto#define JUPITER_FLAG_CONN	0x40	/* enable periodic message */
6354359Sroberto#define JUPITER_FLAG_DISC	0x80	/* disable periodic message */
6454359Sroberto
6554359Sroberto#define JUPITER_H_FLAG_BITS \
6654359Sroberto    "\020\1NAK\2ACK\3REQUEST\4QUERY\5MBZ\6LOG\7CONN\10DISC"
6754359Sroberto
6854359Sroberto/* Log request messages (data payload when using JUPITER_FLAG_LOG) */
6954359Srobertostruct jrequest {
7054359Sroberto	u_short trigger;		/* if 0, trigger on time trigger on
7154359Sroberto					   update (e.g. new almanac) */
7254359Sroberto	u_short interval;		/* frequency in seconds */
7354359Sroberto	u_short offset;			/* offset into minute */
7454359Sroberto	u_short dsum;			/* checksum */
7554359Sroberto};
7654359Sroberto
7754359Sroberto/* JUPITER_O_GPOS (1000) */
7854359Srobertostruct jgpos {
7954359Sroberto	u_short stime[2];		/* set time (10 ms ticks) */
8054359Sroberto	u_short seq;			/* sequence number */
8154359Sroberto	u_short sseq;			/* sat measurement sequence number */
8254359Sroberto	u_short navval;			/* navigation soltuion validity */
8354359Sroberto	u_short navtype;		/* navigation solution type */
8454359Sroberto	u_short nmeas;			/* # of measurements used in solution */
8554359Sroberto	u_short polar;			/* if 1 then polar navigation */
8654359Sroberto	u_short gweek;			/* GPS week number */
8754359Sroberto	u_short sweek[2];		/* GPS seconds into week */
8854359Sroberto	u_short nsweek[2];		/* GPS nanoseconds into second */
8954359Sroberto	u_short utcday;			/* 1 to 31 */
9054359Sroberto	u_short utcmon;			/* 1 to 12 */
9154359Sroberto	u_short utcyear;		/* 1980 to 2079 */
9254359Sroberto	u_short utchour;		/* 0 to 23 */
9354359Sroberto	u_short utcmin;			/* 0 to 59 */
9454359Sroberto	u_short utcsec;			/* 0 to 59 */
9554359Sroberto	u_short utcnsec[2];		/* 0 to 999999999 */
9654359Sroberto	u_short lat[2];			/* latitude (radians) */
9754359Sroberto	u_short lon[2];			/* longitude (radians) */
9854359Sroberto	u_short height[2];		/* height (meters) */
9954359Sroberto	u_short gsep;			/* geoidal separation */
10054359Sroberto	u_short speed[2];		/* ground speed (meters/sec) */
10154359Sroberto	u_short course;			/* true course (radians) */
10254359Sroberto	u_short mvar;
10354359Sroberto	u_short climb;
10454359Sroberto	u_short mapd;
10554359Sroberto	u_short herr[2];
10654359Sroberto	u_short verr[2];
10754359Sroberto	u_short terr[2];
10854359Sroberto	u_short hverr;
10954359Sroberto	u_short bias[2];
11054359Sroberto	u_short biassd[2];
11154359Sroberto	u_short drift[2];
11254359Sroberto	u_short driftsd[2];
11354359Sroberto	u_short dsum;			/* checksum */
11454359Sroberto};
11554359Sroberto#define JUPITER_O_GPOS_NAV_NOALT	0x01	/* altitude used */
11654359Sroberto#define JUPITER_O_GPOS_NAV_NODGPS	0x02	/* no differential GPS */
11754359Sroberto#define JUPITER_O_GPOS_NAV_NOSAT	0x04	/* not enough satellites */
11854359Sroberto#define JUPITER_O_GPOS_NAV_MAXH		0x08	/* exceeded max EHPE */
11954359Sroberto#define JUPITER_O_GPOS_NAV_MAXV		0x10	/* exceeded max EVPE */
12054359Sroberto
12154359Sroberto/* JUPITER_O_CHAN (1002) */
12254359Srobertostruct jchan {
12354359Sroberto	u_short stime[2];		/* set time (10 ms ticks) */
12454359Sroberto	u_short seq;			/* sequence number */
12554359Sroberto	u_short sseq;			/* sat measurement sequence number */
12654359Sroberto	u_short gweek;			/* GPS week number */
12754359Sroberto	u_short sweek[2];		/* GPS seconds into week */
12854359Sroberto	u_short gpsns[2];		/* GPS nanoseconds from epoch */
12954359Sroberto	struct jchan2 {
13054359Sroberto		u_short flags;		/* flags */
13154359Sroberto		u_short prn;		/* satellite PRN */
13254359Sroberto		u_short chan;		/* channel number */
13354359Sroberto	} sat[12];
13454359Sroberto	u_short dsum;
13554359Sroberto};
13654359Sroberto
13754359Sroberto/* JUPITER_O_VIS (1003) */
13854359Srobertostruct jvis {
13954359Sroberto	u_short stime[2];		/* set time (10 ms ticks) */
14054359Sroberto	u_short seq;			/* sequence number */
14154359Sroberto	u_short gdop;			/* best possible GDOP */
14254359Sroberto	u_short pdop;			/* best possible PDOP */
14354359Sroberto	u_short hdop;			/* best possible HDOP */
14454359Sroberto	u_short vdop;			/* best possible VDOP */
14554359Sroberto	u_short tdop;			/* best possible TDOP */
14654359Sroberto	u_short nvis;			/* number of visible satellites */
14754359Sroberto	struct jvis2 {
14854359Sroberto		u_short prn;		/* satellite PRN */
14954359Sroberto		u_short azi;		/* satellite azimuth (radians) */
15054359Sroberto		u_short elev;		/* satellite elevation (radians) */
15154359Sroberto	} sat[12];
15254359Sroberto	u_short dsum;			/* checksum */
15354359Sroberto};
15454359Sroberto
15554359Sroberto/* JUPITER_O_ID (1011) */
15654359Srobertostruct jid {
15754359Sroberto	u_short stime[2];		/* set time (10 ms ticks) */
15854359Sroberto	u_short seq;			/* sequence number */
15954359Sroberto	char chans[20];			/* number of channels (ascii) */
16054359Sroberto	char vers[20];			/* software version (ascii) */
16154359Sroberto	char date[20];			/* software date (ascii) */
16254359Sroberto	char opts[20];			/* software options (ascii) */
16354359Sroberto	char reserved[20];
16454359Sroberto	u_short dsum;			/* checksum */
16554359Sroberto};
16654359Sroberto
16754359Sroberto/* JUPITER_O_USER (1012) */
16854359Srobertostruct juser {
16954359Sroberto	u_short stime[2];		/* set time (10 ms ticks) */
17054359Sroberto	u_short seq;			/* sequence number */
17154359Sroberto	u_short status;			/* operatinoal status */
17254359Sroberto	u_short coldtmo;		/* cold start time-out */
17354359Sroberto	u_short dgpstmo;		/* DGPS correction time-out*/
17454359Sroberto	u_short emask;			/* elevation mask */
17554359Sroberto	u_short selcand[2];		/* selected candidate */
17654359Sroberto	u_short solflags;		/* solution validity criteria */
17754359Sroberto	u_short nsat;			/* number of satellites in track */
17854359Sroberto	u_short herr[2];		/* minimum expected horizontal error */
17954359Sroberto	u_short verr[2];		/* minimum expected vertical error */
18054359Sroberto	u_short platform;		/* application platform */
18154359Sroberto	u_short dsum;			/* checksum */
18254359Sroberto};
18354359Sroberto
18454359Sroberto/* JUPITER_O_PULSE (1108) */
18554359Srobertostruct jpulse {
18654359Sroberto	u_short stime[2];		/* set time (10 ms ticks) */
18754359Sroberto	u_short seq;			/* sequence number */
18854359Sroberto	u_short reserved[5];
18954359Sroberto	u_short sweek[2];		/* GPS seconds into week */
19054359Sroberto	short offs;			/* GPS to UTC time offset (seconds) */
19154359Sroberto	u_short offns[2];		/* GPS to UTC offset (nanoseconds) */
19254359Sroberto	u_short flags;			/* flags */
19354359Sroberto	u_short dsum;			/* checksum */
19454359Sroberto};
19554359Sroberto#define JUPITER_O_PULSE_VALID		0x1	/* time mark validity */
19654359Sroberto#define JUPITER_O_PULSE_UTC		0x2	/* GPS/UTC sync */
19754359Sroberto
19854359Sroberto/* JUPITER_O_EUP (1135) */
19954359Srobertostruct jeup {
20054359Sroberto	u_short stime[2];		/* set time (10 ms ticks) */
20154359Sroberto	u_short seq;			/* sequence number */
20254359Sroberto	u_char dataid;			/* data id */
20354359Sroberto	u_char prn;			/* satellite PRN */
20454359Sroberto	u_short dsum;			/* checksum */
20554359Sroberto};
20654359Sroberto
20754359Sroberto/* JUPITER_I_RESTART (1303) */
20854359Srobertostruct jrestart {
20954359Sroberto	u_short seq;			/* sequence number */
21054359Sroberto	u_short flags;
21154359Sroberto	u_short dsum;			/* checksum */
21254359Sroberto};
21354359Sroberto#define JUPITER_I_RESTART_INVRAM	0x01
21454359Sroberto#define JUPITER_I_RESTART_INVEEPROM	0x02
21554359Sroberto#define JUPITER_I_RESTART_INVRTC	0x04
21654359Sroberto#define JUPITER_I_RESTART_COLD		0x80
21754359Sroberto
21854359Sroberto/* JUPITER_I_PVTINIT (1200) */
21954359Srobertostruct jpvtinit {
22054359Sroberto	u_short flags;
22154359Sroberto	u_short gweek;			/* GPS week number */
22254359Sroberto	u_short sweek[2];		/* GPS seconds into week */
22354359Sroberto	u_short utcday;			/* 1 to 31 */
22454359Sroberto	u_short utcmon;			/* 1 to 12 */
22554359Sroberto	u_short utcyear;		/* 1980 to 2079 */
22654359Sroberto	u_short utchour;		/* 0 to 23 */
22754359Sroberto	u_short utcmin;			/* 0 to 59 */
22854359Sroberto	u_short utcsec;			/* 0 to 59 */
22954359Sroberto	u_short lat[2];			/* latitude (radians) */
23054359Sroberto	u_short lon[2];			/* longitude (radians) */
23154359Sroberto	u_short height[2];		/* height (meters) */
23254359Sroberto	u_short speed[2];		/* ground speed (meters/sec) */
23354359Sroberto	u_short course;			/* true course (radians) */
23454359Sroberto	u_short climb;
23554359Sroberto	u_short dsum;
23654359Sroberto};
23754359Sroberto#define JUPITER_I_PVTINIT_FORCE		0x01
23854359Sroberto#define JUPITER_I_PVTINIT_GPSVAL	0x02
23954359Sroberto#define JUPITER_I_PVTINIT_UTCVAL	0x04
24054359Sroberto#define JUPITER_I_PVTINIT_POSVAL	0x08
24154359Sroberto#define JUPITER_I_PVTINIT_ALTVAL	0x10
24254359Sroberto#define JUPITER_I_PVTINIT_SPDVAL	0x12
24354359Sroberto#define JUPITER_I_PVTINIT_MAGVAL	0x14
24454359Sroberto#define JUPITER_I_PVTINIT_CLIMBVAL	0x18
24554359Sroberto
24654359Sroberto/* JUPITER_I_PLAT (1220) */
24754359Srobertostruct jplat {
24854359Sroberto	u_short seq;			/* sequence number */
24954359Sroberto	u_short platform;		/* application platform */
25054359Sroberto	u_short dsum;
25154359Sroberto};
25254359Sroberto#define JUPITER_I_PLAT_DEFAULT		0	/* default dynamics */
25354359Sroberto#define JUPITER_I_PLAT_LOW		2	/* pedestrian */
25454359Sroberto#define JUPITER_I_PLAT_MED		5	/* land (e.g. automobile) */
25554359Sroberto#define JUPITER_I_PLAT_HIGH		6	/* air */
256