31#define D2R (3.1415926535897932384626433832795 / 180.0)
32#define R2D (180.0 / 3.1415926535897932384626433832795)
49#define SWTOPT "0:off,1:on"
50#define ISBOPT "0:off,1:table,1:on"
51#define SEEDOPT "0:off,1:cn0+tdcp,2:cn0+tdcp+robust"
53 "0:single,1:dgps,2:kinematic,3:static,4:movingbase,5:fixed,6:ppp-kine,7:ppp-static,8:ppp-fixed,9:ppp-rtk,10:" \
54 "ssr2osr,11:ssr2osr-fixed,12:vrs-rtk"
55#define FRQOPT "1:l1,2:l1+2,2:l1+l2,3:l1+2+3,3:l1+l2+l5,4:l1+2+3+4,4:l1+l2+l5+l6,5:l1+2+3+4+5,5:l1+l2+l5+l6+l7"
56#define FRQOPT2 "1:l1,2:l1+l2,3:l1+l5,4:l1+l2+l5,5:l1+l5(l2)"
57#define TYPOPT "0:forward,1:backward,2:combined"
58#define IONOPT "0:off,1:brdc,2:sbas,3:dual-freq,4:est-stec,5:ionex-tec,6:qzs-brdc,9:est-adaptive"
59#define TRPOPT "0:off,1:saas,2:sbas,3:est-ztd,4:est-ztdgrad"
60#define EPHOPT "0:brdc,1:precise,2:brdc+sbas,3:brdc+ssrapc,4:brdc+ssrcom"
61#define ROBOPT "0:off,1:igg3"
62#define NAVOPT "1:gps+2:sbas+4:glo+8:gal+16:qzs+32:bds+64:navic"
63#define GAROPT "0:off,1:on"
64#define SOLOPT "0:llh,1:xyz,2:enu,3:nmea"
65#define TSYOPT "0:gpst,1:utc,2:jst"
66#define TFTOPT "0:tow,1:hms"
67#define DFTOPT "0:deg,1:dms"
68#define HGTOPT "0:ellipsoidal,1:geodetic"
69#define GEOOPT "0:internal,1:egm96,2:egm08_2.5,3:egm08_1,4:gsi2000"
70#define STAOPT "0:all,1:single"
71#define STSOPT "0:off,1:state,2:residual"
72#define ARMOPT "0:off,1:continuous,2:instantaneous,3:fix-and-hold"
73#define POSOPT "0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm,6:raw"
74#define TIDEOPT "0:off,1:on,2:otl,3:solid+otl-clasgrid+pole"
75#define PHWOPT "0:off,1:on,2:precise"
76#define SIGOPT1 "0:L1/L2,1:L1/L5,2:L1/L2/L5"
77#define SIGOPT2 "0:L1/L5,1:L1/L2,2:L1/L5/L2"
78#define SIGOPT3 "0:E1/E5a,1:E1/E5b,2:E1/E6,3:E1/E5a/E5b/E6,4:E1/E5a/E6/E5b"
79#define SIGOPT4 "0:B1I/B3I,1:B1I/B2I,2:B1I/B3I/B2I"
80#define SIGOPT5 "0:B1I/B3I,1:B1I/B2a,2:B1I/B3I/B2a"
81#define COMOPT "0:off,1:ssr,2:meas"
82#define ARALPHAOPT "0:0.1%,1:0.5%,2:1%,3:5%,4:10%,5:20%"
83#define PSHFTOPT "0:off,1:table"
84#define DOPOPT "0:zd,1:sd"
85#define SATCB "0:auto,1:ssr,2:bia,3:dcb"
86#define SATPB "0:auto,1:ssr,2:bia,3:fcb"
87#define CORROPT "-1:auto,0:none,1:igs,2:igs-rts,3:qzs-madoca,4:gal-has,5:bds-b2b,6:qzs-clas"
88#define BDS2OPT "satid(C01-C18),.. BDS-2 in PRN 1-18 (\"\":no BDS-2)"
89#define IGSOOPT "satid,.. BDS-3 IGSO (\"\":C06-C08)"
95 {
"pos1-elmask", 1, (
void*)&
elmask_,
"deg"},
96 {
"pos1-snrmask_r", 3, (
void*)&
prcopt_.snrmask.ena[0],
SWTOPT},
97 {
"pos1-snrmask_b", 3, (
void*)&
prcopt_.snrmask.ena[1],
SWTOPT},
98 {
"pos1-snrmask_L1", 2, (
void*)
snrmask_[0],
""},
99 {
"pos1-snrmask_L2", 2, (
void*)
snrmask_[1],
""},
100 {
"pos1-snrmask_L5", 2, (
void*)
snrmask_[2],
""},
106 {
"pos1-robustk0", 1, (
void*)&
prcopt_.robustk[0],
""},
107 {
"pos1-robustk1", 1, (
void*)&
prcopt_.robustk[1],
""},
109 {
"pos1-tdcpjump", 1, (
void*)&
prcopt_.tdcpjump,
"m"},
118 {
"pos1-exclsats", 2, (
void*)
exsats_,
"prn ..."},
125 {
"pos1-posopt12", 0, (
void*)&
prcopt_.posopt[11],
"dB-Hz"},
127 {
"pos1-gridsel", 0, (
void*)&
prcopt_.gridsel,
"m"},
128 {
"pos1-rectype", 2, (
void*)
prcopt_.rectype[0],
""},
129 {
"pos1-signals", 2, (
void*)
signals_,
""},
135 {
"pos2-arthres", 1, (
void*)&
prcopt_.thresar[0],
""},
136 {
"pos2-arthres1", 1, (
void*)&
prcopt_.thresar[1],
""},
137 {
"pos2-arthres2", 1, (
void*)&
prcopt_.thresar[2],
""},
138 {
"pos2-arthres3", 1, (
void*)&
prcopt_.thresar[3],
""},
139 {
"pos2-arthres4", 1, (
void*)&
prcopt_.thresar[4],
""},
140 {
"pos2-arlockcnt", 0, (
void*)&
prcopt_.minlock,
""},
141 {
"pos2-arelmask", 1, (
void*)&
elmaskar_,
"deg"},
142 {
"pos2-arminfix", 0, (
void*)&
prcopt_.minfix,
""},
143 {
"pos2-armaxiter", 0, (
void*)&
prcopt_.armaxiter,
""},
144 {
"pos2-elmaskhold", 1, (
void*)&
elmaskhold_,
"deg"},
145 {
"pos2-aroutcnt", 0, (
void*)&
prcopt_.maxout,
""},
146 {
"pos2-maxage", 1, (
void*)&
prcopt_.maxtdiff,
"s"},
148 {
"pos2-slipthres", 1, (
void*)&
prcopt_.thresslip,
"m"},
149 {
"pos2-thresdop", 1, (
void*)&
prcopt_.thresdop,
"cyc/s"},
150 {
"pos2-rejethres", 1, (
void*)&
prcopt_.rejethres,
"m"},
151 {
"pos2-rejeminsat", 0, (
void*)&
prcopt_.rejeminsat,
""},
152 {
"pos2-rejionno", 1, (
void*)&
prcopt_.maxinno,
"m"},
153 {
"pos2-rejgdop", 1, (
void*)&
prcopt_.maxgdop,
""},
154 {
"pos2-niter", 0, (
void*)&
prcopt_.niter,
""},
155 {
"pos2-baselen", 1, (
void*)&
prcopt_.baseline[0],
"m"},
156 {
"pos2-basesig", 1, (
void*)&
prcopt_.baseline[1],
"m"},
171 {
"pos2-maxbiasdt", 0, (
void*)&
prcopt_.maxbiasdt,
"s"},
172 {
"pos2-sattmode", 0, (
void*)&
prcopt_.sattmode,
""},
175 {
"pos2-arminamb", 0, (
void*)&
prcopt_.minamb,
""},
176 {
"pos2-maxpdopar", 1, (
void*)&
prcopt_.maxpdopar,
""},
177 {
"pos2-maxpdophold", 1, (
void*)&
prcopt_.maxpdophold,
""},
179 {
"pos2-armaxdelsat", 0, (
void*)&
prcopt_.armaxdelsat,
""},
180 {
"pos2-varholdamb", 1, (
void*)&
prcopt_.varholdamb,
"cyc^2"},
181 {
"pos2-arthres5", 1, (
void*)&
prcopt_.thresar[5],
""},
182 {
"pos2-arthres6", 1, (
void*)&
prcopt_.thresar[6],
""},
183 {
"pos2-arminfixsats", 0, (
void*)&
prcopt_.minfixsats,
""},
184 {
"pos2-armindropsats", 0, (
void*)&
prcopt_.mindropsats,
""},
185 {
"pos2-arminholdsats", 0, (
void*)&
prcopt_.minholdsats,
""},
188 {
"pos2-rejionno1", 1, (
void*)&
prcopt_.maxinno_ext[0],
"sigma"},
189 {
"pos2-rejionno2", 1, (
void*)&
prcopt_.maxinno_ext[1],
"sigma"},
190 {
"pos2-rejionno3", 1, (
void*)&
prcopt_.maxinno_ext[2],
"sigma"},
191 {
"pos2-rejionno4", 1, (
void*)&
prcopt_.maxinno_ext[3],
""},
192 {
"pos2-rejionno5", 1, (
void*)&
prcopt_.maxinno_ext[4],
""},
193 {
"pos2-rejdiffpse", 1, (
void*)&
prcopt_.maxdiffp,
"m"},
194 {
"pos2-poserrcnt", 0, (
void*)&
prcopt_.poserrcnt,
"cnt"},
195 {
"pos2-forgetion", 1, (
void*)&
prcopt_.forgetion,
""},
196 {
"pos2-afgainion", 1, (
void*)&
prcopt_.afgainion,
""},
198 {
"pos2-forgetpva", 1, (
void*)&
prcopt_.forgetpva,
""},
199 {
"pos2-afgainpva", 1, (
void*)&
prcopt_.afgainpva,
""},
201 {
"pos2-rectype", 2, (
void*)
prcopt_.rectype[1],
""},
210 {
"out-timendec", 0, (
void*)&
solopt_.timeu,
""},
212 {
"out-fieldsep", 2, (
void*)
solopt_.sep,
""},
214 {
"out-maxsolstd", 1, (
void*)&
solopt_.maxsolstd,
"m"},
218 {
"out-nmeaintv1", 1, (
void*)&
solopt_.nmeaintv[0],
"s"},
219 {
"out-nmeaintv2", 1, (
void*)&
solopt_.nmeaintv[1],
"s"},
222 {
"stats-eratio1", 1, (
void*)&
prcopt_.eratio[0],
""},
223 {
"stats-eratio2", 1, (
void*)&
prcopt_.eratio[1],
""},
224 {
"stats-eratio3", 1, (
void*)&
prcopt_.eratio[2],
""},
225 {
"stats-errphase", 1, (
void*)&
prcopt_.err[1],
"m"},
226 {
"stats-errphaseel", 1, (
void*)&
prcopt_.err[2],
"m"},
227 {
"stats-errphasebl", 1, (
void*)&
prcopt_.err[3],
"m/10km"},
228 {
"stats-errdoppler", 1, (
void*)&
prcopt_.err[4],
"Hz"},
229 {
"stats-snrmax", 1, (
void*)&
prcopt_.err[5],
"dBHz"},
230 {
"stats-errsnr", 1, (
void*)&
prcopt_.err[6],
"m"},
231 {
"stats-erriono", 1, (
void*)&
prcopt_.stats_erriono,
"m"},
232 {
"stats-errtrop", 1, (
void*)&
prcopt_.stats_errtrop,
"m"},
233 {
"stats-stdbias", 1, (
void*)&
prcopt_.std[0],
"m"},
234 {
"stats-stdiono", 1, (
void*)&
prcopt_.std[1],
"m"},
235 {
"stats-stdtrop", 1, (
void*)&
prcopt_.std[2],
"m"},
236 {
"stats-prnaccelh", 1, (
void*)&
prcopt_.prn[3],
"m/s^2"},
237 {
"stats-prnaccelv", 1, (
void*)&
prcopt_.prn[4],
"m/s^2"},
238 {
"stats-prnbias", 1, (
void*)&
prcopt_.prn[0],
"m"},
239 {
"stats-prniono", 1, (
void*)&
prcopt_.prn[1],
"m"},
240 {
"stats-prntrop", 1, (
void*)&
prcopt_.prn[2],
"m"},
241 {
"stats-prnpos", 1, (
void*)&
prcopt_.prn[5],
"m"},
242 {
"stats-prnifb", 1, (
void*)&
prcopt_.prn[6],
"m"},
243 {
"stats-prndcb", 1, (
void*)&
prcopt_.prn[6],
"m"},
244 {
"stats-uraratio", 1, (
void*)&
prcopt_.uraratio,
""},
245 {
"stats-clkstab", 1, (
void*)&
prcopt_.sclkstab,
"s/s"},
246 {
"stats-prnionomax", 1, (
void*)&
prcopt_.prnionomax,
"m"},
247 {
"stats-prnposith", 1, (
void*)&
prcopt_.stats_prnposith,
"m"},
248 {
"stats-prnpositv", 1, (
void*)&
prcopt_.stats_prnpositv,
"m"},
249 {
"stats-tconstiono", 1, (
void*)&
prcopt_.stats_tconstiono,
"s"},
252 {
"ant1-pos1", 1, (
void*)&
antpos_[0][0],
"deg|m"},
253 {
"ant1-pos2", 1, (
void*)&
antpos_[0][1],
"deg|m"},
254 {
"ant1-pos3", 1, (
void*)&
antpos_[0][2],
"m|m"},
255 {
"ant1-anttype", 2, (
void*)
prcopt_.anttype[0],
""},
256 {
"ant1-antdele", 1, (
void*)&
prcopt_.antdel[0][0],
"m"},
257 {
"ant1-antdeln", 1, (
void*)&
prcopt_.antdel[0][1],
"m"},
258 {
"ant1-antdelu", 1, (
void*)&
prcopt_.antdel[0][2],
"m"},
261 {
"ant2-pos1", 1, (
void*)&
antpos_[1][0],
"deg|m"},
262 {
"ant2-pos2", 1, (
void*)&
antpos_[1][1],
"deg|m"},
263 {
"ant2-pos3", 1, (
void*)&
antpos_[1][2],
"m|m"},
264 {
"ant2-anttype", 2, (
void*)
prcopt_.anttype[1],
""},
265 {
"ant2-antdele", 1, (
void*)&
prcopt_.antdel[1][0],
"m"},
266 {
"ant2-antdeln", 1, (
void*)&
prcopt_.antdel[1][1],
"m"},
267 {
"ant2-antdelu", 1, (
void*)&
prcopt_.antdel[1][2],
"m"},
268 {
"ant2-maxaveep", 0, (
void*)&
prcopt_.maxaveep,
""},
272 {
"misc-sbasatsel", 0, (
void*)&
prcopt_.sbassatsel,
"0:all"},
273 {
"misc-rnxopt1", 2, (
void*)
prcopt_.rnxopt[0],
""},
274 {
"misc-rnxopt2", 2, (
void*)
prcopt_.rnxopt[1],
""},
275 {
"misc-pppopt", 2, (
void*)
prcopt_.pppopt,
""},
276 {
"misc-maxobsloss", 1, (
void*)&
prcopt_.maxobsloss_s,
"s"},
277 {
"misc-floatcnt", 0, (
void*)&
prcopt_.floatcnt,
"epoch"},
278 {
"misc-rtcmopt", 2, (
void*)&
prcopt_.rtcmopt,
""},
279 {
"misc-l6mrg", 0, (
void*)&
prcopt_.l6mrg,
""},
280 {
"misc-regularly", 0, (
void*)&
prcopt_.regularly,
""},
282 {
"file-satantfile", 2, (
void*)&
filopt_.satantp,
""},
283 {
"file-rcvantfile", 2, (
void*)&
filopt_.rcvantp,
""},
284 {
"file-staposfile", 2, (
void*)&
filopt_.stapos,
""},
285 {
"file-geoidfile", 2, (
void*)&
filopt_.geoid,
""},
286 {
"file-ionofile", 2, (
void*)&
filopt_.iono,
""},
287 {
"file-dcbfile", 2, (
void*)&
filopt_.dcb,
""},
288 {
"file-eopfile", 2, (
void*)&
filopt_.eop,
""},
289 {
"file-blqfile", 2, (
void*)&
filopt_.blq,
""},
290 {
"file-elmaskfile", 2, (
void*)&
filopt_.elmask,
""},
291 {
"file-tempdir", 2, (
void*)&
filopt_.tempdir,
""},
292 {
"file-geexefile", 2, (
void*)&
filopt_.geexe,
""},
293 {
"file-solstatfile", 2, (
void*)&
filopt_.solstat,
""},
294 {
"file-tracefile", 2, (
void*)&
filopt_.trace,
""},
295 {
"file-fcbfile", 2, (
void*)&
filopt_.fcb,
""},
296 {
"file-biafile", 2, (
void*)&
filopt_.bia,
""},
297 {
"file-cssrgridfile", 2, (
void*)&
filopt_.grid,
""},
298 {
"file-isbfile", 2, (
void*)&
filopt_.isb,
""},
299 {
"file-phacycfile", 2, (
void*)&
filopt_.phacyc,
""},
306 if ((p = strchr(str,
'#'))) {
309 for (p = str + strlen(str) - 1; p >= str && !isgraph((
int)*p); p--) {
314static int enum2str(
char* s,
const char* comment,
int val) {
315 char str[32], *p, *q;
318 n = sprintf(str,
"%d:", val);
319 if (!(p = strstr(comment, str))) {
320 return sprintf(s,
"%d", val);
322 if (!(q = strchr(p + n,
',')) && !(q = strchr(p + n,
')'))) {
324 return (
int)strlen(p + n);
326 strncpy(s, p + n, q - p - n);
328 return (
int)(q - p - n);
331static int str2enum(
const char* str,
const char* comment,
int* val) {
335 for (p = comment;; p++) {
336 if (!(p = strstr(p, str))) {
339 if (p <= comment || *(p - 1) !=
':') {
342 for (p -= 2; p >= comment &&
'0' <= *p && *p <=
'9'; p--) {
346 if (p >= comment && *p ==
'-') {
347 return sscanf(p,
"%d", val) == 1;
349 return sscanf(p + 1,
"%d", val) == 1;
351 sprintf(s,
"%.30s:", str);
352 if ((p = strstr(comment, s))) {
353 return sscanf(p,
"%d", val) == 1;
367 trace(NULL, 3,
"searchopt: name=%s\n", name);
369 for (i = 0; *opts[i].
name; i++) {
370 if (strstr(opts[i].name, name)) {
371 return (
opt_t*)(opts + i);
384 if ((opt->
var == (
void*)
prcopt_.bds2prn && strlen(str) >=
sizeof(
prcopt_.bds2prn)) ||
385 (opt->
var == (
void*)
prcopt_.bds3igso && strlen(str) >=
sizeof(
prcopt_.bds3igso))) {
393 *(
int*)opt->
var = atoi(str);
396 *(
double*)opt->
var = atof(str);
399 strcpy((
char*)opt->
var, str);
417 trace(NULL, 3,
"opt2str : name=%s\n", opt->
name);
421 p += sprintf(p,
"%d", *(
int*)opt->
var);
424 p += sprintf(p,
"%.15g", *(
double*)opt->
var);
427 p += sprintf(p,
"%s", (
char*)opt->
var);
433 return (
int)(p - str);
445 trace(NULL, 3,
"opt2buf : name=%s\n", opt->
name);
447 p += sprintf(p,
"%-18s =", opt->
name);
450 if ((n = (
int)(buff + 30 - p)) > 0) {
451 p += sprintf(p,
"%*s", n,
"");
453 p += sprintf(p,
" # (%s)", opt->
comment);
455 return (
int)(p - buff);
471 trace(NULL, 3,
"loadopts: file=%s\n", file);
474 ext = strrchr(file,
'.');
475 if (ext && strcmp(ext,
".toml") == 0) {
480 if (!(fp = fopen(file,
"r"))) {
481 trace(NULL, 1,
"loadopts: options file open error (%s)\n", file);
484 while (fgets(buff,
sizeof(buff), fp)) {
488 if (buff[0] ==
'\0') {
492 if (!(p = strstr(buff,
"="))) {
493 fprintf(stderr,
"invalid option %s (%s:%d)\n", buff, file, n);
497 while (*p ==
' ' || *p ==
'\t') {
506 fprintf(stderr,
"invalid option value %s (%s:%d)\n", buff, file, n);
523extern int saveopts(
const char* file,
const char* mode,
const char* comment,
const opt_t* opts) {
529 trace(NULL, 3,
"saveopts: file=%s mode=%s\n", file, mode);
534 ext = strrchr(file,
'.');
535 if (ext && strcmp(ext,
".toml") == 0) {
536 if (mode && strcmp(mode,
"a") == 0) {
537 trace(NULL, 1,
"saveopts: TOML append not supported (%s)\n", file);
543 if (!(fp = fopen(file, mode))) {
544 trace(NULL, 1,
"saveopts: options file open error (%s)\n", file);
548 fprintf(fp,
"# %s\n\n", comment);
551 for (i = 0; *opts[i].
name; i++) {
553 fprintf(fp,
"%s\n", buff);
561 char buff[1024], *p, *id;
568 for (i = 0; i < 2; i++) {
590 for (i = 0; i <
MAXSAT; i++) {
595 for (p = strtok(buff,
" "); p; p = strtok(NULL,
" ")) {
604 prcopt_.exsats[sat - 1] = *p ==
'+' ? 2 : 1;
608 for (i = 0; i < NFREQ; i++) {
609 for (j = 0; j < 9; j++) {
610 prcopt_.snrmask.mask[i][j] = 0.0;
613 for (p = strtok(buff,
","), j = 0; p && j < 9; p = strtok(NULL,
",")) {
614 prcopt_.snrmask.mask[i][j++] = atof(p);
619 const char* sigs[64];
620 int nsig = 0, nf = 0;
623 for (p = strtok(buff,
","); p && nsig < 64; p = strtok(NULL,
",")) {
626 while (*p ==
' ' || *p ==
'\t') {
630 end = p + strlen(p) - 1;
631 while (end > p && (*end ==
' ' || *end ==
'\t')) {
639 if (nf > 0 && nf <= NFREQ) {
643 trace(NULL, 3,
"buff2sysopts: signals configured (%d signals, nf=%d)\n", nsig, nf);
645 trace(NULL, 1,
"buff2sysopts: nf=%d exceeds NFREQ=%d for signals '%s'\n", nf, NFREQ,
signals_);
648 trace(NULL, 1,
"buff2sysopts: invalid signals string '%s'\n",
signals_);
662 for (i = 0; i < 2; i++) {
683 p += sprintf(p,
"%s%s%s", p ==
exsats_ ?
"" :
" ",
prcopt_.exsats[sat - 1] == 2 ?
"+" :
"",
id);
687 for (i = 0; i < NFREQ; i++) {
690 for (j = 0; j < 9; j++) {
691 p += sprintf(p,
"%s%.0f", j > 0 ?
"," :
"",
prcopt_.snrmask.mask[i][j]);
703 trace(NULL, 3,
"resetsysopts:\n");
715 for (i = 0; i < 2; i++) {
721 for (i = 0; i < 2; i++) {
722 for (j = 0; j < 3; j++) {
739 trace(NULL, 3,
"getsysopts:\n");
761 trace(NULL, 3,
"setsysopts:\n");
void satno2id(int sat, char *id)
int satid2no(const char *id)
void pos2ecef(const double *pos, double *r)
Transform geodetic position to ECEF position.
void ecef2pos(const double *r, double *pos)
Transform ECEF position to geodetic position.
MRTKLIB Coordinates Module — Coordinate transformations and geometry.
MRTKLIB Navigation Module — Navigation data types and satellite/nav utility functions.
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_sigcfg_to_obsdef(const mrtk_sigcfg_t *cfg)
Apply signal config to obsdef tables (bridge to existing system).
MRTKLIB Observation Module — Observation data types and utility functions.
const prcopt_t prcopt_default
const solopt_t solopt_default
int loadopts(const char *file, opt_t *opts)
Load options from file.
static double elmaskhold_
void getsysopts(prcopt_t *popt, solopt_t *sopt, filopt_t *fopt)
Get system options.
int saveopts(const char *file, const char *mode, const char *comment, const opt_t *opts)
Save options to file.
static double antpos_[2][3]
static int antpostype_[2]
int opt2str(const opt_t *opt, char *str)
Convert option value to string.
opt_t * searchopt(const char *name, const opt_t *opts)
Search option record.
static void chop(char *str)
int opt2buf(const opt_t *opt, char *buff)
Convert option to string (keyword=value # comment).
static int enum2str(char *s, const char *comment, int val)
opt_t sysopts[]
System options table.
static char exsats_[1024]
static char snrmask_[5][1024]
static void buff2sysopts(void)
static void sysopts2buff(void)
static int str2enum(const char *str, const char *comment, int *val)
int str2opt(opt_t *opt, const char *str)
Convert string to option value.
void setsysopts(const prcopt_t *prcopt, const solopt_t *solopt, const filopt_t *filopt)
Set system options.
void resetsysopts(void)
Reset system options to default.
static char signals_[1024]
static int bds2prn_given_
MRTKLIB Options Module — Configuration option parsing and system option management.
int loadopts_toml(const char *file, opt_t *opts)
Load options from a TOML configuration file.
int saveopts_toml(const char *file, const char *comment, const opt_t *opts)
Save options to a TOML configuration file.
void trace(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message.
MRTKLIB Trace Module — debug trace and logging functions.
Option type for configuration file parsing.