diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2008-07-15 21:55:59 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2008-07-15 21:55:59 +0000 |
commit | c4e6423756b105aeeedc7cabe0e379d4c77dda4f (patch) | |
tree | 8a03bab1c9cde685b583028cb9613ad831c6d998 /navcom.c | |
parent | 9ec735023de52f140845e64dbbb4e5328ef7769a (diff) | |
download | gpsd-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.c | 190 |
1 files changed, 95 insertions, 95 deletions
@@ -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", |