34#define PI 3.1415926535897932
35#define D2R (PI / 180.0)
36#define R2D (180.0 / PI)
37#define CLIGHT 299792458.0
38#define SC2RAD 3.1415926535898
57#define FREQ1 1.57542E9
58#define FREQ2 1.22760E9
59#define FREQ5 1.17645E9
60#define FREQ6 1.27875E9
61#define FREQ7 1.20714E9
62#define FREQ8 1.191795E9
63#define FREQ9 2.492028E9
64#define FREQ1_GLO 1.60200E9
65#define DFRQ1_GLO 0.56250E6
66#define FREQ2_GLO 1.24600E9
67#define DFRQ2_GLO 0.43750E6
68#define FREQ3_GLO 1.202025E9
69#define FREQ1a_GLO 1.600995E9
70#define FREQ2a_GLO 1.248060E9
71#define FREQ1_CMP 1.561098E9
81#define P2_11 4.882812500000000E-04
82#define P2_15 3.051757812500000E-05
83#define P2_17 7.629394531250000E-06
84#define P2_19 1.907348632812500E-06
85#define P2_20 9.536743164062500E-07
86#define P2_21 4.768371582031250E-07
87#define P2_23 1.192092895507810E-07
88#define P2_24 5.960464477539063E-08
89#define P2_27 7.450580596923828E-09
90#define P2_29 1.862645149230957E-09
91#define P2_30 9.313225746154785E-10
92#define P2_31 4.656612873077393E-10
93#define P2_32 2.328306436538696E-10
94#define P2_33 1.164153218269348E-10
95#define P2_34 5.820766091346740E-11
96#define P2_35 2.910383045673370E-11
97#define P2_38 3.637978807091710E-12
98#define P2_40 9.094947017729280E-13
99#define P2_43 1.136868377216160E-13
100#define P2_46 1.421085471520200E-14
101#define P2_50 8.881784197001252E-16
102#define P2_55 2.775557561562891E-17
103#define P2_59 1.734723475976810E-18
110#define ID_STQTIME 0xDC
111#define ID_STQRAW 0xDD
112#define ID_STQSVCH 0xDE
113#define ID_STQSTAT 0xDF
114#define ID_STQGPS 0xE0
115#define ID_STQGLO 0xE1
116#define ID_STQBDSD1 0xE2
117#define ID_STQBDSD2 0xE3
118#define ID_STQRAWX 0xE5
119#define ID_STQGLOE 0x5C
120#define ID_STQACK 0x83
121#define ID_STQNACK 0x84
123#define ID_RESTART 0x01
124#define ID_CFGSERI 0x05
125#define ID_CFGFMT 0x09
126#define ID_CFGRATE 0x12
127#define ID_CFGBIN 0x1E
128#define ID_GETGLOEPH 0x5B
131#define U1(p) (*((uint8_t*)(p)))
132#define I1(p) (*((int8_t*)(p)))
134static uint16_t
U2(uint8_t* p) {
136 uint8_t* q = (uint8_t*)&value + 1;
138 for (i = 0; i < 2; i++) {
143static uint32_t
U4(uint8_t* p) {
145 uint8_t* q = (uint8_t*)&value + 3;
147 for (i = 0; i < 4; i++) {
152static float R4(uint8_t* p) {
154 uint8_t* q = (uint8_t*)&value + 3;
156 for (i = 0; i < 4; i++) {
161static double R8(uint8_t* p) {
163 uint8_t* q = (uint8_t*)&value + 7;
165 for (i = 0; i < 8; i++) {
175 for (i = 4; i < len - 3; i++) {
184 if (utc[3] >= 256.0) {
188 utc[3] += week / 256 * 256;
189 if (utc[3] < week - 128) {
191 }
else if (utc[3] > week + 128) {
197 uint8_t* p = raw->
buff + 4;
201 trace(NULL, 4,
"decode_stqtime: len=%d\n", raw->
len);
203 raw->
iod =
U1(p + 1);
206 tow =
U4(p + 4) * 0.001;
210 sprintf(raw->
msgtype,
"SKYTRAQ EPOCH (%4d): iod=%d week=%d tow=%.3f", raw->
len, raw->
iod, week, tow);
216 uint8_t *p = raw->
buff + 4, ind;
218 int i, j, iod, prn, sys, sat, n = 0, nsat;
220 trace(NULL, 4,
"decode_stqraw: len=%d\n", raw->
len);
223 sprintf(raw->
msgtype,
"SKYTRAQ RAW (%4d): nsat=%d", raw->
len,
U1(p + 2));
226 if (iod != raw->
iod) {
227 trace(NULL, 2,
"stq raw iod error: iod=%d %d\n", iod, raw->
iod);
231 if (raw->
len < 8 + 23 * nsat) {
232 trace(NULL, 2,
"stq raw length error: len=%d nsat=%d\n", raw->
len, nsat);
235 for (i = 0, p += 3; i < nsat && i <
MAXOBS; i++, p += 23) {
249 trace(NULL, 2,
"stq raw satellite number error: prn=%d\n", prn);
252 if (!(sat =
satno(sys, prn))) {
253 trace(NULL, 2,
"stq raw satellite number error: sys=%d prn=%d\n", sys, prn);
257 pr1 = !(ind & 1) ? 0.0 :
R8(p + 2);
258 cp1 = !(ind & 4) ? 0.0 :
R8(p + 10);
259 cp1 -= floor((cp1 + 1E9) / 2E9) * 2E9;
263 raw->
obs.
data[n].
D[0] = !(ind & 2) ? 0.0 :
R4(p + 18);
268 raw->
lockt[sat - 1][0] = ind & 8 ? 1 : 0;
272 raw->
lockt[sat - 1][0] = 0;
275 if (strstr(raw->
opt,
"-INVCP")) {
281 for (j = 1; j < NFREQ + NEXOBS; j++) {
290 return n > 0 ? 1 : 0;
294 uint8_t *p = raw->
buff + 4, ind;
295 double tow, peri, pr1, cp1;
296 int i, j, ver, week, nsat, sys, sig, prn, sat, n = 0;
297 int gnss_type, signal_type;
299 trace(NULL, 4,
"decode_stqraw: len=%d\n", raw->
len);
302 sprintf(raw->
msgtype,
"SKYTRAQ RAWX (%4d): nsat=%2d", raw->
len,
U1(p + 13));
305 raw->
iod =
U1(p + 2);
308 tow =
U4(p + 5) * 0.001;
310 peri =
U2(p + 9) * 0.001;
312 if (raw->
len < 19 + 31 * nsat) {
313 trace(NULL, 2,
"stq raw length error: len=%d nsat=%d\n", raw->
len, nsat);
316 for (i = 0, p += 14; i < nsat && i <
MAXOBS; i++, p += 31) {
317 gnss_type =
U1(p) & 0xF;
318 signal_type = (
U1(p) >> 4) & 0xF;
319 if (gnss_type == 0) {
321 switch (signal_type) {
336 }
else if (gnss_type == 1) {
340 }
else if (gnss_type == 2) {
342 switch (signal_type) {
354 }
else if (gnss_type == 3) {
356 switch (signal_type) {
371 }
else if (gnss_type == 4) {
373 switch (signal_type) {
391 }
else if (gnss_type == 5) {
393 switch (signal_type) {
406 trace(NULL, 2,
"stq rawx gnss type error: type=%d\n",
U1(p));
409 if (!(sat =
satno(sys, prn))) {
410 trace(NULL, 2,
"stq raw satellite number error: sys=%d prn=%d\n", sys, prn);
414 if (gnss_type == 2) {
415 raw->
nav.
geph[prn - 1].
frq = (int)(
U1(p + 2) & 0xF) - 7;
418 pr1 = !(ind & 1) ? 0.0 :
R8(p + 4);
419 cp1 = !(ind & 4) ? 0.0 :
R8(p + 12);
420 cp1 -= floor((cp1 + 1E9) / 2E9) * 2E9;
424 raw->
obs.
data[n].
D[0] = !(ind & 2) ? 0.0 :
R4(p + 20);
429 raw->
lockt[sat - 1][0] = ind & 8 ? 1 : 0;
433 raw->
lockt[sat - 1][0] = 0;
436 if (strstr(raw->
opt,
"-INVCP")) {
442 for (j = 1; j < NFREQ + NEXOBS; j++) {
451 return n > 0 ? 1 : 0;
455 uint8_t *p = raw->
buff + 7, *q;
458 trace(NULL, 4,
"save_subfrm: sat=%2d\n", sat);
462 trace(NULL, 2,
"stq subframe preamble error: 0x%02X\n", p[0]);
465 id = (p[5] >> 2) & 0x7;
468 if (
id < 1 || 5 <
id) {
469 trace(NULL, 2,
"stq subframe id error: id=%d\n",
id);
472 q = raw->
subfrm[sat - 1] + (
id - 1) * 30;
474 for (i = 0; i < 30; i++) {
484 trace(NULL, 4,
"decode_ephem: sat=%2d\n", sat);
490 if (!strstr(raw->
opt,
"-EPHALL")) {
496 raw->
nav.
eph[sat - 1] = eph;
503 int sys =
satsys(sat, NULL);
505 trace(NULL, 4,
"decode_alm1 : sat=%2d\n", sat);
518 int sys =
satsys(sat, NULL);
520 trace(NULL, 4,
"decode_alm2 : sat=%2d\n", sat);
533 uint8_t* p = raw->
buff + 4;
535 trace(NULL, 4,
"decode_stqgps: len=%d\n", raw->
len);
538 trace(NULL, 2,
"stq gps/qzss subframe length error: len=%d\n", raw->
len);
542 sprintf(raw->
msgtype,
"SKYTRAQ GPSSF (%4d): prn=%2d id=%d", raw->
len,
U1(p + 1), (p[8] >> 2) & 0x7);
546 trace(NULL, 2,
"stq gps/qzss subframe satellite number error: prn=%d\n", prn);
565 uint8_t* p = raw->
buff + 4;
567 trace(NULL, 4,
"decode_stqglo: len=%d\n", raw->
len);
570 trace(NULL, 2,
"stq glo string length error: len=%d\n", raw->
len);
574 sprintf(raw->
msgtype,
"SKYTRAQ GLSTR (%4d): prn=%2d no=%d", raw->
len,
U1(p + 1) - 64,
U1(p + 2));
576 prn =
U1(p + 1) - 64;
578 trace(NULL, 2,
"stq glo string satellite number error: prn=%d\n", prn);
582 if (m < 1 || 4 < m) {
586 for (i = 0; i < 9; i++) {
587 setbitu(raw->
subfrm[sat - 1] + (m - 1) * 10, 5 + i * 8, 8, p[3 + i]);
599 if (!strstr(raw->
opt,
"-EPHALL")) {
614 uint8_t* p = raw->
buff + 4;
616 trace(NULL, 4,
"decode_stqgloe: len=%d\n", raw->
len);
619 trace(NULL, 2,
"stq glo string length error: len=%d\n", raw->
len);
624 trace(NULL, 2,
"stq gloe string satellite number error: prn=%d\n", prn);
636 int i, j = 0, id, pgn, prn, sat;
637 uint8_t* p = raw->
buff + 4;
639 trace(NULL, 4,
"decode_stqbds: len=%d\n", raw->
len);
642 trace(NULL, 2,
"stq bds subframe length error: len=%d\n", raw->
len);
646 sprintf(raw->
msgtype,
"SKYTRAQ BDSSF (%4d): prn=%2d id=%d", raw->
len,
U1(p + 1) - 200,
U1(p + 2));
648 prn =
U1(p + 1) - 200;
650 trace(NULL, 2,
"stq bds subframe satellite number error: prn=%d\n", prn);
654 if (
id < 1 || 5 <
id) {
655 trace(NULL, 2,
"stq bds subframe id error: prn=%2d\n", prn);
659 word =
getbitu(p + 3, j, 26) << 4;
663 for (i = 1; i < 10; i++) {
664 word =
getbitu(p + 3, j, 22) << 8;
666 setbitu(raw->
subfrm[sat - 1] + (
id - 1) * 38, i * 30, 30, word);
679 pgn =
getbitu(p + 3, 26 + 12, 4);
680 if (pgn < 1 || 10 < pgn) {
681 trace(NULL, 2,
"stq bds subframe page number error: prn=%2d pgn=%d\n", prn, pgn);
684 word =
getbitu(p + 3, j, 26) << 4;
688 for (i = 1; i < 10; i++) {
689 word =
getbitu(p + 3, j, 22) << 8;
691 setbitu(raw->
subfrm[sat - 1] + (pgn - 1) * 38, i * 30, 30, word);
700 if (!strstr(raw->
opt,
"-EPHALL")) {
706 raw->
nav.
eph[sat - 1] = eph;
713 uint8_t* p = raw->
buff + 4;
715 trace(NULL, 4,
"decode_stqack: len=%d\n", raw->
len);
718 trace(NULL, 2,
"stq ack length error: len=%d\n", raw->
len);
722 sprintf(raw->
msgtype,
"SKYTRAQ ACK (%4d): msg=0x%02X", raw->
len,
U1(p + 1));
728 uint8_t* p = raw->
buff + 4;
730 trace(NULL, 4,
"decode_stqnack: len=%d\n", raw->
len);
733 trace(NULL, 2,
"stq nack length error: len=%d\n", raw->
len);
737 sprintf(raw->
msgtype,
"SKYTRAQ NACK (%4d): msg=0x%02X", raw->
len,
U1(p + 1));
743 int type =
U1(raw->
buff + 4);
744 uint8_t cs, *p = raw->
buff + raw->
len - 3;
746 trace(NULL, 3,
"decode_stq: type=%02x len=%d\n", type, raw->
len);
751 if (cs != *p || *(p + 1) != 0x0D || *(p + 2) != 0x0A) {
752 trace(NULL, 2,
"stq checksum error: type=%02X cs=%02X tail=%02X%02X%02X\n", type, cs, *p, *(p + 1), *(p + 2));
756 sprintf(raw->
msgtype,
"SKYTRAQ 0x%02X (%4d):", type, raw->
len);
803 trace(NULL, 5,
"input_stq: data=%02x\n", data);
806 if (raw->
nbyte == 0) {
815 if (raw->
nbyte == 4) {
817 trace(NULL, 2,
"stq message length error: len=%d\n", raw->
len);
839 trace(NULL, 4,
"input_stqf:\n");
842 if (raw->
nbyte == 0) {
844 if ((data = fgetc(fp)) == EOF) {
855 if (fread(raw->
buff + 2, 1, 2, fp) < 2) {
861 trace(NULL, 2,
"stq message length error: len=%d\n", raw->
len);
865 if (fread(raw->
buff + 4, 1, raw->
len - 4, fp) < (
size_t)(raw->
len - 4)) {
886extern int gen_stq(
const char* msg, uint8_t* buff) {
887 const char* hz[] = {
"1Hz",
"2Hz",
"4Hz",
"5Hz",
"10Hz",
"20Hz",
""};
889 char mbuff[1024], *args[32], *p;
892 trace(NULL, 4,
"gen_stq: msg=%s\n", msg);
895 for (p = strtok(mbuff,
" "); p && narg < 32; p = strtok(NULL,
" ")) {
903 if (!strcmp(args[0],
"RESTART")) {
907 *q++ = narg > 2 ? (uint8_t)atoi(args[1]) : 0;
908 for (i = 1; i < 15; i++) {
911 }
else if (!strcmp(args[0],
"CFG-SERI")) {
915 for (i = 1; i < 4; i++) {
916 *q++ = narg > i + 1 ? (uint8_t)atoi(args[i]) : 0;
918 }
else if (!strcmp(args[0],
"CFG-FMT")) {
922 for (i = 1; i < 3; i++) {
923 *q++ = narg > i + 1 ? (uint8_t)atoi(args[i]) : 0;
925 }
else if (!strcmp(args[0],
"CFG-RATE")) {
930 for (i = 0; *hz[i]; i++) {
931 if (!strcmp(args[1], hz[i])) {
938 *q++ = (uint8_t)atoi(args[1]);
943 for (i = 2; i < 8; i++) {
944 *q++ = narg > i + 1 ? (uint8_t)atoi(args[i]) : 0;
946 }
else if (!strcmp(args[0],
"CFG-BIN")) {
951 for (i = 0; *hz[i]; i++) {
952 if (!strcmp(args[1], hz[i])) {
959 *q++ = (uint8_t)atoi(args[1]);
964 for (i = 2; i < 9; i++) {
965 *q++ = narg > i + 1 ? (uint8_t)atoi(args[i]) : 0;
967 }
else if (!strcmp(args[0],
"GET-GLOEPH")) {
971 *q++ = narg >= 2 ? (uint8_t)atoi(args[1]) : 0;
981 trace(NULL, 4,
"gen_stq: buff=\n");
982 traceb(NULL, 4, buff, n + 3);
void setbitu(uint8_t *buff, int pos, int len, uint32_t data)
Set unsigned bits in byte data.
uint32_t getbitu(const uint8_t *buff, int pos, int len)
Extract unsigned bits from byte data.
MRTKLIB Bits Module — Binary bit operations and CRC functions.
int satsys(int sat, int *prn)
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 int decode_stqnack(raw_t *raw)
int input_stqf(raw_t *raw, FILE *fp)
static int decode_ephem(int sat, raw_t *raw)
static int sync_stq(uint8_t *buff, uint8_t data)
static void adj_utcweek(gtime_t time, double *utc)
static int decode_stqack(raw_t *raw)
static int decode_stqgloe(raw_t *raw)
static int decode_alm2(int sat, raw_t *raw)
static int decode_stqraw(raw_t *raw)
static int decode_stqgps(raw_t *raw)
static int save_subfrm(int sat, raw_t *raw)
static int decode_stq(raw_t *raw)
int gen_stq(const char *msg, uint8_t *buff)
int input_stq(raw_t *raw, uint8_t data)
static int decode_stqbds(raw_t *raw)
static int decode_stqtime(raw_t *raw)
static int decode_stqglo(raw_t *raw)
static int decode_alm1(int sat, raw_t *raw)
static uint8_t checksum(uint8_t *buff, int len)
static int decode_stqrawx(raw_t *raw)
int decode_frame(const uint8_t *buff, eph_t *eph, alm_t *alm, double *ion, double *utc)
int decode_glostr(const uint8_t *buff, geph_t *geph, double *utc)
int decode_bds_d2(const uint8_t *buff, eph_t *eph, double *utc)
int decode_bds_d1(const uint8_t *buff, eph_t *eph, double *ion, double *utc)
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 gpst2time(int week, double sec)
Convert GPS week/tow to gtime_t.
double timediff(gtime_t t1, gtime_t t2)
Compute time difference (t1 - t2).
double time2gpst(gtime_t t, int *week)
Convert gtime_t to GPS week/tow.
int adjgpsweek(int week)
Adjust GPS week number using CPU time.
MRTKLIB Time Module — GNSS time types and conversion functions.
void traceb(mrtk_ctx_t *ctx, int level, const uint8_t *p, int n)
Output trace binary data.
void trace(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message.
MRTKLIB Trace Module — debug trace and logging functions.
GPS/GAL/QZS/BDS/IRN broadcast ephemeris type.
GLONASS broadcast ephemeris type.
GNSS time representation.
Receiver raw data control type.
uint8_t subfrm[MAXSAT][380]
double lockt[MAXSAT][5+5]