summaryrefslogtreecommitdiff
path: root/navcom.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2008-07-15 21:55:59 +0000
committerEric S. Raymond <esr@thyrsus.com>2008-07-15 21:55:59 +0000
commitc4e6423756b105aeeedc7cabe0e379d4c77dda4f (patch)
tree8a03bab1c9cde685b583028cb9613ad831c6d998 /navcom.c
parent9ec735023de52f140845e64dbbb4e5328ef7769a (diff)
downloadgpsd-c4e6423756b105aeeedc7cabe0e379d4c77dda4f.tar.gz
Rename the little-endian bit-unpacking macros to be explicit about their LEness.
Diffstat (limited to 'navcom.c')
-rw-r--r--navcom.c190
1 files changed, 95 insertions, 95 deletions
diff --git a/navcom.c b/navcom.c
index 108a7e51..d0c8467b 100644
--- a/navcom.c
+++ b/navcom.c
@@ -50,24 +50,24 @@
#include "bits.h"
/* Have data which is 24 bits long */
-#define getsl24(buf,off) (int32_t)(((u_int32_t)getub((buf), (off)+2)<<24 | (u_int32_t)getub((buf), (off)+1)<<16 | (u_int32_t)getub((buf), (off))<<8)>>8)
-#define getul24(buf,off) (u_int32_t)(((u_int32_t)getub((buf), (off)+2)<<24 | (u_int32_t)getub((buf), (off)+1)<<16 | (u_int32_t)getub((buf), (off))<<8)>>8)
+#define getlesl24(buf,off) (int32_t)(((u_int32_t)getub((buf), (off)+2)<<24 | (u_int32_t)getub((buf), (off)+1)<<16 | (u_int32_t)getub((buf), (off))<<8)>>8)
+#define getleul24(buf,off) (u_int32_t)(((u_int32_t)getub((buf), (off)+2)<<24 | (u_int32_t)getub((buf), (off)+1)<<16 | (u_int32_t)getub((buf), (off))<<8)>>8)
/* And just to be difficult, Navcom is little endian but the GPS data stream
is big endian. Some messages contain raw GPS data */
-#define getsw_be(buf, off) (int16_t)((((u_int16_t)getub(buf, (off)) << 8) \
+#define getlesw_be(buf, off) (int16_t)((((u_int16_t)getub(buf, (off)) << 8) \
| (u_int16_t)getub(buf, (off)+1)))
-#define getuw_be(buf, off) (u_int16_t)((((u_int16_t)getub(buf, (off)) << 8) \
+#define getleuw_be(buf, off) (u_int16_t)((((u_int16_t)getub(buf, (off)) << 8) \
| (u_int16_t)getub(buf, (off)+1)))
-#define getsl_be(buf, off) (int32_t)((((u_int16_t)getuw_be(buf, (off)) << 16) \
- | getuw_be(buf, (off)+2)))
-#define getul_be(buf, off) (u_int32_t)((((u_int16_t)getuw_be(buf, (off)) << 16) \
- | getuw_be(buf, (off)+2)))
-#define getsL_be(buf, off) (int64_t)((((u_int64_t)getul_be(buf, (off)) << 32) \
- | getul_be(buf, (off)+4)))
-#define getuL_be(buf, off) (u_int64_t)((((u_int64_t)getul_be(buf, (off)) << 32) \
- | getul_be(buf, (off)+4)))
-#define getsl24_be(buf,off) (int32_t)(((u_int32_t)getub((buf), (off))<<24 \
+#define getlesl_be(buf, off) (int32_t)((((u_int16_t)getleuw_be(buf, (off)) << 16) \
+ | getleuw_be(buf, (off)+2)))
+#define getleul_be(buf, off) (u_int32_t)((((u_int16_t)getleuw_be(buf, (off)) << 16) \
+ | getleuw_be(buf, (off)+2)))
+#define getlesL_be(buf, off) (int64_t)((((u_int64_t)getleul_be(buf, (off)) << 32) \
+ | getleul_be(buf, (off)+4)))
+#define getleuL_be(buf, off) (u_int64_t)((((u_int64_t)getleul_be(buf, (off)) << 32) \
+ | getleul_be(buf, (off)+4)))
+#define getlesl24_be(buf,off) (int32_t)(((u_int32_t)getub((buf), (off))<<24 \
| (u_int32_t)getub((buf), (off)+1)<<16 \
| (u_int32_t)getub((buf), (off)+2)<<8)>>8)
@@ -96,15 +96,15 @@ static void navcom_cmd_0x20(struct gps_device_t *session, u_int8_t block_id, u_i
putbyte(msg, 1, 0x99);
putbyte(msg, 2, 0x66);
putbyte(msg, 3, 0x20); /* Cmd ID */
- putword(msg, 4, 0x000e); /* Length */
+ putleword(msg, 4, 0x000e); /* Length */
putbyte(msg, 6, 0x00); /* Action */
putbyte(msg, 7, 0x01); /* Count of blocks */
putbyte(msg, 8, block_id); /* Data Block ID */
putbyte(msg, 9, 0x02); /* Logical Ports */
- putword(msg, 10, rate); /* Data rate */
+ putleword(msg, 10, rate); /* Data rate */
putbyte(msg, 12, 0x71);
putbyte(msg, 13, 0x00);
- putword(msg, 14, 0x0000);
+ putleword(msg, 14, 0x0000);
putbyte(msg, 16, checksum(msg+3, 13));
putbyte(msg, 17, 0x03);
(void)navcom_send_cmd(session, msg, 18);
@@ -123,7 +123,7 @@ static void UNUSED navcom_cmd_0x3f(struct gps_device_t *session)
putbyte(msg, 1, 0x99);
putbyte(msg, 2, 0x66);
putbyte(msg, 3, 0x3f); /* Cmd ID */
- putword(msg, 4, 0x0008);
+ putleword(msg, 4, 0x0008);
putbyte(msg, 6, 0x01); /* Action */
putbyte(msg, 7, 0x00); /* Reserved */
putbyte(msg, 8, 0x02); /* Link LED setting */
@@ -143,7 +143,7 @@ static void navcom_cmd_0x1c(struct gps_device_t *session, u_int8_t mode, u_int8_
putbyte(msg, 1, 0x99);
putbyte(msg, 2, 0x66);
putbyte(msg, 3, 0x1c); /* Cmd ID */
- putword(msg, 4, 0x0008);
+ putleword(msg, 4, 0x0008);
putbyte(msg, 6, 0x04); /* Use ACK/NAK */
putbyte(msg, 7, mode); /* 0x01 or 0x02 */
putbyte(msg, 8, length); /* Only if mode == 0x01 */
@@ -168,7 +168,7 @@ static void navcom_cmd_0x11(struct gps_device_t *session, u_int8_t port_selectio
putbyte(msg, 1, 0x99);
putbyte(msg, 2, 0x66);
putbyte(msg, 3, 0x11); /* Cmd ID */
- putword(msg, 4, 0x0008); /* Length */
+ putleword(msg, 4, 0x0008); /* Length */
putbyte(msg, 6, 0x04); /* Action - Use ACK/NAK) */
putbyte(msg, 7, port_selection);
putbyte(msg, 8, 0x00); /* Reserved */
@@ -315,8 +315,8 @@ static gps_mask_t handle_0x83(struct gps_device_t *session)
/* 2^16 */
#define SF_BETA3 (65536)
unsigned char *buf = session->packet.outbuffer + 3;
- u_int16_t week = getuw(buf, 3);
- u_int32_t tow = getul(buf, 5);
+ u_int16_t week = getleuw(buf, 3);
+ u_int32_t tow = getleul(buf, 5);
int8_t alpha0 = getsb(buf, 9);
int8_t alpha1 = getsb(buf, 10);
int8_t alpha2 = getsb(buf, 11);
@@ -325,8 +325,8 @@ static gps_mask_t handle_0x83(struct gps_device_t *session)
int8_t beta1 = getsb(buf, 14);
int8_t beta2 = getsb(buf, 15);
int8_t beta3 = getsb(buf, 16);
- int32_t a1 = getsl(buf, 17);
- int32_t a0 = getsl(buf, 21);
+ int32_t a1 = getlesl(buf, 17);
+ int32_t a0 = getlesl(buf, 21);
u_int8_t tot = getub(buf, 25);
u_int8_t wnt = getub(buf, 26);
int8_t dtls = getsb(buf, 27);
@@ -408,7 +408,7 @@ static gps_mask_t handle_0x15(struct gps_device_t *session)
{
size_t n;
unsigned char *buf = session->packet.outbuffer + 3;
- size_t msg_len = (size_t)getuw(buf, 1);
+ size_t msg_len = (size_t)getleuw(buf, 1);
/*@ -type @*/
u_int8_t port, cmd_id = getub(buf, 3);
gpsd_report(LOG_PROG,
@@ -473,12 +473,12 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
#endif /* __UNUSED__ */
/* Timestamp */
- week = (uint16_t)getuw(buf, 3);
- tow = (uint32_t)getul(buf, 5);
+ week = (uint16_t)getleuw(buf, 3);
+ tow = (uint32_t)getleul(buf, 5);
session->gpsdata.fix.time = session->gpsdata.sentence_time = gpstime_to_unix((int)week, tow/1000.0) - session->context->leap_seconds;
/* Satellites used */
- sats_used = (uint32_t)getul(buf, 9);
+ sats_used = (uint32_t)getleul(buf, 9);
session->gpsdata.satellites_used = 0;
for (n = 0; n < 31; n++) {
if ((sats_used & (0x01 << n)) != 0)
@@ -486,8 +486,8 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
}
/* Get latitude, longitude */
- lat = getsl(buf, 13);
- lon = getsl(buf, 17);
+ lat = getlesl(buf, 13);
+ lon = getlesl(buf, 17);
lat_fraction = (uint8_t)(getub(buf, 21) >> 4);
lon_fraction = (uint8_t)(getub(buf, 21) & 0x0f);
@@ -505,11 +505,11 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
}
/* Height Data */
- ellips_height = getsl(buf, 23);
- altitude = getsl(buf, 27);
+ ellips_height = getlesl(buf, 23);
+ altitude = getlesl(buf, 27);
- ant_height_adj = getsw(buf, 51);
- set_delta_up = getsl(buf, 79);
+ ant_height_adj = getlesw(buf, 51);
+ set_delta_up = getlesl(buf, 79);
session->gpsdata.fix.altitude = (double)(altitude * EL_RES)
+ (ant_height_adj * D_RES) + (set_delta_up * D_RES);
@@ -517,10 +517,10 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
+ (ant_height_adj * D_RES) + (set_delta_up * D_RES);
/* Speed Data */
- vel_north = (double)getsl24(buf, 31);
- vel_east = (double)getsl24(buf, 34);
- /* vel_up = getsl24(buf, 37); */
- vel_up = (double)getsl24(buf, 37);
+ vel_north = (double)getlesl24(buf, 31);
+ vel_east = (double)getlesl24(buf, 34);
+ /* vel_up = getlesl24(buf, 37); */
+ vel_up = (double)getlesl24(buf, 37);
track = atan2(vel_east, vel_north);
if (track < 0)
@@ -654,13 +654,13 @@ static gps_mask_t handle_0x81(struct gps_device_t *session)
unsigned char *buf = session->packet.outbuffer + 3;
u_int8_t prn = getub(buf, 3);
- u_int16_t week = getuw(buf, 4);
- u_int32_t tow = getul(buf, 6);
- u_int16_t iodc = getuw(buf, 10);
+ u_int16_t week = getleuw(buf, 4);
+ u_int32_t tow = getleul(buf, 6);
+ u_int16_t iodc = getleuw(buf, 10);
/* And now the fun starts... everything that follows is
raw GPS data minus parity */
/* Subframe 1, words 3 to 10 minus parity */
- u_int16_t wn = (getuw_be(buf, 12)&0xffc0)>>6;
+ u_int16_t wn = (getleuw_be(buf, 12)&0xffc0)>>6;
u_int8_t cl2 = (getub(buf, 13)&0x30)>>4;
u_int8_t ura = getub(buf, 13)&0x0f;
u_int8_t svh = (getub(buf, 14)&0xfc)>>2;
@@ -670,35 +670,35 @@ static gps_mask_t handle_0x81(struct gps_device_t *session)
u_int8_t l2pd = (getub(buf, 15)&0x80)>>7;
int8_t tgd = getsb(buf, 26);
/* iodc |= getub(buf, 27);*/
- u_int16_t toc = getuw_be(buf, 28);
+ u_int16_t toc = getleuw_be(buf, 28);
int8_t af2 = getsb(buf, 30);
- int16_t af1 = getsw_be(buf, 31);
+ int16_t af1 = getlesw_be(buf, 31);
/*@ -shiftimplementation @*/
- int32_t af0 = getsl24_be(buf, 33)>>2;
+ int32_t af0 = getlesl24_be(buf, 33)>>2;
/*@ +shiftimplementation @*/
/* Subframe 2, words 3 to 10 minus parity */
u_int8_t iode = getub(buf, 36);
- int16_t crs = getsw_be(buf, 37);
- int16_t delta_n = getsw_be(buf, 39);
- int32_t m0 = getsl_be(buf, 41);
- int16_t cuc = getsw_be(buf, 45);
- u_int32_t e = getul_be(buf, 47);
- int16_t cus = getsw_be(buf, 51);
- u_int32_t sqrt_a = getul_be(buf, 53);
- u_int16_t toe = getuw_be(buf, 57);
+ int16_t crs = getlesw_be(buf, 37);
+ int16_t delta_n = getlesw_be(buf, 39);
+ int32_t m0 = getlesl_be(buf, 41);
+ int16_t cuc = getlesw_be(buf, 45);
+ u_int32_t e = getleul_be(buf, 47);
+ int16_t cus = getlesw_be(buf, 51);
+ u_int32_t sqrt_a = getleul_be(buf, 53);
+ u_int16_t toe = getleuw_be(buf, 57);
/* NOTE - Fit interval & AODO not collected */
/* Subframe 3, words 3 to 10 minus parity */
- int16_t cic = getsw_be(buf, 60);
- int32_t Omega0 = getsl_be(buf, 62);
- int16_t cis = getsw_be(buf, 66);
- int32_t i0 = getsl_be(buf, 68);
- int16_t crc = getsw_be(buf, 72);
- int32_t omega = getsl_be(buf, 74);
- int32_t Omegadot = getsl24_be(buf, 78);
+ int16_t cic = getlesw_be(buf, 60);
+ int32_t Omega0 = getlesl_be(buf, 62);
+ int16_t cis = getlesw_be(buf, 66);
+ int32_t i0 = getlesl_be(buf, 68);
+ int16_t crc = getlesw_be(buf, 72);
+ int32_t omega = getlesl_be(buf, 74);
+ int32_t Omegadot = getlesl24_be(buf, 78);
/*@ -predboolothers @*/
/* Question: What is the proper way of shifting a signed int 2 bits to
* the right, preserving sign? Answer: integer division by 4. */
- int16_t idot = (int16_t)(((getsw_be(buf, 82)&0xfffc)/4)|(getub(buf, 82)&80?0xc000:0x0000));
+ int16_t idot = (int16_t)(((getlesw_be(buf, 82)&0xfffc)/4)|(getub(buf, 82)&80?0xc000:0x0000));
/*@ +predboolothers @*/
char time_str[24];
(void)unix_to_iso8601(gpstime_to_unix((int)wn, (double)(toc*SF_TOC)), time_str, sizeof(time_str));
@@ -764,11 +764,11 @@ static gps_mask_t handle_0x86(struct gps_device_t *session)
u_int8_t prn, tracking_status, ele, ca_snr, p2_snr, log_channel, hw_channel;
u_int16_t azm, dgps_age;
unsigned char *buf = session->packet.outbuffer + 3;
- size_t msg_len = (size_t)getuw(buf, 1);
- u_int16_t week = getuw(buf, 3);
- u_int32_t tow = getul(buf, 5);
+ size_t msg_len = (size_t)getleuw(buf, 1);
+ u_int16_t week = getleuw(buf, 3);
+ u_int32_t tow = getleul(buf, 5);
u_int8_t eng_status = getub(buf, 9);
- u_int16_t sol_status = getuw(buf, 10);
+ u_int16_t sol_status = getleuw(buf, 10);
u_int8_t sats_visible = getub(buf, 12);
u_int8_t sats_tracked = getub(buf, 13);
u_int8_t sats_used = getub(buf, 14);
@@ -820,10 +820,10 @@ static gps_mask_t handle_0x86(struct gps_device_t *session)
tracking_status = getub(buf, n+1);
log_channel = getub(buf, n+2);
ele = getub(buf, n+5);
- azm = getuw(buf, n+6);
+ azm = getleuw(buf, n+6);
ca_snr = getub(buf, n+8);
p2_snr = getub(buf, n+10);
- dgps_age = getuw(buf, n+11);
+ dgps_age = getleuw(buf, n+11);
hw_channel = getub(buf, n+13);
/*@ -predboolothers +charint @*/
/* NOTE - In theory, I think one would check for hw channel number to
@@ -861,9 +861,9 @@ static gps_mask_t handle_0xb0(struct gps_device_t *session)
#define LAMBDA_L1 (.190293672798364880476317426464)
size_t n;
unsigned char *buf = session->packet.outbuffer + 3;
- size_t msg_len = (size_t)getuw(buf, 1);
- u_int16_t week = getuw(buf, 3);
- u_int32_t tow = getul(buf, 5);
+ size_t msg_len = (size_t)getleuw(buf, 1);
+ u_int16_t week = getleuw(buf, 3);
+ u_int32_t tow = getleul(buf, 5);
u_int8_t tm_slew_acc = getub(buf, 9);
u_int8_t status = getub(buf, 10);
@@ -883,14 +883,14 @@ static gps_mask_t handle_0xb0(struct gps_device_t *session)
for (n=11; n<msg_len-1; n+=16) {
u_int8_t sv_status = getub(buf, n);
u_int8_t ch_status = getub(buf, n+1);
- u_int32_t ca_pseudorange = getul(buf, n+2);
+ u_int32_t ca_pseudorange = getleul(buf, n+2);
/* integer division by 16 is a sign-preserving right shift of 4 bits */
- int32_t l1_phase = getsl24(buf, n+6) / 16;
- u_int8_t l1_slips = (u_int8_t)(getsl24(buf, n+6) & 0x0f);
- int16_t p1_ca_pseudorange = getsw(buf, n+9);
- int16_t p2_ca_pseudorange = getsw(buf, n+11);
- int32_t l2_phase = getsl24(buf, n+13) / 16;
- u_int8_t l2_slips = (u_int8_t)(getsl24(buf, n+13) & 0x0f);
+ int32_t l1_phase = getlesl24(buf, n+6) / 16;
+ u_int8_t l1_slips = (u_int8_t)(getlesl24(buf, n+6) & 0x0f);
+ int16_t p1_ca_pseudorange = getlesw(buf, n+9);
+ int16_t p2_ca_pseudorange = getlesw(buf, n+11);
+ int32_t l2_phase = getlesl24(buf, n+13) / 16;
+ u_int8_t l2_slips = (u_int8_t)(getlesl24(buf, n+13) & 0x0f);
/*@ -predboolothers +charint @*/
double c1 = (sv_status&0x80? (double)ca_pseudorange/16.0*LAMBDA_L1 : NAN);
double l1 = (sv_status&0x80? (double)ca_pseudorange/16.0 + (double)l1_phase/256.0 : NAN);
@@ -922,20 +922,20 @@ static gps_mask_t handle_0xb5(struct gps_device_t *session)
if(sizeof(double) == 8) {
union long_double l_d;
unsigned char *buf = session->packet.outbuffer + 3;
- u_int16_t week = getuw(buf, 3);
- u_int32_t tow = getul(buf, 5);
- double rms = getd(buf, 9);
+ u_int16_t week = getleuw(buf, 3);
+ u_int32_t tow = getleul(buf, 5);
+ double rms = getled(buf, 9);
#ifdef __UNUSED__
/* Reason why it's unused is these figures do not agree
with those obtained from the PVT report (handle_0xb1).
The figures from 0xb1 do agree with the values reported
by Navcom's PC utility */
- double ellips_maj = getd(buf, 17);
- double ellips_min = getd(buf, 25);
- double ellips_azm = getd(buf, 33);
- double lat_sd = getd(buf, 41);
- double lon_sd = getd(buf, 49);
- double alt_sd = getd(buf, 57);
+ double ellips_maj = getled(buf, 17);
+ double ellips_min = getled(buf, 25);
+ double ellips_azm = getled(buf, 33);
+ double lat_sd = getled(buf, 41);
+ double lon_sd = getled(buf, 49);
+ double alt_sd = getled(buf, 57);
double hrms = sqrt(pow(lat_sd, 2) + pow(lon_sd, 2));
#endif /* __UNUSED__ */
session->gpsdata.epe = rms*1.96;
@@ -979,14 +979,14 @@ static gps_mask_t handle_0xae(struct gps_device_t *session)
{
char *engconfstr, *asicstr;
unsigned char *buf = session->packet.outbuffer + 3;
- size_t msg_len = (size_t)getuw(buf, 1);
+ size_t msg_len = (size_t)getleuw(buf, 1);
u_int8_t engconf = getub(buf, 3);
u_int8_t asic = getub(buf, 4);
u_int8_t swvermaj = getub(buf, 5);
u_int8_t swvermin = getub(buf, 6);
- u_int16_t dcser = getuw(buf, 7);
+ u_int16_t dcser = getleuw(buf, 7);
u_int8_t dcclass = getub(buf, 9);
- u_int16_t rfcser = getuw(buf, 10);
+ u_int16_t rfcser = getleuw(buf, 10);
u_int8_t rfcclass= getub(buf, 12);
/*@ -stringliteralnoroomfinalnull -type @*/
u_int8_t softtm[17] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
@@ -1107,8 +1107,8 @@ static gps_mask_t handle_0xae(struct gps_device_t *session)
static gps_mask_t handle_0xef(struct gps_device_t *session)
{
unsigned char *buf = session->packet.outbuffer + 3;
- u_int16_t week = getuw(buf, 3);
- u_int32_t tow = getul(buf, 5);
+ u_int16_t week = getleuw(buf, 3);
+ u_int32_t tow = getleul(buf, 5);
int8_t osc_temp = getsb(buf, 9);
u_int8_t nav_status = getub(buf, 10);
union long_double l_d;
@@ -1116,15 +1116,15 @@ static gps_mask_t handle_0xef(struct gps_device_t *session)
union int_float i_f;
float nav_clock_drift;
float osc_filter_drift_est;
- int32_t time_slew = (int32_t)getsl(buf, 27);
+ int32_t time_slew = (int32_t)getlesl(buf, 27);
if (sizeof(double) == 8) {
- nav_clock_offset = getd(buf, 11);
+ nav_clock_offset = getled(buf, 11);
} else {
nav_clock_offset = NAN;
}
if (sizeof(float) == 4) {
- nav_clock_drift = getf(buf, 19);
- osc_filter_drift_est = getf(buf, 23);
+ nav_clock_drift = getlef(buf, 19);
+ osc_filter_drift_est = getlef(buf, 23);
} else {
nav_clock_drift = NAN;
osc_filter_drift_est = NAN;
@@ -1157,7 +1157,7 @@ gps_mask_t navcom_parse(struct gps_device_t *session, unsigned char *buf, size_t
cmd_id = getub(buf, 3);
payload = &buf[6];
- msg_len = getuw(buf, 4);
+ msg_len = getleuw(buf, 4);
/*@ -usedef -compdef @*/
gpsd_report(LOG_RAW, "Navcom: packet type 0x%02x, length %d: %s\n",