39extern int satno(
int sys,
int prn);
41extern void satno2id(
int sat,
char*
id);
49#define L6DATA_BYTELEN 212
51#define RTCM_MN_CSSR 4073
53#define MCSSR_BYTELEN 1060
55#define MCSSR_ST_MASK 1
62#define MCSSR_MAX_SYS 16
63#define MCSSR_SYS_GPS 0
64#define MCSSR_SYS_GLO 1
65#define MCSSR_SYS_GAL 2
66#define MCSSR_SYS_BDS 3
67#define MCSSR_SYS_QZS 4
68#define MCSSR_SYS_BD3 7
70#define MCSSR_MAX_SATMASK 40
71#define MCSSR_SATMASK_GPS_U 0xFFFFFFFFu
72#define MCSSR_SATMASK_GPS_L 0xFF
73#define MCSSR_SATMASK_GLO_U 0xFFFFFF00u
74#define MCSSR_SATMASK_GLO_L 0x00
75#define MCSSR_SATMASK_GAL_U 0xFFFFFFFFu
76#define MCSSR_SATMASK_GAL_L 0xF8
77#define MCSSR_SATMASK_BDS_U 0xFFFFFFFFu
78#define MCSSR_SATMASK_BDS_L 0xFF
79#define MCSSR_SATMASK_QZS_U 0xFFC00000u
80#define MCSSR_SATMASK_QZS_L 0x00
81#define MCSSR_SATMASK_BD3_U 0xFFFFFFFFu
82#define MCSSR_SATMASK_BD3_L 0xFF
83#define MCSSR_SATMASK_RSV_U 0xFFFFFFFFu
84#define MCSSR_SATMASK_RSV_L 0xFF
86#define MCSSR_MAX_SIGMASK 16
88#define MCSSR_INVALID_15BIT -16384
89#define MCSSR_INVALID_13BIT -4096
90#define MCSSR_INVALID_11BIT -1024
92#define MCSSR_MAX_PRN 7
95static const double ssrudint[16] = {1, 2, 5, 10, 15, 30, 60, 120, 240, 300, 600, 900, 1800, 3600, 7200, 10800};
117 -1, 5, -1, 3, 5, 5, -1, 3,
118 -1, -1, -1, -1, -1, -1, -1, -1
163 for (i = 0; i < 16; i++) {
164 if ((flg >> i) & 0x1) {
189static int svmask2list(
const uint64_t mask,
const int gnssid,
int* satlist,
int* gidlist) {
218 gidlist[ns] = gnssid;
227static int sigmask2list(
const uint16_t mask,
const int gnssid,
int* siglist) {
257 siglist[nsig] = sigs[i];
275 if (tow < tow_p - 302400.0) {
277 }
else if (tow > tow_p + 302400.0) {
298 trace(NULL, 4,
"decode_mcssr_head: st=%d, ep=%d, udi=%d, sync=%d, iod=%d\n", st, *ep, udi, *sync, *iod);
304 int j, k, sync, iod, ep, ngnss, gnssid, cmaflg, nsat, nsig;
305 uint64_t svmask, gnssmask;
306 uint16_t sigmask, cellmask;
311 mc->
tow0 = ep / 3600 * 3600;
320 for (j = 0; j <
MAXSAT; j++) {
326 for (j = 0; j < ngnss; j++) {
350 trace(NULL, 2,
"decode_mcssr_mask: reserved gnssid=%d\n", gnssid);
367 trace(NULL, 4,
"decode_mcssr_mask: gnssid=%d, svmask=0x%02X%08X, sigmask=0x%X, cmaflg=%d, nsat=%d, nsig=%d\n",
368 gnssid, (uint8_t)(svmask >> 32), (uint32_t)(svmask), sigmask, cmaflg, nsat, nsig);
371 for (k = 0; k < nsat; k++) {
376 trace(NULL, 4,
"decode_mcssr_mask: k=%d, cellmask=0x%X, ncell=%2d\n", k, cellmask,
380 for (k = 0; k < nsat; k++) {
385 mc->
nsat[gnssid] = nsat;
386 mc->
nsig[gnssid] = nsig;
394 int j, k, n, sync, iod, ep, sat, iode, deph[3];
400 trace(NULL, 2,
"decode_mcssr_oc: %s,unprocessed mask\n",
time_str(mc->
gt, 3));
408 if (mc->
iod != iod) {
409 trace(NULL, 2,
"decode_mcssr_oc: %s,iod mismatch %d != %d\n",
time_str(mc->
gt, 3), mc->
iod, iod);
413 for (j = 0; j < mc->
ns; j++) {
426 trace(NULL, 4,
"decode_mcssr_oc :%s,i=%4d,j=%3d,sat=%s,iode=%4d,deph=%6d,%6d,%6d,%8.4f,%8.4f,%8.4f\n",
427 time_str(mc->
gt, 3), i, j, satid, iode, deph[0], deph[1], deph[2], deph[0] * 0.0016, deph[1] * 0.0064,
438 ssr[sat - 1].
t0[0] = mc->
gt;
439 ssr[sat - 1].
udi[0] = udint;
440 ssr[sat - 1].
iod[0] = iod;
441 ssr[sat - 1].
iode = iode;
442 ssr[sat - 1].
deph[0] = deph[0] * 0.0016;
443 ssr[sat - 1].
deph[1] = deph[1] * 0.0064;
444 ssr[sat - 1].
deph[2] = deph[2] * 0.0064;
445 for (k = 0; k < 3; k++) {
446 ssr[sat - 1].
ddeph[k] = 0.0;
456 int j, sync, iod, ep, sat, dclk;
462 trace(NULL, 2,
"decode_mcssr_cc: %s,unprocessed mask\n",
time_str(mc->
gt, 3));
470 if (mc->
iod != iod) {
471 trace(NULL, 2,
"decode_mcssr_cc: %s,iod mismatch %d != %d\n",
time_str(mc->
gt, 3), mc->
iod, iod);
475 for (j = 0; j < mc->
ns; j++) {
482 trace(NULL, 4,
"decode_mcssr_cc :%s,i=%4d,j=%3d,sat=%s,dclk=%6d,%8.4f\n",
time_str(mc->
gt, 3), i, j, satid,
483 dclk, dclk * 0.0016);
493 ssr[sat - 1].
t0[1] = mc->
gt;
494 ssr[sat - 1].
udi[1] = udint;
495 ssr[sat - 1].
iod[1] = iod;
496 ssr[sat - 1].
dclk[0] = dclk * 0.0016;
497 ssr[sat - 1].
dclk[1] = 0.0;
498 ssr[sat - 1].
dclk[2] = 0.0;
507 int j, k, sync, iod, ep, sat, nsig, mask, cb, flg, code;
514 trace(NULL, 2,
"decode_mcssr_cb: %s,unprocessed mask\n",
time_str(mc->
gt, 3));
522 if (mc->
iod != iod) {
523 trace(NULL, 2,
"decode_mcssr_cb: %s,iod mismatch %d != %d\n",
time_str(mc->
gt, 3), mc->
iod, iod);
527 for (j = 0; j < mc->
ns; j++) {
528 for (k = 0; k <
MAXCODE; k++) {
535 mask = 1 << (nsig - 1);
538 for (k = 0; k < nsig; k++, mask >>= 1) {
539 if ((flg = (mc->
cellmask[j] & mask))) {
542 trace(NULL, 4,
"decode_mcssr_cb: %s,i=%4d,j=%3d,k=%2d,sat=%s,flg=0x%2X,sig=%2d,cb=%5d,%6.2f\n",
553 cbias[code - 1] = cb * 0.02;
554 vcbias[code - 1] = 1;
558 trace(NULL, 3,
"decode_mcssr_cb: invalid cbias %s %s %s\n",
time_str(mc->
gt, 3), satid,
563 if (apply && sat > 0) {
564 ssr[sat - 1].
t0[4] = mc->
gt;
565 ssr[sat - 1].
udi[4] = udint;
566 ssr[sat - 1].
iod[4] = iod;
567 for (k = 0; k <
MAXCODE; k++) {
568 ssr[sat - 1].
cbias[k] = (float)cbias[k];
569 ssr[sat - 1].
vcbias[k] = vcbias[k];
579 int j, k, sync, iod, ep, sat, nsig, mask, pb, di, flg, code;
594 if (mc->
iod != iod) {
595 trace(NULL, 2,
"decode_mcssr_pb: %s,iod mismatch %d != %d\n",
time_str(mc->
gt, 3), mc->
iod, iod);
599 for (j = 0; j < mc->
ns; j++) {
600 for (k = 0; k <
MAXCODE; k++) {
602 discnt[k] = vpbias[k] = 0;
607 mask = 1 << (nsig - 1);
610 for (k = 0; k < nsig; k++, mask >>= 1) {
611 if ((flg = (mc->
cellmask[j] & mask))) {
617 trace(NULL, 4,
"decode_mcssr_pb: %s,i=%4d,j=%3d,k=%2d,sat=%s,flg=0x%2X,sig=%2d,di=%d,pb=%5d,%7.3f\n",
618 time_str(mc->
gt, 3), i, j, k, satid, flg, mc->
siglist[mc->
gidlist[j]][k], di, pb, pb * 0.001);
628 pbias[code - 1] = pb * 0.001;
629 vpbias[code - 1] = 1;
630 discnt[code - 1] = di;
637 if (apply && sat > 0) {
638 ssr[sat - 1].
t0[5] = mc->
gt;
639 ssr[sat - 1].
udi[5] = udint;
640 ssr[sat - 1].
iod[5] = iod;
643 for (k = 0; k <
MAXCODE; k++) {
644 ssr[sat - 1].
pbias[k] = (float)pbias[k];
645 ssr[sat - 1].
vpbias[k] = vpbias[k];
646 ssr[sat - 1].
discnt[k] = discnt[k];
656 int j, sync, iod, ep, sat, ura;
662 trace(NULL, 2,
"decode_mcssr_ura: %s,unprocessed mask\n",
time_str(mc->
gt, 3));
670 if (mc->
iod != iod) {
671 trace(NULL, 2,
"decode_mcssr_ura: %s,iod mismatch %d != %d\n",
time_str(mc->
gt, 3), mc->
iod, iod);
675 for (j = 0; j < mc->
ns; j++) {
682 trace(NULL, 4,
"decode_mcssr_ura :%s,i=%4d,j=%3d,sat=%s,ura=0x%02X\n",
time_str(mc->
gt, 3), i, j, satid, ura);
688 ssr[sat - 1].
t0[3] = mc->
gt;
689 ssr[sat - 1].
udi[3] = udint;
690 ssr[sat - 1].
iod[3] = iod;
691 ssr[sat - 1].
ura = ura;
705 unsigned int preamb, prn, type, alert, vid, mgfid, csid, anme, si;
707 int i = 0, n, ibuff, mn, st, apply, ret, optprn;
725 "decode_qzss_l6emsg : %s,preamb=0x%08X,prn=%d,type=0x%X(vid=%d,mgfid=%d,csid=%d,anme=%d,si=%d),alert=%d\n",
726 time_str(
_mcssr[
_mcssr_ch].gt, 3), preamb, prn, type, vid, mgfid, csid, anme, si, alert);
734 if (strstr(
rtcm->opt,
"-IGNORE_MCSSR_ALERT")) {
746 if ((str = strstr(
rtcm->opt,
"-MCSSR_PRN"))) {
747 optprn = atoi(strstr(str,
"=") + 1);
749 trace(NULL, 3,
"decode_qzss_l6emsg : -MCSSR_PRN=%d\n", optprn);
758 trace(NULL, 3,
"decode_qzss_l6emsg : prn mismatch _mcssr[_mcssr_ch].prn=%d,prn=%d,cnt=%d\n",
788 trace(NULL, 3,
"decode_qzss_l6emsg : %s,mn=%d,st=%d,maxframe=%d\n",
time_str(
_mcssr[
_mcssr_ch].gt, 3), mn, st,
825 trace(NULL, 3,
"decode_qzss_l6emsg : invalid frame\n");
865 trace(NULL, 2,
"decode_qzss_l6emsg :%s,st=%d,mgfid mismatch %d != %d\n",
877 if (strstr(
rtcm->opt,
"-DIS_MCSSR_CB")) {
889 trace(NULL, 2,
"decode_qzss_l6emsg : invalid st=%d\n", st);
895 trace(NULL, 2,
"decode_qzss_l6emsg : decode error st=%d\n", st);
936 trace(NULL, 5,
"input_qzssl6e: data=%02x,%d\n", data,
rtcm->nbyte);
939 if ((
rtcm->nbyte == 0) && (data != 0x1A)) {
941 }
else if (((
rtcm->nbyte == 1) && (data != 0xCF)) || ((
rtcm->nbyte == 2) && (data != 0xFC)) ||
942 ((
rtcm->nbyte == 3) && (data != 0x1D))) {
968 trace(NULL, 4,
"input_qzssl6ef\n");
970 for (i = 0; i < 4096; i++) {
971 if ((data = fgetc(fp)) == EOF) {
char * code2obs(uint8_t code)
uint32_t getbitu(const uint8_t *buff, int pos, int len)
Extract unsigned bits from byte data.
int32_t getbits(const uint8_t *buff, int pos, int len)
Extract signed bits from byte data.
MRTKLIB Bits Module — Binary bit operations and CRC functions.
static const double ssrudint[16]
MRTKLIB Constants — Physical, navigation, and system constants.
#define SSR_INVALID_PBIAS
#define SSR_INVALID_CBIAS
int l6_parse_header(const uint8_t *frame, l6_header_t *h)
Parse the header of one L6 frame and classify its service.
MRTKLIB L6 Module — QZSS L6 frame header parsing.
void satno2id(int sat, char *id)
static const int framelen[]
static const uint8_t cssr_sig_bd3[16]
#define MCSSR_SATMASK_BD3_U
#define MCSSR_SATMASK_GLO_U
static const uint8_t cssr_sig_qzs[16]
static int decode_mcssr_mask(mcssr_t *mc, int i)
#define MCSSR_INVALID_15BIT
static const uint8_t cssr_sig_bd2[16]
int decode_qzss_l6emsg(rtcm_t *rtcm)
Decode QZSS L6E message and convert to RTCM SSR.
#define MCSSR_SATMASK_GPS_U
static void adjweek(gtime_t *gt, double tow)
static int decode_mcssr_oc(mcssr_t *mc, ssr_t *ssr, int i, int apply)
#define MCSSR_SATMASK_GAL_L
#define MCSSR_SATMASK_GAL_U
int get_mcssr_ch(void)
Get current MADOCA-PPP CSSR channel index.
static int mcssr_sigcode(const mcssr_t *mc, int gnssid, int sat, int k)
static int decode_mcssr_head(const mcssr_t *mc, int *sync, int *iod, int *ep, double *udint, int i, const int st)
#define MCSSR_INVALID_13BIT
static const uint8_t cssr_sig_gps[16]
int input_qzssl6ef(rtcm_t *rtcm, FILE *fp)
Fetch next QZSS L6E message and input a message from file.
#define MCSSR_SATMASK_BD3_L
#define MCSSR_SATMASK_QZS_U
#define MCSSR_SATMASK_RSV_L
#define MCSSR_MAX_SIGMASK
int satno(int sys, int prn)
static int decode_mcssr_cc(mcssr_t *mc, ssr_t *ssr, int i, int apply)
int mcssr_sel_biascode(const int sys, const int code)
Select MADOCA-PPP code/phase bias code from observation code.
mcssr_t _mcssr[SSR_CH_NUM]
#define MCSSR_MAX_SATMASK
static const uint8_t cssr_sig_glo[16]
static int decode_mcssr_pb(mcssr_t *mc, ssr_t *ssr, int i, int apply)
#define MCSSR_SATMASK_RSV_U
const uint8_t cssr_sig_rsv[16]
double time2gpst(gtime_t t, int *week)
void init_mcssr(const gtime_t gt)
Initialize MADOCA-PPP CSSR control struct for current channel.
#define MCSSR_SATMASK_BDS_L
#define MCSSR_SATMASK_GLO_L
static int gnssid2sys(const int gnssid)
#define MCSSR_SATMASK_QZS_L
static int decode_mcssr_cb(mcssr_t *mc, ssr_t *ssr, int i, int apply)
int satsys_bd2(int sat, int *prn)
char * time_str(gtime_t t, int n)
#define MCSSR_INVALID_11BIT
#define MCSSR_SATMASK_BDS_U
#define MCSSR_SATMASK_GPS_L
static int decode_mcssr_ura(mcssr_t *mc, ssr_t *ssr, int i, int apply)
static int svmask2list(const uint64_t mask, const int gnssid, int *satlist, int *gidlist)
void set_mcssr_ch(int ch)
Set MADOCA-PPP CSSR channel index for multi-L6E.
static int flgcnt16(const uint16_t flg)
static const uint8_t cssr_sig_gal[16]
static int sigmask2list(const uint16_t mask, const int gnssid, int *siglist)
gtime_t utc2gpst(gtime_t t)
int input_qzssl6e(rtcm_t *rtcm, const uint8_t data)
Stack QZSS L6E message and synchronize frame with L6 preamble.
MRTKLIB MADOCA-PPP Module — QZSS L6E CSSR message decode functions.
gtime_t gpst2time(int week, double sec)
Convert GPS week/tow to gtime_t.
void trace(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message.
MRTKLIB Trace Module — debug trace and logging functions.
GNSS time representation.
RTCM control struct type.