MRTKLIB 0.7.14
Modernized GNSS Positioning Library
Loading...
Searching...
No Matches
mrtk_trace.c
Go to the documentation of this file.
1/*------------------------------------------------------------------------------
2 * mrtk_trace.c : debug trace and logging functions
3 *
4 * Copyright (C) 2026 H.SHIONO (MRTKLIB Project)
5 * Copyright (C) 2023-2025 Cabinet Office, Japan
6 * Copyright (C) 2024-2025 Lighthouse Technology & Consulting Co. Ltd.
7 * Copyright (C) 2023-2025 Japan Aerospace Exploration Agency
8 * Copyright (C) 2023-2025 TOSHIBA ELECTRONIC TECHNOLOGIES CORPORATION
9 * Copyright (C) 2015- Mitsubishi Electric Corp.
10 * Copyright (C) 2014 Geospatial Information Authority of Japan
11 * Copyright (C) 2014 T.SUZUKI
12 * Copyright (C) 2007-2023 T.TAKASU
13 *
14 * SPDX-License-Identifier: BSD-2-Clause
15 *----------------------------------------------------------------------------*/
16#include "mrtklib/mrtk_trace.h"
17
18#include "mrtklib/mrtk_nav.h"
19#include "mrtklib/mrtk_obs.h"
20#include "mrtklib/mrtk_sys.h"
21#include "mrtklib/mrtk_time.h"
22
23/**
24 * @brief Resolve context: use explicit ctx if non-NULL, else fall back to global.
25 */
26#define CTX(c) ((c) ? (c) : g_mrtk_ctx)
27
28#ifdef TRACE
29
30#include <stdarg.h>
31#include <stdio.h>
32#include <string.h>
33
34extern void traceopen(mrtk_ctx_t* ctx, const char* file) {
35 mrtk_ctx_t* c = CTX(ctx);
36 if (!c) {
37 return;
38 }
39
40 /* Close existing trace file if any */
41 if (c->trace_fp && c->trace_fp != stdout && c->trace_fp != stderr) {
42 fclose(c->trace_fp);
43 c->trace_fp = NULL;
44 }
45
46 if (file && *file) {
47 /* expand time/station keywords (%Y %m %d %h %M ...) like stream paths do (#83);
48 reppath() does an unbounded strcpy into rpath, so skip expansion for an
49 over-long path rather than overflow the buffer */
50 char rpath[MAXSTRPATH];
51 if (strlen(file) < sizeof(rpath)) {
52 reppath(file, rpath, utc2gpst(timeget()), "", "");
53 c->trace_fp = fopen(rpath, "w");
54 } else {
55 c->trace_fp = fopen(file, "w");
56 }
57 }
58 c->tick_trace = tickget();
59}
60extern void traceclose(mrtk_ctx_t* ctx) {
61 mrtk_ctx_t* c = CTX(ctx);
62 if (!c) {
63 return;
64 }
65
66 if (c->trace_fp && c->trace_fp != stdout && c->trace_fp != stderr) {
67 fclose(c->trace_fp);
68 }
69 c->trace_fp = NULL;
70}
71extern void tracelevel(mrtk_ctx_t* ctx, int level) {
72 mrtk_ctx_t* c = CTX(ctx);
73 if (!c) {
74 return;
75 }
76 c->trace_level = level;
77}
78extern void trace(mrtk_ctx_t* ctx, int level, const char* format, ...) {
79 mrtk_ctx_t* c = CTX(ctx);
80 va_list ap;
81
82 if (!c || !c->trace_fp || level < 1 || level > c->trace_level) {
83 return;
84 }
85
86 va_start(ap, format);
87 vfprintf(c->trace_fp, format, ap);
88 va_end(ap);
89 fflush(c->trace_fp);
90}
91extern void tracet(mrtk_ctx_t* ctx, int level, const char* format, ...) {
92 mrtk_ctx_t* c = CTX(ctx);
93 va_list ap;
94
95 if (!c || !c->trace_fp || level < 1 || level > c->trace_level) {
96 return;
97 }
98
99 fprintf(c->trace_fp, "%d %9.3f: ", level, (tickget() - c->tick_trace) / 1000.0);
100
101 va_start(ap, format);
102 vfprintf(c->trace_fp, format, ap);
103 va_end(ap);
104 fflush(c->trace_fp);
105}
106extern void tracemat(mrtk_ctx_t* ctx, int level, const double* A, int n, int m, int p, int q) {
107 mrtk_ctx_t* c = CTX(ctx);
108 int i, j;
109
110 if (!c || !c->trace_fp || level < 1 || level > c->trace_level) {
111 return;
112 }
113
114 for (i = 0; i < n; i++) {
115 for (j = 0; j < m; j++) {
116 fprintf(c->trace_fp, " %*.*f", p, q, A[i + j * n]);
117 }
118 fprintf(c->trace_fp, "\n");
119 }
120 fflush(c->trace_fp);
121}
122extern void traceobs(mrtk_ctx_t* ctx, int level, const obsd_t* obs, int n) {
123 mrtk_ctx_t* c = CTX(ctx);
124 char str[64], id[16];
125 int i;
126
127 if (!c || !c->trace_fp || level < 1 || level > c->trace_level) {
128 return;
129 }
130
131 for (i = 0; i < n; i++) {
132 time2str(obs[i].time, str, 3);
133 satno2id(obs[i].sat, id);
134 fprintf(c->trace_fp,
135 " (%2d) %s %-3s rcv%d %13.3f %13.3f %13.3f %13.3f"
136 " %d %d %d %d %3.1f %3.1f\n",
137 i + 1, str, id, obs[i].rcv, obs[i].L[0], obs[i].L[1], obs[i].P[0], obs[i].P[1], obs[i].LLI[0],
138 obs[i].LLI[1], obs[i].code[0], obs[i].code[1], obs[i].SNR[0] * SNR_UNIT, obs[i].SNR[1] * SNR_UNIT);
139 }
140 fflush(c->trace_fp);
141}
142extern void tracenav(mrtk_ctx_t* ctx, int level, const nav_t* nav) {
143 mrtk_ctx_t* c = CTX(ctx);
144 char s1[64], s2[64], id[16];
145 int i;
146
147 if (!c || !c->trace_fp || level < 1 || level > c->trace_level) {
148 return;
149 }
150
151 for (i = 0; i < nav->n; i++) {
152 time2str(nav->eph[i].toe, s1, 0);
153 time2str(nav->eph[i].ttr, s2, 0);
154 satno2id(nav->eph[i].sat, id);
155 fprintf(c->trace_fp, "(%3d) %-3s : %s %s %3d %3d %02x\n", i + 1, id, s1, s2, nav->eph[i].iode, nav->eph[i].iodc,
156 nav->eph[i].svh);
157 }
158 fprintf(c->trace_fp, "(ion) %9.4e %9.4e %9.4e %9.4e\n", nav->ion_gps[0], nav->ion_gps[1], nav->ion_gps[2],
159 nav->ion_gps[3]);
160 fprintf(c->trace_fp, "(ion) %9.4e %9.4e %9.4e %9.4e\n", nav->ion_gps[4], nav->ion_gps[5], nav->ion_gps[6],
161 nav->ion_gps[7]);
162 fprintf(c->trace_fp, "(ion) %9.4e %9.4e %9.4e %9.4e\n", nav->ion_gal[0], nav->ion_gal[1], nav->ion_gal[2],
163 nav->ion_gal[3]);
164 fflush(c->trace_fp);
165}
166extern void tracegnav(mrtk_ctx_t* ctx, int level, const nav_t* nav) {
167 mrtk_ctx_t* c = CTX(ctx);
168 char s1[64], s2[64], id[16];
169 int i;
170
171 if (!c || !c->trace_fp || level < 1 || level > c->trace_level) {
172 return;
173 }
174
175 for (i = 0; i < nav->ng; i++) {
176 time2str(nav->geph[i].toe, s1, 0);
177 time2str(nav->geph[i].tof, s2, 0);
178 satno2id(nav->geph[i].sat, id);
179 fprintf(c->trace_fp, "(%3d) %-3s : %s %s %2d %2d %8.3f\n", i + 1, id, s1, s2, nav->geph[i].frq,
180 nav->geph[i].svh, nav->geph[i].taun * 1E6);
181 }
182 fflush(c->trace_fp);
183}
184extern void tracehnav(mrtk_ctx_t* ctx, int level, const nav_t* nav) {
185 mrtk_ctx_t* c = CTX(ctx);
186 char s1[64], s2[64], id[16];
187 int i;
188
189 if (!c || !c->trace_fp || level < 1 || level > c->trace_level) {
190 return;
191 }
192
193 for (i = 0; i < nav->ns; i++) {
194 time2str(nav->seph[i].t0, s1, 0);
195 time2str(nav->seph[i].tof, s2, 0);
196 satno2id(nav->seph[i].sat, id);
197 fprintf(c->trace_fp, "(%3d) %-3s : %s %s %2d %2d\n", i + 1, id, s1, s2, nav->seph[i].svh, nav->seph[i].sva);
198 }
199 fflush(c->trace_fp);
200}
201extern void tracepeph(mrtk_ctx_t* ctx, int level, const nav_t* nav) {
202 mrtk_ctx_t* c = CTX(ctx);
203 char s[64], id[16];
204 int i, j;
205
206 if (!c || !c->trace_fp || level < 1 || level > c->trace_level) {
207 return;
208 }
209
210 for (i = 0; i < nav->ne; i++) {
211 time2str(nav->peph[i].time, s, 0);
212 for (j = 0; j < MAXSAT; j++) {
213 satno2id(j + 1, id);
214 fprintf(c->trace_fp,
215 "%-3s %d %-3s %13.3f %13.3f %13.3f %13.3f"
216 " %6.3f %6.3f %6.3f %6.3f\n",
217 s, nav->peph[i].index, id, nav->peph[i].pos[j][0], nav->peph[i].pos[j][1], nav->peph[i].pos[j][2],
218 nav->peph[i].pos[j][3] * 1E9, nav->peph[i].std[j][0], nav->peph[i].std[j][1],
219 nav->peph[i].std[j][2], nav->peph[i].std[j][3] * 1E9);
220 }
221 }
222 fflush(c->trace_fp);
223}
224extern void tracepclk(mrtk_ctx_t* ctx, int level, const nav_t* nav) {
225 mrtk_ctx_t* c = CTX(ctx);
226 char s[64], id[16];
227 int i, j;
228
229 if (!c || !c->trace_fp || level < 1 || level > c->trace_level) {
230 return;
231 }
232
233 for (i = 0; i < nav->nc; i++) {
234 time2str(nav->pclk[i].time, s, 0);
235 for (j = 0; j < MAXSAT; j++) {
236 satno2id(j + 1, id);
237 fprintf(c->trace_fp, "%-3s %d %-3s %13.3f %6.3f\n", s, nav->pclk[i].index, id, nav->pclk[i].clk[j][0] * 1E9,
238 nav->pclk[i].std[j][0] * 1E9);
239 }
240 }
241 fflush(c->trace_fp);
242}
243extern void traceb(mrtk_ctx_t* ctx, int level, const uint8_t* p, int n) {
244 mrtk_ctx_t* c = CTX(ctx);
245 int i;
246
247 if (!c || !c->trace_fp || level < 1 || level > c->trace_level) {
248 return;
249 }
250
251 for (i = 0; i < n; i++) {
252 fprintf(c->trace_fp, "%02X%s", *p++, i % 8 == 7 ? " " : "");
253 }
254 fprintf(c->trace_fp, "\n");
255 fflush(c->trace_fp);
256}
257#else
258extern void traceopen(mrtk_ctx_t* ctx, const char* file) {
259 (void)ctx;
260 (void)file;
261}
262extern void traceclose(mrtk_ctx_t* ctx) { (void)ctx; }
263extern void tracelevel(mrtk_ctx_t* ctx, int level) {
264 (void)ctx;
265 (void)level;
266}
267extern void trace(mrtk_ctx_t* ctx, int level, const char* format, ...) {
268 (void)ctx;
269 (void)level;
270 (void)format;
271}
272extern void tracet(mrtk_ctx_t* ctx, int level, const char* format, ...) {
273 (void)ctx;
274 (void)level;
275 (void)format;
276}
277extern void tracemat(mrtk_ctx_t* ctx, int level, const double* A, int n, int m, int p, int q) {
278 (void)ctx;
279 (void)level;
280 (void)A;
281 (void)n;
282 (void)m;
283 (void)p;
284 (void)q;
285}
286extern void traceobs(mrtk_ctx_t* ctx, int level, const obsd_t* obs, int n) {
287 (void)ctx;
288 (void)level;
289 (void)obs;
290 (void)n;
291}
292extern void tracenav(mrtk_ctx_t* ctx, int level, const nav_t* nav) {
293 (void)ctx;
294 (void)level;
295 (void)nav;
296}
297extern void tracegnav(mrtk_ctx_t* ctx, int level, const nav_t* nav) {
298 (void)ctx;
299 (void)level;
300 (void)nav;
301}
302extern void tracehnav(mrtk_ctx_t* ctx, int level, const nav_t* nav) {
303 (void)ctx;
304 (void)level;
305 (void)nav;
306}
307extern void tracepeph(mrtk_ctx_t* ctx, int level, const nav_t* nav) {
308 (void)ctx;
309 (void)level;
310 (void)nav;
311}
312extern void tracepclk(mrtk_ctx_t* ctx, int level, const nav_t* nav) {
313 (void)ctx;
314 (void)level;
315 (void)nav;
316}
317extern void traceb(mrtk_ctx_t* ctx, int level, const uint8_t* p, int n) {
318 (void)ctx;
319 (void)level;
320 (void)p;
321 (void)n;
322}
323
324#endif /* TRACE */
void satno2id(int sat, char *id)
Definition mrtk_nav.c:817
#define MAXSAT
Definition mrtk_coords.c:45
struct nav_s nav_t
Definition mrtk_eph.h:40
#define SNR_UNIT
#define MAXSTRPATH
MRTKLIB Navigation Module — Navigation data types and satellite/nav utility functions.
MRTKLIB Observation Module — Observation data types and utility functions.
int reppath(const char *path, char *rpath, gtime_t time, const char *rov, const char *base)
Replace keywords in file path with date, time, rover and base station id.
Definition mrtk_sys.c:248
MRTKLIB System Module — OS/filesystem utility functions.
void time2str(gtime_t t, char *s, int n)
Convert gtime_t struct to string.
Definition mrtk_time.c:507
gtime_t utc2gpst(gtime_t t)
Convert UTC to GPS time considering leap seconds.
Definition mrtk_time.c:440
gtime_t timeget(void)
Get current time in UTC.
Definition mrtk_time.c:289
uint32_t tickget(void)
Get current tick in milliseconds.
Definition mrtk_time.c:566
MRTKLIB Time Module — GNSS time types and conversion functions.
void tracegnav(mrtk_ctx_t *ctx, int level, const nav_t *nav)
Output trace GLONASS navigation data.
Definition mrtk_trace.c:166
#define CTX(c)
Resolve context: use explicit ctx if non-NULL, else fall back to global.
Definition mrtk_trace.c:26
void traceopen(mrtk_ctx_t *ctx, const char *file)
Open trace output (initializes tick counter for tracet).
Definition mrtk_trace.c:34
void tracenav(mrtk_ctx_t *ctx, int level, const nav_t *nav)
Output trace navigation data (GPS ephemeris).
Definition mrtk_trace.c:142
void tracehnav(mrtk_ctx_t *ctx, int level, const nav_t *nav)
Output trace SBAS navigation data.
Definition mrtk_trace.c:184
void traceobs(mrtk_ctx_t *ctx, int level, const obsd_t *obs, int n)
Output trace observation data.
Definition mrtk_trace.c:122
void tracelevel(mrtk_ctx_t *ctx, int level)
Set trace level.
Definition mrtk_trace.c:71
void tracepclk(mrtk_ctx_t *ctx, int level, const nav_t *nav)
Output trace precise clock data.
Definition mrtk_trace.c:224
void traceclose(mrtk_ctx_t *ctx)
Close trace output.
Definition mrtk_trace.c:60
void traceb(mrtk_ctx_t *ctx, int level, const uint8_t *p, int n)
Output trace binary data.
Definition mrtk_trace.c:243
void tracemat(mrtk_ctx_t *ctx, int level, const double *A, int n, int m, int p, int q)
Output trace matrix.
Definition mrtk_trace.c:106
void tracet(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message with elapsed time.
Definition mrtk_trace.c:91
void tracepeph(mrtk_ctx_t *ctx, int level, const nav_t *nav)
Output trace precise ephemeris data.
Definition mrtk_trace.c:201
void trace(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message.
Definition mrtk_trace.c:78
MRTKLIB Trace Module — debug trace and logging functions.
int sat
Definition mrtk_eph.h:78
gtime_t ttr
Definition mrtk_eph.h:88
int svh
Definition mrtk_eph.h:81
gtime_t toe
Definition mrtk_eph.h:88
int iode
Definition mrtk_eph.h:79
int iodc
Definition mrtk_eph.h:79
gtime_t toe
Definition mrtk_eph.h:118
int svh
Definition mrtk_eph.h:115
double taun
Definition mrtk_eph.h:123
gtime_t tof
Definition mrtk_eph.h:119
int sat
Definition mrtk_eph.h:112
int frq
Definition mrtk_eph.h:114
Runtime context for MRTKLIB processing.
FILE * trace_fp
uint32_t tick_trace
int ng
Definition mrtk_nav.h:394
seph_t * seph
Definition mrtk_nav.h:408
geph_t * geph
Definition mrtk_nav.h:407
pclk_t * pclk
Definition mrtk_nav.h:410
peph_t * peph
Definition mrtk_nav.h:409
double ion_gal[4]
Definition mrtk_nav.h:422
eph_t * eph
Definition mrtk_nav.h:400
int nc
Definition mrtk_nav.h:397
double ion_gps[8]
Definition mrtk_nav.h:421
int ns
Definition mrtk_nav.h:395
int n
Definition mrtk_nav.h:393
int ne
Definition mrtk_nav.h:396
Observation data record.
Definition mrtk_obs.h:44
uint8_t LLI[5+5]
Definition mrtk_obs.h:48
double L[5+5]
Definition mrtk_obs.h:50
uint8_t rcv
Definition mrtk_obs.h:46
double P[5+5]
Definition mrtk_obs.h:51
uint16_t SNR[5+5]
Definition mrtk_obs.h:47
uint8_t code[5+5]
Definition mrtk_obs.h:49
int index
Definition mrtk_nav.h:77
double clk[MAXSAT][1]
Definition mrtk_nav.h:78
gtime_t time
Definition mrtk_nav.h:76
float std[MAXSAT][1]
Definition mrtk_nav.h:79
float std[MAXSAT][4]
Definition mrtk_nav.h:68
double pos[MAXSAT][4]
Definition mrtk_nav.h:67
gtime_t time
Definition mrtk_nav.h:65
int index
Definition mrtk_nav.h:66
int sva
Definition mrtk_eph.h:134
gtime_t tof
Definition mrtk_eph.h:133
int sat
Definition mrtk_eph.h:131
gtime_t t0
Definition mrtk_eph.h:132
int svh
Definition mrtk_eph.h:135