44 return (1001 <= msg && msg <= 1004) || (1009 <= msg && msg <= 1012) || (1071 <= msg && msg <= 1077) ||
45 (1081 <= msg && msg <= 1087) || (1091 <= msg && msg <= 1097) || (1101 <= msg && msg <= 1107) ||
46 (1111 <= msg && msg <= 1117) || (1121 <= msg && msg <= 1127) || (1131 <= msg && msg <= 1137);
50 return msg == 1019 || msg == 1020 || msg == 1044 || msg == 1045 || msg == 1046 || msg == 1042 || msg == 63 ||
55 return msg == 1005 || msg == 1006 || msg == 1007 || msg == 1008 || msg == 1033 || msg == 1230;
59 if (tint <= 0.0)
return 1;
72extern strconv_t*
strconvnew(
int itype,
int otype,
const char* msgs,
int staid,
int stasel,
const char* opt) {
82 if (!msgs || strlen(msgs) >=
sizeof(buff)) {
86 snprintf(buff,
sizeof(buff),
"%s", msgs);
87 for (p = strtok(buff,
","); p; p = strtok(NULL,
",")) {
89 if (sscanf(p,
"%d(%lf)", &msg, &tint) < 1)
continue;
94 if (conv->
nmsg >= 32)
break;
96 if (conv->
nmsg <= 0) {
113 if (stasel) conv->
out.
staid = staid;
114 snprintf(conv->
rtcm.
opt,
sizeof(conv->
rtcm.
opt),
"-EPHALL %s", opt);
115 snprintf(conv->
raw.
opt,
sizeof(conv->
raw.
opt),
"-EPHALL %s", opt);
132 int i, sat, set, sys, prn;
137 for (i = 0; i < raw->
obs.
n; i++) {
147 }
else if (ret == 2) {
160 }
else if (ret == 5) {
162 }
else if (ret == 9) {
179 int i, sat, set, sys, prn;
186 for (i = 0; i <
rtcm->obs.n; i++) {
190 if (sys ==
SYS_GLO &&
rtcm->nav.glo_fcn[prn - 1]) {
195 }
else if (ret == 2) {
208 }
else if (ret == 5) {
209 if (!stasel) out->
sta =
rtcm->sta;
215 int i, j, n, ns, sys, nobs, code, nsat = 0, nsig = 0, nmsg, mask[
MAXCODE] = {0};
217 if (1071 <= msg && msg <= 1077)
219 else if (1081 <= msg && msg <= 1087)
221 else if (1091 <= msg && msg <= 1097)
223 else if (1101 <= msg && msg <= 1107)
225 else if (1111 <= msg && msg <= 1117)
227 else if (1121 <= msg && msg <= 1127)
229 else if (1131 <= msg && msg <= 1137)
238 for (i = 0; i < nobs && i <
MAXOBS; i++) {
239 if (
satsys(data[i].sat, NULL) != sys)
continue;
241 for (j = 0; j < NFREQ + NEXOBS; j++) {
242 if (!(code = data[i].code[j]) || mask[code - 1])
continue;
247 if (nsig > 64)
return;
252 nmsg = (nsat - 1) / ns + 1;
259 for (i = j = 0; i < nmsg; i++) {
260 for (n = 0; n < ns && j < nobs && j <
MAXOBS; j++) {
261 if (
satsys(data[j].sat, NULL) != sys)
continue;
266 if (
gen_rtcm3(out, msg, 0, i < nmsg - 1 ? 1 : sync)) {
277 for (i = 0; i < conv->
nmsg; i++) {
282 for (i = 0; i < conv->
nmsg; i++) {
292 if (conv->
msgs[i] <= 1012) {
305 for (i = 0; i < conv->
nmsg; i++) {
322 int sys, set, p, p0, p1, p2;
371 if (
satsys(sat, &p0) != sys)
return satno(sys, p1);
374 for (p = p0 >= p2 ? p1 : p0 + 1; p != p0; p = p >= p2 ? p1 : p + 1) {
377 if (nav->
geph[p - 1].
sat == sat)
return sat;
380 if (nav->
eph[sat - 1 +
MAXSAT * set].
sat == sat)
return sat;
390 for (i = 0; i < conv->
nmsg; i++) {
394 tint = (int)(conv->
tint[i] * 1000.0);
395 if ((
int)(tick - conv->
tick[i]) < tint)
continue;
396 conv->
tick[i] = tick;
421 for (i = 0; i < conv->
nmsg; i++) {
425 tint = conv->
tint[i] == 0.0 ? 30000 : (int)(conv->
tint[i] * 1000.0);
426 if ((
int)(tick - conv->
tick[i]) < tint)
continue;
427 conv->
tick[i] = tick;
445 for (i = 0; i < n; i++) {
477 const char *p = cmd, *q;
481 for (p = cmd;; p = q + 1) {
483 if (*q ==
'\r' || *q ==
'\n' || *q ==
'\0')
break;
485 if (n >= (
int)
sizeof(msg)) {
486 n = (int)
sizeof(msg) - 1;
492 if ((r = strrchr(msg,
'#'))) {
493 sscanf(r,
"# %d", &period);
496 while (r > msg && *(r - 1) ==
' ') {
501 if (period <= 0) period = 1000;
502 if (*msg && cycle % period == 0) {
511 sol_t sol_nmea = {{0}};
512 uint32_t tick, tick_nmea;
516 tracet(NULL, 3,
"strsvrthread:\n");
519 tick_nmea = svr->
tick - 1000;
521 for (cyc = 0; svr->
state; cyc++) {
527 for (i = 1; i < svr->
nstr; i++) {
528 if (svr->
conv[i - 1]) {
538 for (i = 0; i < n && svr->
npb < svr->
buffsize; i++) {
543 for (i = 1; i < svr->
nstr; i++) {
545 while ((n =
strread(svr->
stream + i, buff,
sizeof(buff))) > 0) {
555 for (i = 0; i < svr->
nstr; i++) {
587 tracet(NULL, 3,
"strsvrinit: nout=%d\n", nout);
596 for (i = 0; i < 3; i++) svr->
nmeapos[i] = 0.0;
599 for (i = 0; i < nout + 1 && i < 16; i++)
strinit(svr->
stream + i);
600 for (i = 0; i < nout + 1 && i < 16; i++)
strinit(svr->
strlog + i);
602 for (i = 0; i < 16; i++) svr->
conv[i] = NULL;
657 char** cmds_periodic,
const double* nmeapos) {
658 int i, rw, stropt[5] = {0};
661 tracet(NULL, 3,
"strsvrstart:\n");
663 if (svr->
state)
return 0;
667 for (i = 0; i < 4; i++) stropt[i] = opts[i];
670 svr->
cycle = opts[4];
671 svr->
buffsize = opts[3] < 4096 ? 4096 : opts[3];
672 svr->
nmeacycle = 0 < opts[5] && opts[5] < 1000 ? 1000 : opts[5];
674 for (i = 0; i < 3; i++) svr->
nmeapos[i] = nmeapos ? nmeapos[i] : 0.0;
675 for (i = 0; i < svr->
nstr; i++) {
676 strcpy(svr->
cmds_periodic[i], !cmds_periodic[i] ?
"" : cmds_periodic[i]);
678 for (i = 0; i < svr->
nstr - 1; i++) svr->
conv[i] = conv[i];
686 for (i = 0; i < svr->
nstr; i++) {
687 strcpy(file1, paths[0]);
688 if ((p = strstr(file1,
"::"))) *p =
'\0';
689 strcpy(file2, paths[i]);
690 if ((p = strstr(file2,
"::"))) *p =
'\0';
691 if (i > 0 && *file1 && !strcmp(file1, file2)) {
692 sprintf(svr->
stream[i].
msg,
"output path error: %-512.512s", file2);
701 if (
stropen(svr->
stream + i, strs[i], rw, paths[i]))
continue;
706 for (i = 0; i < svr->
nstr; i++) {
711 for (i = 0; i < svr->
nstr; i++) {
712 if (!cmds[i])
continue;
741 tracet(NULL, 3,
"strsvrstop:\n");
743 for (i = 0; i < svr->
nstr; i++) {
748 pthread_join(svr->
thread, NULL);
760extern void strsvrstat(
strsvr_t* svr,
int* stat,
int* log_stat, uint64_t*
byte,
int* bps,
char* msg) {
764 tracet(NULL, 4,
"strsvrstat:\n");
766 for (i = 0; i < svr->
nstr; i++) {
770 strsum(svr->
stream + i, NULL, &bps_in,
byte + i, bps + i);
773 if (*s) p += sprintf(p,
"(%d) %s ", i, s);
787 if (!svr->
state)
return 0;
790 n = svr->
npb < nmax ? svr->
npb : nmax;
792 memcpy(buff, svr->
pbuf, n);
int satsys(int sat, int *prn)
int strwrite(struct stream_tag *stream, uint8_t *buff, int n)
void matcpy(double *A, const double *B, int n, int m)
Copy matrix.
int satno(int sys, int prn)
Convert satellite system+prn/slot number to satellite number.
void free_raw(raw_t *raw)
Free receiver raw data control struct.
int input_raw(raw_t *raw, rtcm_t *rtcm, int format, uint8_t data)
Input receiver raw data from stream (byte-by-byte).
int init_raw(raw_t *raw, int format)
Initialize receiver raw data control struct.
int gen_rtcm2(rtcm_t *rtcm, int type, int sync)
Generate RTCM 2 message.
void free_rtcm(rtcm_t *rtcm)
Free RTCM control struct.
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_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).
void strinit(stream_t *stream)
Initialize stream structure.
int strstat(stream_t *stream, char *msg)
Get stream status.
int strread(stream_t *stream, uint8_t *buff, int n)
Read data from stream.
void strsendnmea(stream_t *stream, const sol_t *sol)
Send NMEA request to stream.
void strsetopt(const int *opt)
Set stream options.
void strinitcom(void)
Initialize stream communication system.
void strclose(stream_t *stream)
Close stream.
int stropen(stream_t *stream, int type, int mode, const char *path)
Open stream.
void strsum(stream_t *stream, uint64_t *inb, int *inr, uint64_t *outb, int *outr)
Get stream statistics summary.
void strsendcmd(stream_t *str, const char *cmd)
Send receiver command to stream.
struct stream_tag stream_t
static int nextsat(nav_t *nav, int sat, int msg)
void strsvrinit(strsvr_t *svr, int nout)
static void write_rtcm3_msm(stream_t *str, rtcm_t *out, int msg, int sync)
static void write_obs(gtime_t time, stream_t *str, strconv_t *conv)
static int is_navmsg(int msg)
static void * strsvrthread(void *arg)
void strsvrstat(strsvr_t *svr, int *stat, int *log_stat, uint64_t *byte, int *bps, char *msg)
Get stream server status.
static int is_obsmsg(int msg)
static void rtcm2rtcm(rtcm_t *out, const rtcm_t *rtcm, int ret, int stasel)
static void write_nav_cycle(stream_t *str, strconv_t *conv)
void strsvrstop(strsvr_t *svr, char **cmds)
strconv_t * strconvnew(int itype, int otype, const char *msgs, int staid, int stasel, const char *opt)
static void periodic_cmd(int cycle, const char *cmd, stream_t *stream)
static void strconv(stream_t *str, strconv_t *conv, uint8_t *buff, int n)
int strsvrstart(strsvr_t *svr, int *opts, int *strs, char **paths, char **logs, strconv_t **conv, char **cmds, char **cmds_periodic, const double *nmeapos)
static void write_nav(gtime_t time, stream_t *str, strconv_t *conv)
void strconvfree(strconv_t *conv)
static void write_sta_cycle(stream_t *str, strconv_t *conv)
static int is_tint(gtime_t time, double tint)
static void raw2rtcm(rtcm_t *out, const raw_t *raw, int ret)
static int is_stamsg(int msg)
int strsvrpeek(strsvr_t *svr, uint8_t *buff, int nmax)
void sleepms(int ms)
Sleep for specified milliseconds.
double time2gpst(gtime_t t, int *week)
Convert gtime_t to GPS week/tow.
gtime_t utc2gpst(gtime_t t)
Convert UTC to GPS time considering leap seconds.
gtime_t timeget(void)
Get current time in UTC.
uint32_t tickget(void)
Get current tick in milliseconds.
void tracet(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message with elapsed time.
GNSS time representation.
Receiver raw data control type.
RTCM control struct type.
char cmds_periodic[16][MAXRCVCMD]