251#define PI 3.1415926535897932
252#define D2R (PI / 180.0)
253#define R2D (180.0 / PI)
254#define CLIGHT 299792458.0
255#define SC2RAD 3.1415926535898
274#define FREQ1 1.57542E9
275#define FREQ2 1.22760E9
276#define FREQ5 1.17645E9
277#define FREQ6 1.27875E9
278#define FREQ7 1.20714E9
279#define FREQ8 1.191795E9
280#define FREQ9 2.492028E9
281#define FREQ1_GLO 1.60200E9
282#define DFRQ1_GLO 0.56250E6
283#define FREQ2_GLO 1.24600E9
284#define DFRQ2_GLO 0.43750E6
285#define FREQ3_GLO 1.202025E9
286#define FREQ1a_GLO 1.600995E9
287#define FREQ2a_GLO 1.248060E9
288#define FREQ1_CMP 1.561098E9
298#define P2_11 4.882812500000000E-04
299#define P2_15 3.051757812500000E-05
300#define P2_17 7.629394531250000E-06
301#define P2_19 1.907348632812500E-06
302#define P2_20 9.536743164062500E-07
303#define P2_21 4.768371582031250E-07
304#define P2_23 1.192092895507810E-07
305#define P2_24 5.960464477539063E-08
306#define P2_27 7.450580596923828E-09
307#define P2_29 1.862645149230957E-09
308#define P2_30 9.313225746154785E-10
309#define P2_31 4.656612873077393E-10
310#define P2_32 2.328306436538696E-10
311#define P2_33 1.164153218269348E-10
312#define P2_34 5.820766091346740E-11
313#define P2_35 2.910383045673370E-11
314#define P2_38 3.637978807091710E-12
315#define P2_40 9.094947017729280E-13
316#define P2_43 1.136868377216160E-13
317#define P2_46 1.421085471520200E-14
318#define P2_50 8.881784197001252E-16
319#define P2_55 2.775557561562891E-17
320#define P2_59 1.734723475976810E-18
325#define M_BIT0 (1 << 0)
326#define M_BIT1 (1 << 1)
327#define M_BIT2 (1 << 2)
328#define M_BIT3 (1 << 3)
329#define M_BIT4 (1 << 4)
330#define M_BIT5 (1 << 5)
331#define M_BIT6 (1 << 6)
332#define M_BIT7 (1 << 7)
333#define M_BIT8 (1 << 8)
334#define M_BIT9 (1 << 9)
335#define M_BIT10 (1 << 10)
336#define M_BIT11 (1 << 11)
337#define M_BIT12 (1 << 12)
338#define M_BIT13 (1 << 13)
339#define M_BIT14 (1 << 14)
340#define M_BIT15 (1 << 15)
346#define RETSVDATA 0x55
348#define MBUFF_LENGTH 8192
349#define PBUFF_LENGTH (4 + 255 + 2)
352#define M_CONCISE M_BIT0
353#define M_ENHANCED M_BIT1
356#define M_WEEK_OPTION M_BIT0
357#define M_WEEK_EPH M_BIT1
358#define M_WEEK_TIME M_BIT2
359#define M_WEEK_SCAN M_BIT3
362#define I1(p) (*((int8_t*)(p)))
363#define U1(p) (*((uint8_t*)(p)))
364#define I2(p) ReadI2(p)
365#define U2(p) ReadU2(p)
366#define I4(p) ReadI4(p)
367#define U4(p) ReadU4(p)
368#define R4(p) ReadR4(p)
369#define R8(p) ReadR8(p)
381 "Latitude Longitude Height",
383 "Local Datum LLH Position",
384 "Local Zone ENU Position",
386 "Tangent Plane Delta",
390 "Position VCV Information",
391 "Position Sigma Information",
392 "SV Brief Information",
393 "SV Detailed Information",
394 "Receiver Serial Number",
406 "Attitude Information",
412 "All SV Brief Information",
413 "All SV Detailed Information",
414 "Received Base Information",
416 "Battery and Memory Information",
419 "L-Band Status Information",
420 "Base Position and Quality Indicator"};
424 "Real-time GPS Survey Data, type 17",
425 "Position Record, type 11",
430 "Real-time GNSS Survey Data, type 27",
431 "Enhanced Position Record, type 29"};
439 "Disable Satellite, depreciated",
440 "Enable Satellite, depreciated",
442 "Extended GPS Almanac",
501static int16_t
ReadI2(uint8_t* p);
502static int32_t
ReadI4(uint8_t* p);
503static float ReadR4(uint8_t* p);
504static double ReadR8(uint8_t* p);
505static uint16_t
ReadU2(uint8_t* p);
506static uint32_t
ReadU4(uint8_t* p);
535 memset(rt17, 0,
sizeof(
rt17_t));
544 uint8_t *MessageBuffer = NULL, *PacketBuffer = NULL;
551 tracet(NULL, 0,
"RT17: unable to allocate RT17 dependent private data structure.\n");
557 tracet(NULL, 0,
"RT17: unable to allocate RT17 message buffer.\n");
564 tracet(NULL, 0,
"RT17: unable to allocate RT17 packet buffer.\n");
592 uint32_t Page, Pages, Reply;
624 tracet(NULL, 2,
"RT17: Prospective packet did not end with an ETX character. Some data lost.\n");
634 tracet(NULL, 2,
"RT17: Packet checksum failure. Packet discarded.\n");
651 if (PacketBuffer[2] ==
RAWDATA) {
652 Page = PacketBuffer[5] >> 4;
653 Pages = PacketBuffer[5] & 15;
654 Reply = PacketBuffer[6];
666 tracet(NULL, 2,
"RT17: First RAWDATA packet is not page #1. Packet discarded.\n");
671 rt17->
Reply = PacketBuffer[6];
672 }
else if ((Reply != rt17->
Reply) || (Page != (rt17->
Page + 1))) {
675 "RT17: RAWDATA packet sequence number mismatch or page out of order. %u RAWDATA packets discarded.\n",
684 tracet(NULL, 2,
"RT17: Buffer would overflow. %u RAWDATA packets discarded.\n", Page);
707 if (PacketBuffer[2] ==
GENOUT) {
708 Reply = PacketBuffer[4];
709 Page = PacketBuffer[5];
710 Pages = PacketBuffer[6];
722 tracet(NULL, 3,
"RT17: First GENOUT packet is not page #0. Packet discarded.\n");
727 rt17->
Reply = PacketBuffer[4];
728 }
else if ((Reply != rt17->
Reply) || (Page != (rt17->
Page + 1))) {
730 "RT17: GENOUT packet sequence number mismatch or page out of order. %u GENOUT packets discarded.\n",
739 tracet(NULL, 2,
"RT17: Buffer would overflow. %u GENOUT packets discarded.\n", Page);
766 tracet(NULL, 2,
"RT17: Packet is not GENOUT, RAWDATA or RETSVDATA. Packet discarded.\n");
786 for (i = 0; i < 4096; i++) {
787 if ((Data = fgetc(fp)) == EOF) {
812 uint8_t Checksum = 0;
813 uint8_t* p = &PacketBuffer[1];
814 uint32_t Length = PacketBuffer[3] + 3;
827 return (Checksum == *p);
835 for (i = 0; i < 4; i++) {
836 MessageBuffer[i] = 0;
848 for (i = 0; i < 4; i++) {
866 tracet(NULL, 3,
"DecodeBeidouEphemeris(); not yet implemented.\n");
872 int prn, sat, toc, tow;
879 tracet(NULL,2,
"RT17: RETSVDATA packet length %d < 182 bytes. GPS ephemeris packet discarded.\n", rt17->
PacketLength);
885 tracet(NULL,2,
"RT17: Beidou ephemeris satellite number error, PRN=%d.\n", prn);
896 eph.
tgd[0]=
R8(p+24);
942 if ((eph.
iodc >= 240) && (eph.
iodc <= 247))
944 else if (((eph.
iodc >= 248) && (eph.
iodc <= 255)) || (eph.
iodc == 496))
946 else if ((eph.
iodc >= 497) && (eph.
iodc <= 503))
948 else if ((eph.
iodc >= 504) && (eph.
iodc <= 510))
950 else if ((eph.
iodc == 511) || ((eph.
iodc >= 752) && (eph.
iodc <= 756)))
952 else if ((eph.
iodc >= 757) && (eph.
iodc <= 763))
954 else if (((eph.
iodc >= 764) && (eph.
iodc <= 767)) || ((eph.
iodc >= 1008) && (eph.
iodc <= 1010)))
956 else if ((eph.
iodc >= 1011) && (eph.
iodc <= 1020))
965 eph.
code = (Flags >> 1) & 3;
966 eph.
svh = (Flags >> 4) & 127;
967 eph.
sva = (Flags >> 11) & 15;
968 eph.
A = sqrtA * sqrtA;
973 tracet(NULL,3,
"RT17: DecodeBeidouEphemeris(); SAT=%d, IODC=%d, IODE=%d, WEEK=%d.\n", sat, eph.
iodc, eph.
iode, eph.
week);
974 if (!strstr(Raw->
opt,
"-EPHALL"))
980 Raw->
nav.
eph[sat-1] = eph;
997 tracet(NULL, 3,
"DecodeGalileoEphemeris(); not yet implemented.\n");
1003 int prn, sat, toc, tow;
1007 uint8_t SISA, MODEL1, MODEL2;
1008 uint16_t IODnav, HSDVS;
1013 tracet(NULL,2,
"RT17: RETSVDATA packet length %d < 190 bytes. Galileo ephemeris packet discarded.\n", rt17->
PacketLength);
1019 tracet(NULL,2,
"RT17: Galileo ephemeris satellite number error, PRN=%d.\n", prn);
1039 eph.
crc =
R8(p+107);
1040 eph.
omg =
R8(p+115);
1072 eph.
A = sqrtA * sqrtA;
1077 tracet(NULL,3,
"RT17: DecodeGalileoEphemeris(); SAT=%d, IODC=%d, IODE=%d, WEEK=%d.\n", sat, eph.
iodc, eph.
iode, eph.
week);
1078 if (!strstr(Raw->
opt,
"-EPHALL"))
1084 Raw->
nav.
eph[sat-1] = eph;
1101 tracet(NULL, 3,
"DecodeGLONASSEphemeris(); not yet implemented.\n");
1119 int prn, sat, toc, tow;
1120 uint32_t Flags, toe;
1127 tracet(NULL, 2,
"RT17: RETSVDATA packet length %d < 182 bytes. GPS ephemeris packet discarded.\n",
1135 tracet(NULL, 2,
"RT17: GPS ephemeris satellite number error, PRN=%d.\n", prn);
1146 eph.
tgd[0] =
R8(p + 24);
1147 eph.
f2 =
R8(p + 32);
1148 eph.
f1 =
R8(p + 40);
1149 eph.
f0 =
R8(p + 48);
1150 eph.
crs =
R8(p + 56);
1152 eph.
M0 =
R8(p + 72);
1153 eph.
cuc =
R8(p + 80);
1155 eph.
cus =
R8(p + 96);
1156 sqrtA =
R8(p + 104);
1157 eph.
cic =
R8(p + 112);
1159 eph.
cis =
R8(p + 128);
1160 eph.
i0 =
R8(p + 136);
1161 eph.
crc =
R8(p + 144);
1162 eph.
omg =
R8(p + 152);
1165 Flags =
U4(p + 176);
1195 if ((eph.
iodc >= 240) && (eph.
iodc <= 247)) {
1197 }
else if (((eph.
iodc >= 248) && (eph.
iodc <= 255)) || (eph.
iodc == 496)) {
1199 }
else if ((eph.
iodc >= 497) && (eph.
iodc <= 503)) {
1201 }
else if ((eph.
iodc >= 504) && (eph.
iodc <= 510)) {
1203 }
else if ((eph.
iodc == 511) || ((eph.
iodc >= 752) && (eph.
iodc <= 756))) {
1205 }
else if ((eph.
iodc >= 757) && (eph.
iodc <= 763)) {
1207 }
else if (((eph.
iodc >= 764) && (eph.
iodc <= 767)) || ((eph.
iodc >= 1008) && (eph.
iodc <= 1010))) {
1209 }
else if ((eph.
iodc >= 1011) && (eph.
iodc <= 1020)) {
1219 eph.
code = (Flags >> 1) & 3;
1220 eph.
svh = (Flags >> 4) & 127;
1221 eph.
sva = (Flags >> 11) & 15;
1223 eph.
A = sqrtA * sqrtA;
1230 tracet(NULL, 3,
"RT17: DecodeGPSEphemeris(); SAT=%d, IODC=%d, IODE=%d, WEEK=%d.\n", sat, eph.
iodc, eph.
iode,
1234 tracet(NULL, 2,
"RT17: Currently set or assumed GPS week does not match received ephemeris week.\n");
1235 tracet(NULL, 2,
"RT17: Set or assumed GPS week: %d Received ephemeris week: %d\n", rt17->
Week, eph.
week);
1241 tracet(NULL, 2,
"RT17: Initial GPS WEEK number unknown; WEEK number %d assumed for now.\n", eph.
week);
1243 tracet(NULL, 2,
"RT17: Changing assumed week number from %d to %d.\n", rt17->
Week, eph.
week);
1251 if (!strstr(Raw->
opt,
"-EPHALL")) {
1258 Raw->
nav.
eph[sat - 1] = eph;
1267 int InputLength, Ret = 0;
1268 uint8_t RecordLength, RecordType, *p;
1269 char* RecordType_s = NULL;
1280 while (InputLength) {
1282 RecordLength = p[1];
1284 if (RecordType < (
sizeof(
GSOFTable) /
sizeof(
char*))) {
1285 RecordType_s = (
char*)
GSOFTable[RecordType];
1288 if (!RecordType_s) {
1289 RecordType_s =
"Unknown";
1292 tracet(NULL, 3,
"RT17: Trimble packet type=0x40 (GENOUT), GSOF record type=%d (%s), Length=%d.\n", RecordType,
1293 RecordType_s, RecordLength);
1296 switch (RecordType) {
1316 tracet(NULL, 3,
"RT17: GSOF message not processed.\n");
1321 InputLength -= RecordLength;
1330 tracet(NULL, 2,
"RT17: GSOF Position Time message record length %d < 6 bytes. Record discarded.\n", p[1]);
1332 SetWeek(Raw,
I2(p + 6), ((
double)
I4(p + 2)) * 0.001);
1343 tracet(NULL, 2,
"RT17: GSOF ECEF Position record length %d < 24 bytes. Record discarded.\n", p[1]);
1345 sta->
pos[0] =
R8(p + 2);
1346 sta->
pos[1] =
R8(p + 10);
1347 sta->
pos[2] =
R8(p + 18);
1361 tracet(NULL, 2,
"RT17: GSOF Receiver Serial Number record length %d < 15 bytes. Record discarded.\n", p[1]);
1372 tracet(NULL, 2,
"RT17: GSOF Current Time message record length %d < 9 bytes. Record discarded.\n", p[1]);
1374 SetWeek(Raw,
I2(p + 6), ((
double)
I4(p + 2)) * 0.001);
1383 tracet(NULL, 2,
"RT17: GSOF Position Time UTC message record length %d < 6 bytes. Record discarded.\n", p[1]);
1385 SetWeek(Raw,
I2(p + 6), ((
double)
I4(p + 2)) * 0.001);
1395 "RT17: GSOF Base Position and Quality Indicator message record length %d < 6 bytes. Record discarded.\n",
1398 SetWeek(raw,
I2(p + 6), ((
double)
I4(p + 2)) * 0.001);
1420 double* ion_gps = nav->
ion_gps;
1421 double* utc_gps = nav->
utc_gps;
1426 tracet(NULL, 2,
"RT17: RETSVDATA packet length %d < 129 bytes. GPS ION / UTC data packet discarded.\n",
1434 ion_gps[0] =
R8(p + 6);
1435 ion_gps[1] =
R8(p + 14);
1436 ion_gps[2] =
R8(p + 22);
1437 ion_gps[3] =
R8(p + 30);
1438 ion_gps[4] =
R8(p + 38);
1439 ion_gps[5] =
R8(p + 46);
1440 ion_gps[6] =
R8(p + 54);
1441 ion_gps[7] =
R8(p + 62);
1442 utc_gps[0] =
R8(p + 70);
1443 utc_gps[1] =
R8(p + 78);
1444 utc_gps[2] =
R8(p + 86);
1446 utc_gps[4] =
R8(p + 94);
1468 tracet(NULL, 3,
"DecodeQZSSEphemeris(); not yet implemented.\n");
1474 int prn, sat, toc, tow;
1475 uint32_t Flags, toe;
1481 tracet(NULL,2,
"RT17: RETSVDATA packet length %d < 184 bytes. QZSS ephemeris packet discarded.\n", rt17->
PacketLength);
1487 tracet(NULL,2,
"RT17: QZSS ephemeris satellite number error, PRN=%d.\n", prn);
1499 eph.
tgd[0]=
R8(p+26);
1510 eph.
cic =
R8(p+114);
1512 eph.
cis =
R8(p+130);
1514 eph.
crc =
R8(p+146);
1515 eph.
omg =
R8(p+154);
1547 if ((eph.
iodc >= 240) && (eph.
iodc <= 247))
1549 else if (((eph.
iodc >= 248) && (eph.
iodc <= 255)) || (eph.
iodc == 496))
1551 else if ((eph.
iodc >= 497) && (eph.
iodc <= 503))
1553 else if ((eph.
iodc >= 504) && (eph.
iodc <= 510))
1555 else if ((eph.
iodc == 511) || ((eph.
iodc >= 752) && (eph.
iodc <= 756)))
1557 else if ((eph.
iodc >= 757) && (eph.
iodc <= 763))
1559 else if (((eph.
iodc >= 764) && (eph.
iodc <= 767)) || ((eph.
iodc >= 1008) && (eph.
iodc <= 1010)))
1561 else if ((eph.
iodc >= 1011) && (eph.
iodc <= 1020))
1570 eph.
code = (Flags >> 1) & 3;
1571 eph.
svh = (Flags >> 4) & 127;
1572 eph.
sva = (Flags >> 11) & 15;
1573 eph.
A = sqrtA * sqrtA;
1578 tracet(NULL,3,
"RT17: DecodeQZSSEphemeris(); SAT=%d, IODC=%d, IODE=%d, WEEK=%d.\n", sat, eph.
iodc, eph.
iode, eph.
week);
1579 if (!strstr(Raw->
opt,
"-EPHALL"))
1585 Raw->
nav.
eph[sat-1] = eph;
1605 char* RecordType_s = NULL;
1606 uint8_t RecordType = MessageBuffer[4];
1608 if (RecordType < (
sizeof(
RawdataTable) /
sizeof(
char*))) {
1612 if (!RecordType_s) {
1613 RecordType_s =
"Unknown";
1616 tracet(NULL, 3,
"RT17: Trimble packet type=0x57 (RAWDATA), Recordtype=%d (%s), Length=%d.\n", RecordType,
1626 switch (RecordType) {
1634 tracet(NULL, 3,
"RT17: Packet not processed.\n");
1654 char* Subtype_s = NULL;
1655 uint8_t Subtype = PacketBuffer[4];
1662 Subtype_s =
"Unknown";
1665 tracet(NULL, 3,
"RT17: Trimble packet type=0x55 (RETSVDATA), Subtype=%d (%s), Length=%d.\n", Subtype, Subtype_s,
1689 tracet(NULL, 3,
"RT17: Packet not processed.\n");
1709 double ClockOffset, tow;
1710 int Flags1, Flags2, FlagStatus, i, n, nsat, prn, Week;
1714 tow =
R8(p) * 0.001;
1716 ClockOffset =
R8(p) * 0.001;
1730 for (i = n = 0; (i < nsat) && (i <
MAXOBS); i++) {
1732 memset(obs, 0,
sizeof(
obsd_t));
1785 obs->
P[1] = obs->
P[0] +
R4(p);
1827 if (!(FlagStatus &
M_BIT0)) {
1869 obs->
P[1] = obs->
P[0] +
R8(p);
1890 if (obs->
P[0] == 0.0) {
1892 }
else if (Flags2 &
M_BIT0) {
1898 if (obs->
P[1] == 0.0) {
1900 }
else if (Flags2 &
M_BIT2) {
1902 }
else if (Flags2 &
M_BIT1) {
1915 if ((Flags2 &
M_BIT2) && (obs->
P[1] != 0.0)) {
1920 tracet(NULL, 2,
"RT17: Satellite number error, PRN=%d.\n", prn);
1926 if (ClockOffset != 0.0)
1930 obs->
L[0] += ClockOffset *
FREQ1;
1931 obs->
L[1] += ClockOffset *
FREQ2;
1941 tracet(NULL, 2,
"RT17: Observations output:\n");
1954 tracet(NULL, 2,
"RT17: Enhanced Position record block #1 length %d < 7 bytes. Record discarded.\n", *p);
1956 SetWeek(Raw,
I2(p + 1), ((
double)
I4(p + 3)) * 0.001);
1976 if ((Tow && rt17->
Tow) && (Tow < rt17->Tow)) {
1977 tracet(NULL, 2,
"RT17: GPS WEEK rolled over from %d to %d.\n", rt17->
Week, rt17->
Week + 1);
1985 char* opt = strstr(Raw->
opt,
"-WEEK=");
1990 if (!sscanf(opt + 6,
"%d", &Week) || (Week <= 0)) {
1991 tracet(NULL, 0,
"RT17: Invalid -WEEK=n receiver option value.\n");
1995 tracet(NULL, 2,
"RT17: Initial GPS WEEK explicitly set to %d by user.\n", Week, Week);
2015 tracet(NULL, 2,
"RT17: Initial GPS WEEK number unknown; WEEK number %d assumed for now.\n", Week);
2029 memcpy(&u.i2, p,
sizeof(u.i2));
2050 memcpy(&u.i4, p,
sizeof(u.i4));
2084 memcpy(&u.d, p,
sizeof(u.d));
2114 memcpy(&u.u2, p,
sizeof(u.u2));
2135 memcpy(&u.u4, p,
sizeof(u.u4));
2161 if (Week != rt17->
Week) {
2162 if (Week == (rt17->
Week + 1)) {
2163 tracet(NULL, 2,
"RT17: GPS WEEK rolled over from %d to %d.\n", rt17->
Week, Week);
2165 tracet(NULL, 2,
"RT17: GPS WEEK changed from %d to %d.\n", rt17->
Week, Week);
2169 tracet(NULL, 2,
"RT17: GPS WEEK initially set to %d.\n", Week);
2176 if (Week && (Tow != 0.0)) {
2185 PacketBuffer[0] = PacketBuffer[1];
2186 PacketBuffer[1] = PacketBuffer[2];
2187 PacketBuffer[2] = PacketBuffer[3];
2188 PacketBuffer[3] = Data;
2190 Type = PacketBuffer[2];
2212 uint8_t* p_out = p_in;
2213 uint32_t InputLength, InputLengthTotal = rt17->
MessageLength;
2214 uint32_t OutputLength, OutputLengthTotal = 0;
2216 while (InputLengthTotal > 0) {
2217 InputLength = p_in[3] + 6;
2218 OutputLength = p_in[3] - 3;
2219 memmove(p_out, p_in + 7, OutputLength);
2220 p_in += InputLength;
2221 p_out += OutputLength;
2222 OutputLengthTotal += OutputLength;
2223 InputLengthTotal -= InputLength;
2242 uint8_t* p_out = p_in;
2243 uint32_t InputLength, InputLengthTotal = rt17->
MessageLength;
2244 uint32_t OutputLength, OutputLengthTotal = 0;
2248 while (InputLengthTotal > 0) {
2249 if ((uint32_t)p_in[7] != *rif) {
2250 tracet(NULL, 2,
"RT17: Inconsistent Record Interpretation Flags within a single RAWDATA message.\n");
2253 InputLength = p_in[3] + 6;
2254 OutputLength = p_in[3] - 4;
2255 memmove(p_out, p_in + 8, OutputLength);
2256 p_in += InputLength;
2257 p_out += OutputLength;
2258 OutputLengthTotal += OutputLength;
2259 InputLengthTotal -= InputLength;
MRTKLIB Bits Module — Binary bit operations and CRC functions.
MRTKLIB Broadcast Ephemeris Module — Satellite orbit/clock types and Kepler/GLONASS/SBAS orbit comput...
MRTKLIB Matrix Module — Matrix/vector operations and estimation.
int satno(int sys, int prn)
Convert satellite system+prn/slot number to satellite number.
MRTKLIB Navigation Module — Navigation data types and satellite/nav utility functions.
MRTKLIB Observation Module — Observation data types and utility functions.
static float ReadR4(uint8_t *p)
static int DecodeGPSEphemeris(raw_t *Raw)
void free_rt17(raw_t *Raw)
int input_rt17f(raw_t *Raw, FILE *fp)
static int DecodeGSOF3(raw_t *Raw, uint8_t *p)
int init_rt17(raw_t *Raw)
static int DecodeQZSSEphemeris(raw_t *Raw)
static int DecodeType17(raw_t *Raw, uint32_t rif)
static double ReadR8(uint8_t *p)
static int CheckPacketChecksum(uint8_t *PacketBuffer)
static const char * GSOFTable[]
static int DecodeGSOF(raw_t *Raw)
static void UnwrapRawdata(rt17_t *rt17, uint32_t *rif)
static int DecodeGSOF15(raw_t *Raw, uint8_t *p)
static int DecodeRetsvdata(raw_t *Raw)
static int DecodeIONAndUTCData(raw_t *Raw)
static void UnwrapGenout(rt17_t *rt17)
static int DecodeGLONASSEphemeris(raw_t *Raw)
static int GetWeek(raw_t *Raw, double tow)
static int DecodeType29(raw_t *Raw)
static void ClearMessageBuffer(rt17_t *rt17)
static uint32_t ReadU4(uint8_t *p)
int input_rt17(raw_t *Raw, uint8_t Data)
static int DecodeGSOF41(raw_t *Raw, uint8_t *p)
static int SyncPacket(rt17_t *rt17, uint8_t Data)
static int32_t ReadI4(uint8_t *p)
static int DecodeGalileoEphemeris(raw_t *Raw)
static const char * RetsvdataTable[]
static int DecodeGSOF26(raw_t *Raw, uint8_t *p)
static void SetWeek(raw_t *Raw, int Week, double tow)
static int DecodeGSOF1(raw_t *Raw, uint8_t *p)
static int DecodeRawdata(raw_t *Raw)
static int DecodeGSOF16(raw_t *Raw, uint8_t *p)
static void ClearPacketBuffer(rt17_t *rt17)
static int DecodeBeidouEphemeris(raw_t *Raw)
static const char * RawdataTable[]
static uint16_t ReadU2(uint8_t *p)
static int16_t ReadI2(uint8_t *p)
MRTKLIB Receiver Raw Data Module — Receiver raw data types and decoder functions for various GNSS rec...
MRTKLIB RTCM Module — RTCM message types and functions.
MRTKLIB System Module — OS/filesystem utility functions.
gtime_t gst2time(int week, double sec)
Convert Galileo system time week/tow to gtime_t.
gtime_t bdt2time(int week, double sec)
Convert BeiDou time week/tow to gtime_t.
gtime_t gpst2time(int week, double sec)
Convert GPS week/tow to gtime_t.
double time2gpst(gtime_t t, int *week)
Convert gtime_t to GPS week/tow.
gtime_t bdt2gpst(gtime_t t)
Convert BeiDou time to GPS time.
gtime_t timeget(void)
Get current time in UTC.
MRTKLIB Time Module — GNSS time types and conversion functions.
void traceobs(mrtk_ctx_t *ctx, int level, const obsd_t *obs, int n)
Output trace observation data.
void tracet(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message with elapsed time.
MRTKLIB Trace Module — debug trace and logging functions.
GPS/GAL/QZS/BDS/IRN broadcast ephemeris type.
GNSS time representation.
Receiver raw data control type.