28#define RTCM2PREAMB 0x66
29#define RTCM3PREAMB 0xD3
40 eph_t eph0 = {0, -1, -1};
45 trace(NULL, 3,
"init_rtcm:\n");
49 rtcm->sta.name[0] =
rtcm->sta.marker[0] =
'\0';
50 rtcm->sta.antdes[0] =
rtcm->sta.antsno[0] =
'\0';
51 rtcm->sta.rectype[0] =
rtcm->sta.recver[0] =
rtcm->sta.recsno[0] =
'\0';
52 rtcm->sta.antsetup =
rtcm->sta.itrf =
rtcm->sta.deltype = 0;
53 for (i = 0; i < 3; i++) {
54 rtcm->sta.pos[i] =
rtcm->sta.del[i] = 0.0;
58 for (i = 0; i <
MAXSAT; i++) {
62 for (i = 0; i < 6; i++) {
63 rtcm->msmtype[i][0] =
'\0';
66 for (i = 0; i <
MAXSAT; i++) {
67 for (j = 0; j < NFREQ + NEXOBS; j++) {
69 rtcm->lock[i][j] =
rtcm->loss[i][j] = 0;
70 rtcm->lltime[i][j] = time0;
75 for (i = 0; i < 100; i++) {
78 for (i = 0; i < 400; i++) {
82 rtcm->obs.data = NULL;
84 rtcm->nav.geph = NULL;
85 rtcm->nav.pppiono = NULL;
102 for (i = 0; i <
MAXOBS; i++) {
103 rtcm->obs.data[i] = data0;
105 for (i = 0; i <
MAXSAT * 2; i++) {
106 rtcm->nav.eph[i] = eph0;
109 rtcm->nav.geph[i] = geph0;
119 trace(NULL, 3,
"free_rtcm:\n");
123 rtcm->obs.data = NULL;
126 rtcm->nav.eph = NULL;
129 rtcm->nav.geph = NULL;
163 trace(NULL, 5,
"input_rtcm2: data=%02x\n", data);
165 if ((data & 0xC0) != 0x40) {
169 for (i = 0; i < 6; i++, data >>= 1) {
170 rtcm->word = (
rtcm->word << 1) + (data & 1);
173 if (
rtcm->nbyte == 0) {
174 preamb = (uint8_t)(
rtcm->word >> 22);
175 if (
rtcm->word & 0x40000000) {
190 if (++
rtcm->nbit < 30) {
198 trace(NULL, 2,
"rtcm2 partity error: i=%d word=%08x\n", i,
rtcm->word);
204 if (
rtcm->nbyte == 6) {
205 rtcm->len = (
rtcm->buff[5] >> 3) * 3 + 6;
290 trace(NULL, 5,
"input_rtcm3: data=%02x\n", data);
293 if (
rtcm->nbyte == 0) {
302 if (
rtcm->nbyte == 3) {
312 trace(NULL, 2,
"rtcm3 parity error: len=%d\n",
rtcm->len);
326 int i, data = 0, ret;
328 trace(NULL, 4,
"input_rtcm2f: data=%02x\n", data);
330 for (i = 0; i < 4096; i++) {
331 if ((data = fgetc(fp)) == EOF) {
348 int i, data = 0, ret;
350 trace(NULL, 4,
"input_rtcm3f: data=%02x\n", data);
352 for (i = 0; i < 4096; i++) {
353 if ((data = fgetc(fp)) == EOF) {
370 trace(NULL, 4,
"gen_rtcm2: type=%d sync=%d\n", type, sync);
396 trace(NULL, 4,
"gen_rtcm3: type=%d subtype=%d sync=%d\n", type, subtype, sync);
414 for (i =
rtcm->nbit; i % 8; i++) {
418 if ((
rtcm->len = i / 8) >= 3 + 1024) {
419 trace(NULL, 2,
"generate rtcm 3 message length error len=%d\n",
rtcm->len - 3);
uint32_t rtk_crc24q(const uint8_t *buff, int len)
Compute CRC-24Q parity for SBAS and RTCM3.
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.
int decode_word(uint32_t word, uint8_t *data)
Check parity and decode GPS navigation data word.
MRTKLIB Bits Module — Binary bit operations and CRC functions.
int decode_rtcm2(rtcm_t *rtcm)
Decode RTCM ver.2 message (called from rtcm.c).
int decode_rtcm3(rtcm_t *rtcm)
Decode RTCM ver.3 message (called from rtcm.c).
int encode_rtcm3(rtcm_t *rtcm, int type, int subtype, int sync)
Encode RTCM ver.3 message (called from rtcm.c).
int gen_rtcm2(rtcm_t *rtcm, int type, int sync)
Generate RTCM 2 message.
lclblock_t * rtcm_lclblk(rtcm_t *rtcm)
Get the local correction block, lazily allocating it on first use.
void free_rtcm(rtcm_t *rtcm)
Free RTCM control struct.
int input_rtcm3f(rtcm_t *rtcm, FILE *fp)
Input RTCM 3 message from file.
int init_rtcm(rtcm_t *rtcm)
Initialize RTCM control struct.
int gen_rtcm3(rtcm_t *rtcm, int type, int subtype, int sync)
Generate RTCM 3 message.
int input_rtcm2f(rtcm_t *rtcm, FILE *fp)
Input RTCM 2 message from file.
int input_rtcm2(rtcm_t *rtcm, uint8_t data)
Input RTCM 2 message from stream (byte-by-byte).
int input_rtcm3(rtcm_t *rtcm, uint8_t data)
Input RTCM 3 message from stream (byte-by-byte).
MRTKLIB RTCM Module — RTCM message types and functions.
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.
RTCM control struct type.