40extern int satsys(
int sat,
int* prn);
50#define PI 3.1415926535897932
51#define R2D (180.0 / PI)
67#define FREQ1 1.57542E9
68#define FREQ2 1.22760E9
69#define FREQ5 1.17645E9
70#define FREQ6 1.27875E9
71#define FREQ7 1.20714E9
72#define FREQ8 1.191795E9
73#define FREQ9 2.492028E9
74#define FREQ1_GLO 1.60200E9
75#define DFRQ1_GLO 0.56250E6
76#define FREQ2_GLO 1.24600E9
77#define DFRQ2_GLO 0.43750E6
78#define FREQ3_GLO 1.202025E9
79#define FREQ1a_GLO 1.600995E9
80#define FREQ2a_GLO 1.248060E9
81#define FREQ1_CMP 1.561098E9
82#define FREQ2_CMP 1.20714E9
83#define FREQ3_CMP 1.26852E9
92 "",
"1C",
"1P",
"1W",
"1Y",
"1M",
"1N",
"1S",
"1L",
"1E",
93 "1A",
"1B",
"1X",
"1Z",
"2C",
"2D",
"2S",
"2L",
"2X",
"2P",
94 "2W",
"2Y",
"2M",
"2N",
"5I",
"5Q",
"5X",
"7I",
"7Q",
"7X",
95 "6A",
"6B",
"6C",
"6X",
"6Z",
"6S",
"6L",
"8L",
"8Q",
"8X",
96 "2I",
"2Q",
"6I",
"6Q",
"3I",
"3Q",
"3X",
"1I",
"1Q",
"5A",
97 "5B",
"5C",
"9A",
"9B",
"9C",
"9X",
"1D",
"5D",
"5P",
"5Z",
98 "6E",
"7D",
"7P",
"7Z",
"8D",
"8P",
"4A",
"4B",
"4X",
"6D",
107static int cmpobs(
const void* p1,
const void* p2) {
110 if (fabs(tt) >
DTTOL) {
111 return tt < 0 ? -1 : 1;
113 if (q1->
rcv != q2->rcv) {
114 return (
int)q1->
rcv - (int)q2->rcv;
116 return (
int)q1->
sat - (int)q2->sat;
136 if (!mask->
ena[base] || idx < 0 || idx >= NFREQ) {
140 a = (el *
R2D + 5.0) / 10.0;
144 minsnr = mask->
mask[idx][0];
146 minsnr = mask->
mask[idx][8];
148 minsnr = (1.0 - a) * mask->
mask[idx][i - 1] + a * mask->
mask[idx][i];
160extern int testelmask(
const double* azel,
const int16_t* elmask) {
161 double az = azel[0] *
R2D;
163 az -= floor(az / 360.0) * 360.0;
165 return azel[1] *
R2D < elmask[(int)floor(az)] * 0.1;
204 if (strlen(obs) < 2) {
245 int i, fcn = 0, sys, prn;
253 for (i = 0; i < nav->
ng; i++) {
260 }
else if (nav->
glo_fcn[prn - 1] > 0) {
261 fcn = nav->
glo_fcn[prn - 1] - 8;
276extern int getcodepri(
int sys, uint8_t code,
const char* opt) {
277 const char *p, *optstr;
278 const uint8_t* plist;
280 char *obs, str[8] =
"";
318 for (p = opt; p && (p = strchr(p,
'-')); p++) {
319 if (sscanf(p, optstr, str) < 1 || str[0] != obs[0]) {
322 return str[1] == obs[1] ? 15 : 0;
339 if (plist[i] == code) {
353 trace(NULL, 3,
"sortobs: nobs=%d\n", obs->
n);
362 for (i = j = 0; i < obs->
n; i++) {
370 for (i = n = 0; i < obs->
n; i = j, n++) {
371 for (j = i + 1; j < obs->
n; j++) {
392 for (i = 0; i < NFREQ + NEXOBS; i++) {
394 for (j = 0; c[j] !=
'\0'; j++) {
395 if (code[0] == f && code[1] == c[j]) {
403 if (i < NFREQ + NEXOBS) {
404 obs->
SNR[idx] = obs->
SNR[i];
405 obs->
LLI[idx] = obs->
LLI[i];
407 obs->
L[idx] = obs->
L[i];
408 obs->
P[idx] = obs->
P[i];
409 obs->
D[idx] = obs->
D[i];
411 obs->
SNR[idx] = obs->
LLI[idx] = obs->
code[idx] = 0;
412 obs->
P[idx] = obs->
L[idx] = obs->
D[idx] = 0.0;
436 obs->
n = obs->
nmax = 0;
809 switch (rinex_freq_id) {
819 switch (rinex_freq_id) {
831 switch (rinex_freq_id) {
845 switch (rinex_freq_id) {
857 switch (rinex_freq_id) {
865 switch (rinex_freq_id) {
881 switch (rinex_freq_id) {
1043 if (!str || strlen(str) < 3) {
1075 freq_digit = str[1] -
'0';
1076 if (freq_digit < 1 || freq_digit > 9) {
1085 obs_str[0] = str[1];
1086 obs_str[1] = str[2];
1129 int i, j, sys_idx, max_nf = 0;
1134 if (!sigs || !cfg || !nf || nsig <= 0) {
1141 for (i = 0; i < nsig; i++) {
1143 trace(NULL, 2,
"mrtk_sigcfg_from_signals: invalid signal '%s'\n", sigs[i]);
1153 trace(NULL, 2,
"mrtk_sigcfg_from_signals: too many signals for sys=%d\n", sys);
1158 for (j = 0; j < cfg[sys_idx].
nsig; j++) {
1159 if (cfg[sys_idx].sig[j].band == band) {
1160 trace(NULL, 2,
"mrtk_sigcfg_from_signals: duplicate band for '%s'\n", sigs[i]);
1167 cfg[sys_idx].
nsig++;
1172 if (cfg[i].nsig > max_nf) {
1173 max_nf = cfg[i].
nsig;
1197 if (cfg[i].nsig <= 0) {
1202 memset(freq_nums, 0,
sizeof(freq_nums));
1203 for (j = 0; j < cfg[i].
nsig && j <
MAXFREQ; j++) {
1205 if (freq_nums[j] == 0) {
1206 trace(NULL, 2,
"mrtk_sigcfg_to_obsdef: invalid band %d for sys=%02x\n", cfg[i].sig[j].band,
1226 int fn, base_idx, i;
1231 if (sys_idx < 0 || !cfg) {
1240 for (i = 0; i < c->
nsig; i++) {
1247 return (base_idx >= 0 && base_idx < NFREQ) ? base_idx : -1;
void set_obsdef(int sys, const int *freq_nums)
Rearrange obsdef table for a satellite system by frequency numbers.
int satsys_bd2(int sat, int *prn)
Distinguish BDS-2 from BDS-3.
double freq_num2freq(int sys, int freq_num, int fcn)
Convert frequency number to frequency in Hz.
int freq_num2freq_idx(int sys, int freq_num)
Convert frequency number to frequency index using obsdef table.
MRTKLIB Navigation Module — Navigation data types and satellite/nav utility functions.
static const uint8_t QZS_L1_PRIORITY_CLASLIB[MRTK_MAX_SIG_PRIORITY]
int satsys(int sat, int *prn)
const uint8_t * mrtk_get_signal_priority(int sys, mrtk_band_t band)
Get priority-ordered code list for a (system, band) pair.
int sortobs(obs_t *obs)
Sort observation data by time, receiver, and satellite.
void mrtk_use_claslib_qzs_l1_priority(int on)
Toggle the claslib-compatible QZSS L1 signal priority (C>S>L>X>Z).
int getcodepri(int sys, uint8_t code, const char *opt)
Get code priority for multiple codes in a frequency.
int code2freq_num(uint8_t code)
Extract frequency number from obs code.
int mrtk_sigcfg_from_signals(const char **sigs, int nsig, mrtk_sigcfg_t *cfg, int *nf)
Build per-constellation signal config from a signal string array.
int mrtk_parse_signal_str(const char *str, int *sys, mrtk_band_t *band, uint8_t *code)
Parse a RINEX3-style signal string (e.g., "G1C") into components.
int mrtk_sigcfg_freq_idx(int sys, uint8_t code, const mrtk_sigcfg_t *cfg, int nex)
Resolve the observation slot for a decoded (sys, code) from sigcfg.
static int sys2sigcfg_idx(int sys)
double code2freq(int sys, uint8_t code, int fcn)
Convert system and obs code to carrier frequency.
uint8_t obs2code(const char *obs)
Convert obs code type string to obs code.
int mrtk_band_to_freq_num(int sys, mrtk_band_t band)
Convert physical band back to RINEX frequency number for a given system.
double timediff(gtime_t t1, gtime_t t2)
double time2gpst(gtime_t t, int *week)
static int qzs_l1_claslib
static int cmpobs(const void *p1, const void *p2)
char * code2obs(uint8_t code)
Convert obs code to obs code string.
int testelmask(const double *azel, const int16_t *elmask)
Test elevation mask.
double mrtk_band2freq_hz(mrtk_band_t band)
Convert physical band to base carrier frequency (Hz).
void freeobs(obs_t *obs)
Free observation data memory.
void signal_replace(obsd_t *obs, int idx, char f, char *c)
Replace signal type in observation data.
int code2freq_idx(int sys, uint8_t code)
Convert system and obs code to frequency index (obsdef-based).
int testsnr(int base, int idx, double el, double snr, const snrmask_t *mask)
Test SNR mask.
int mrtk_sigcfg_to_obsdef(const mrtk_sigcfg_t *cfg)
Apply signal config to obsdef tables (bridge to existing system).
static const sig_priority_entry_t SIG_PRIORITY_TABLE[]
int screent(gtime_t time, gtime_t ts, gtime_t te, double tint)
Screen data by time range and interval.
double sat2freq(int sat, uint8_t code, const nav_t *nav)
Convert satellite and obs code to carrier frequency.
mrtk_band_t mrtk_rinex_freq_to_band(int sys, int rinex_freq_id)
Convert RINEX frequency digit to physical band for a given system.
MRTKLIB Observation Module — Observation data types and utility functions.
#define MRTK_SIGCFG_NOOPINION
mrtk_sigcfg_freq_idx() sentinel: this constellation has no sigcfg entry, so the caller should fall ba...
#define MRTK_MAXSIG_PER_SYS
Per-constellation signal configuration.
#define MRTK_MAX_SIG_PRIORITY
Maximum number of codes in a priority list.
MRTKLIB Options Module — Processing and solution option types.
double timediff(gtime_t t1, gtime_t t2)
Compute time difference (t1 - t2).
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.
Signal priority entry: band + priority-ordered code list.
Observation data collection.
mrtk_sig_priority_t priority