From be4602bc2352e5520180e5dedc3eb4e50ff15a6c Mon Sep 17 00:00:00 2001 From: ZhiQiang_Yang98 <565093967qq.com> Date: Sat, 25 Mar 2023 14:08:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0real=20time=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TC_NAV_Zjut_post/CMakeLists.txt | 2 +- TC_NAV_Zjut_post/Src/real_time/client.c | 64 ++ TC_NAV_Zjut_post/Src/real_time/imu.c | 50 + TC_NAV_Zjut_post/Src/real_time/rt_tcfilt.c | 213 +++++ TC_NAV_Zjut_post/Src/real_time/rt_tcpos.c | 203 ++++ TC_NAV_Zjut_post/Src/real_time/rt_tcsvr.c | 879 ++++++++++++++++++ .../TC_NAV_Zjut.dir/Src/real_time/ins.c.o | Bin 28512 -> 28512 bytes .../TC_NAV_Zjut.dir/Src/real_time/nhc.c.o | Bin 8152 -> 8152 bytes .../Src/real_time/rt_doppler.c.o | Bin 24960 -> 24960 bytes .../TC_NAV_Zjut.dir/Src/real_time/rt_init.c.o | Bin 26328 -> 26328 bytes .../Src/real_time/rt_ins-gnss.c.o | Bin 45304 -> 45304 bytes .../TC_NAV_Zjut.dir/Src/real_time/rt_zaru.c.o | Bin 7824 -> 7824 bytes .../TC_NAV_Zjut.dir/Src/real_time/rt_zvu.c.o | Bin 9712 -> 9712 bytes TC_NAV_Zjut_post/cmake-build-debug/Makefile | 135 +++ .../Testing/Temporary/LastTest.log | 4 +- TC_NAV_Zjut_post/config/Tc.conf | 6 +- TC_NAV_Zjut_post/include/rtklib.h | 7 + 17 files changed, 1557 insertions(+), 6 deletions(-) create mode 100644 TC_NAV_Zjut_post/Src/real_time/client.c create mode 100644 TC_NAV_Zjut_post/Src/real_time/imu.c create mode 100644 TC_NAV_Zjut_post/Src/real_time/rt_tcfilt.c create mode 100644 TC_NAV_Zjut_post/Src/real_time/rt_tcpos.c create mode 100644 TC_NAV_Zjut_post/Src/real_time/rt_tcsvr.c diff --git a/TC_NAV_Zjut_post/CMakeLists.txt b/TC_NAV_Zjut_post/CMakeLists.txt index b224ae1..89c105f 100644 --- a/TC_NAV_Zjut_post/CMakeLists.txt +++ b/TC_NAV_Zjut_post/CMakeLists.txt @@ -15,7 +15,7 @@ if(WIN32) link_libraries(winmm.lib) endif() -add_executable(TC_NAV_Zjut main.c ${SRC_FILES} include/rtklib.h Src/real_time/ins.c Src/decode_IMU.c Src/real_time/rt_init.c Src/real_time/rt_ins-gnss.c Src/real_time/rt_doppler.c Src/real_time/nhc.c Src/post/ps_tcpos.c Src/post/insinit.c Src/real_time/rt_zvu.c Src/real_time/rt_zaru.c) +add_executable(TC_NAV_Zjut main.c ${SRC_FILES} include/rtklib.h Src/real_time/ins.c Src/decode_IMU.c Src/real_time/rt_init.c Src/real_time/rt_ins-gnss.c Src/real_time/rt_doppler.c Src/real_time/nhc.c Src/post/ps_tcpos.c Src/post/insinit.c Src/real_time/rt_zvu.c Src/real_time/rt_zaru.c Src/real_time/client.c Src/real_time/imu.c Src/real_time/rt_tcfilt.c Src/real_time/rt_tcpos.c Src/real_time/rt_tcsvr.c) # if in linux find_package(Threads REQUIRED) set(CMAKE_THREAD_PREFER_PTHREAD) diff --git a/TC_NAV_Zjut_post/Src/real_time/client.c b/TC_NAV_Zjut_post/Src/real_time/client.c new file mode 100644 index 0000000..bdcd943 --- /dev/null +++ b/TC_NAV_Zjut_post/Src/real_time/client.c @@ -0,0 +1,64 @@ +// +// Created by wakashaw on 23-3-17. +// + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "rtklib.h" + +/* open client and connect to server ------------------------------------------*/ +extern int client_open(const rtksvr_t *svr){ + struct sockaddr_in servaddr; + int n; + static int sockfd; + static int first=1; + char recvline[4096], sendline[4096]; + double llh[3]; +// const char * address="127.0.0.1"; + const char * address="81.69.233.50"; + if(first){ + if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ + printf("create socket error: %s(errno: %d)\n", strerror(errno),errno); + exit(0); + } + + if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ + printf("create socket error: %s(errno: %d)\n", strerror(errno),errno); + exit(0); + } + + memset(&servaddr, 0 ,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_port = htons(8001); + if( inet_pton(AF_INET, address, &servaddr.sin_addr) <= 0){ + printf("inet_pton error for %s\n",address); + return 0; + } + if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){ + printf("connect error: %s(errno: %d)\n",strerror(errno),errno); + return 0; + } + } + first=0; +// printf("send msg to server: \n"); +// fgets(sendline, 4096, stdin); + ecef2pos(svr->rtk.sol.rr,llh); +// printf("%3.12lf,%3.12lf\n",llh[0]*R2D,llh[1]*R2D); + sprintf(sendline,"%3.12lf,%3.12lf\n",llh[0]*R2D,llh[1]*R2D); + if( send(sockfd, sendline, strlen(sendline), 0) < 0) + { + printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); + return 0; + } + +// close(sockfd); + return 1; +} \ No newline at end of file diff --git a/TC_NAV_Zjut_post/Src/real_time/imu.c b/TC_NAV_Zjut_post/Src/real_time/imu.c new file mode 100644 index 0000000..66c0393 --- /dev/null +++ b/TC_NAV_Zjut_post/Src/real_time/imu.c @@ -0,0 +1,50 @@ +// +// Created by wakashaw on 23-3-17. +// + +#include "rtklib.h" + +/* input imu stream------------------------------------------------ + * input sample : $GYOACC,STM,,-0.07,-1.28,9.76,0.49,-1.05,0.21\r\n + * + *-----------------------------------------------------------------*/ + +extern int input_imu(raw_t *raw,imud_t *imud,uint8_t data){ + + /* synchronize frame */ + if(raw->nbyte==0){ + if(data!='$') return 0; + raw->buff[raw->nbyte++]=data; + return 0; + } + /* if not symbol '\r' keep reading data */ + if(data!='\r') { + raw->buff[raw->nbyte++]=data; + return 0; + } + raw->nbyte=0; + + return decode_imu(raw->buff,imud); +} +/* decode buff imu data ------------------------ + * args : uint8_t *buff I imu data buffer + * imud_t *imud O output imu struct + * return 11: imu output type + *-----------------------------------------------*/ +extern int decode_imu(uint8_t *buff,imud_t *imud){ + + char *str = (char*)buff; + int week; + /* raw data is right-forward-up need transfer to forward-right-down */ + sscanf(str,"$GYOACC,TDK,%lf,%lf,%lf,%lf,%lf,%lf,%lf",&imud->time,&imud->accl[1],&imud->accl[0],&imud->accl[2],&imud->gyro[1],&imud->gyro[0],&imud->gyro[2]); + imud->accl[2]=imud->accl[2]*-1.0; + imud->gyro[2]=imud->gyro[2]*-1.0; +// printf("%lf,%lf,%lf,%lf,%lf,%lf\n",imud->accl[0],imud->accl[1],imud->accl[2],imud->gyro[0],imud->gyro[1],imud->gyro[2]); + /* get time of week */ + time2gpst(utc2gpst(timeget()),&week); + /* trans unix time to tow */ + imud->time=imud->time-315964800.0 - week*7*24*3600; + imud->syn_time = gpst2time(week,imud->time); + return 11; + +} diff --git a/TC_NAV_Zjut_post/Src/real_time/rt_tcfilt.c b/TC_NAV_Zjut_post/Src/real_time/rt_tcfilt.c new file mode 100644 index 0000000..64d8e06 --- /dev/null +++ b/TC_NAV_Zjut_post/Src/real_time/rt_tcfilt.c @@ -0,0 +1,213 @@ +// +// Created by wakashaw on 23-3-17. +// +#include "rtklib.h" +#define MAXDT 60.0 /* max interval to update imu (s) */ + +/* init flag */ +static int init=0; +/* coarse align flag */ +static int coarse_init_flag = 0; +/* static detect 3s*/ +static imud_t imuz[IMUBUFF_SIZE]; +/* numebr of static imu data */ +static int i_imu=0; +/* buffer flag */ +static int full=0; + +/* save imu data to buffer for static check */ +static void loadimudata(imud_t *imud) +{ + imuz[i_imu++]=*imud; + if(i_imu==IMUBUFF_SIZE){ + full = 1; + i_imu = 0; + } +} + +/* save output buffer --------------------------------------------------------*/ +static void saveoutbuf(rtksvr_t *svr, uint8_t *buff, int n, int index) +{ + rtksvrlock(svr); + + n=nbuffsize-svr->nsb[index]?n:svr->buffsize-svr->nsb[index]; + memcpy(svr->sbuf[index]+svr->nsb[index],buff,n); + svr->nsb[index]+=n; + + rtksvrunlock(svr); +} + +/* carrier-phase bias (fcb) correction ---------------------------------------*/ +static void corr_phase_bias(obsd_t *obs, int n, const nav_t *nav) +{ + double freq; + uint8_t code; + int i,j; + + + for (i=0;issr[obs[i].sat-1].pbias[code-1]*freq/CLIGHT; + } +} + +/* write solution to output stream -------------------------------------------*/ +static void writesol(rtksvr_t *svr, int index) +{ + solopt_t solopt=solopt_default; + uint8_t buff[MAXSOLMSG+1]; + int i,n; + + tracet(4,"writesol: index=%d\n",index); + + for (i=0;i<2;i++) { + + if (svr->solopt[i].posf==SOLF_STAT) { + + /* output solution status */ + rtksvrlock(svr); + n=rtkoutstat(&svr->rtk,(char *)buff); + rtksvrunlock(svr); + } + else { + /* output solution */ + n=outsols(buff,&svr->rtk.sol,svr->rtk.rb,svr->solopt+i); + } + strwrite(svr->stream+i+3,buff,n); + + /* save output buffer */ + saveoutbuf(svr,buff,n,i); + + /* output extended solution */ + n=outsolexs(buff,&svr->rtk.sol,svr->rtk.ssat,svr->solopt+i); + strwrite(svr->stream+i+3,buff,n); + + /* save output buffer */ + saveoutbuf(svr,buff,n,i); + } + /* output solution to monitor port */ + if (svr->moni) { + n=outsols(buff,&svr->rtk.sol,svr->rtk.rb,&solopt); + strwrite(svr->moni,buff,n); + } + /* save solution buffer */ + if (svr->nsolsolbuf[svr->nsol++]=svr->rtk.sol; + rtksvrunlock(svr); + } +} + +/* tightly coupled main func ----------------------------------- + * args: + * rtksvr_t *svr + * int fobs obs data flag + * uint32_t tick tick time + * -------------------------------------------------------------*/ +extern void rt_tcfilter(rtksvr_t *svr, int fobs, uint32_t tick){ + int i,j,zf; + obs_t obs; + obsd_t data[MAXOBS*2]; + double tt,pos[3]; + obs.data=data; + int n_imu = svr->n_imu; // number of imu data + imud_t imud; + static gtime_t gt; + /* load imu data */ + if(n_imu){ + for(i=0;i<3;i++){ + imud.gyro[i]=0.0; + imud.accl[i]=0.0; + for(j=0;jimud[j].gyro[i]; + imud.accl[i]+=svr->imud[j].accl[i]; + } + imud.gyro[i]/=n_imu; + imud.accl[i]/=n_imu; + } + imud.time=svr->imud[n_imu-1].time; + imud.syn_time = svr->imud[n_imu-1].syn_time; +// printf("%lf\n", timediff(imud.syn_time,gt)); + gt = imud.syn_time; + } + else{ + imud.syn_time = timeadd(imud.syn_time,0.01); + } + /* imu buffer for static test */ + loadimudata(&imud); + /* if obs data */ + if(fobs){ + for (i=0;iobs[0][i].n&&obs.nobs[0][i].data[j]; + } + /* carrier phase bias correction */ + if (!strstr(svr->rtk.opt.pppopt,"-DIS_FCB")) { + corr_phase_bias(obs.data,obs.n,&svr->nav); + } + /* initial ins state */ + if(init==0){ + if(rt_init_ins(obs.data,svr,obs.n,imuz,i_imu,full,&svr->rtk.opt)){ + init=1; + return; + } + else return; + } + /* tightly coupled */ + rtksvrlock(svr); + tcigpos(&svr->rtk.opt,obs.data,obs.n,&svr->nav,&imud,n_imu,&svr->rtk,&svr->rtk.ins,INSUPD_MEAS); + rtksvrunlock(svr); + + /* write solution */ + if (svr->rtk.sol.stat!=SOLQ_NONE) { + + /* adjust current time */ + tt=(int)(tickget()-tick)/1000.0+DTTOL; + timeset(gpst2utc(timeadd(svr->rtk.sol.time,tt))); + + /* solution. */ + ins2sol(&svr->rtk.ins,&svr->rtk.opt.insopt,&svr->rtk.sol); + + /* write solution */ + writesol(svr,i); +#ifdef CLIENT + /* plot */ + if(!client_open(svr)){ + printf("connect to server fail\n"); + return; + } +#endif + } + /* if cpu overload, inclement obs outage counter and break */ + if ((int)(tickget()-tick)>=svr->cycle) { + svr->prcout+=fobs-i-1; + } + } + } + else{ + /* ins still initialing */ + if(init==0) return; + /* ins mechanization */ + rtksvrlock(svr); + tcigpos(&svr->rtk.opt,obs.data,obs.n,&svr->nav,&imud,n_imu,&svr->rtk,&svr->rtk.ins,INSUPD_TIME); + rtksvrunlock(svr); + } + /* non-holonomic constraint */ +// nhc(&svr->rtk.ins,&svr->rtk.opt.insopt,&imud); + + /* zero velocity/zero angular rate update */ +// ecef2pos(&svr->rtk.ins.position,pos); +// zf=detstatic_GLRT(imuz,IMUBUFF_SIZE,&svr->rtk.opt.insopt,pos); +// if(zf){ +// trace(3,"detect static\n"); +// /* zero velocity update */ +// zvu(&svr->rtk.ins,&svr->rtk.opt.insopt,imuz,1); +// /* zero angular rate update */ +// zaru(&svr->rtk.ins,&svr->rtk.opt.insopt,imuz,1); +// } + +} \ No newline at end of file diff --git a/TC_NAV_Zjut_post/Src/real_time/rt_tcpos.c b/TC_NAV_Zjut_post/Src/real_time/rt_tcpos.c new file mode 100644 index 0000000..487567e --- /dev/null +++ b/TC_NAV_Zjut_post/Src/real_time/rt_tcpos.c @@ -0,0 +1,203 @@ +// +// Created by wakashaw on 23-3-17. +// +#include +#include "rtklib.h" + +#define SQRT(x) ((x) <= 0.0 || (x) != (x) ? 0.0 : sqrt(x)) + +#define PRGNAME "rtkrcv" /* program name */ +#define CMDPROMPT "rtkrcv> " /* command prompt */ +#define MAXCON 32 /* max number of consoles */ +#define MAXARG 10 /* max number of args in a command */ +#define MAXCMD 256 /* max length of a command */ +#define MAXSTR 1024 /* max length of a stream */ +#define OPTSDIR "." /* default config directory */ +#define OPTSFILE "rtkrcv.conf" /* default config file */ +#define NAVIFILE "rtkrcv.nav" /* navigation save file */ +#define STATFILE "rtkrcv_%Y%m%d%h%M.stat" /* solution status file */ +#define TRACEFILE "rtkrcv_%Y%m%d%h%M.trace" /* debug trace file */ +#define INTKEEPALIVE 1000 /* keep alive interval (ms) */ + +/* global variables ----------------------------------------------------------*/ +static rtksvr_t svr; /* rtk server struct */ +static stream_t moni; /* monitor stream */ +static prcopt_t prcopt; /* processing options */ +static solopt_t solopt[2] = {{0}}; /* solution options */ +static filopt_t filopt = {""}; /* file options */ + +static int intflg = 0; /* interrupt flag (2:shtdown) */ + +static int strtype[] = {/* stream types */ + STR_SERIAL, STR_NONE, STR_NONE, STR_FILE, STR_FILE, STR_NONE, STR_NONE, STR_NONE}; +static char strpath[8][MAXSTR] = {"", "", "", "", "", "", "", ""}; /* stream paths */ +static int strfmt[] = { /* stream formats */ + STR_SERIAL, STR_NONE, STR_NONE, SOLF_LLH, SOLF_NMEA}; +static int svrcycle = 10; /* server cycle (ms) */ +static int timeout = 10000; /* timeout time (ms) */ +static int reconnect = 10000; /* reconnect interval (ms) */ +static int nmeacycle = 5000; /* nmea request cycle (ms) */ +static int buffsize = 32768; /* input buffer size (bytes) */ +static int navmsgsel = 0; /* navigation mesaage select */ +static char proxyaddr[256] = ""; /* http/ntrip proxy */ +static int nmeareq = 0; /* nmea request type (0:off,1:lat/lon,2:single) */ +static double nmeapos[] = {0, 0, 0}; /* nmea position (lat/lon/height) (deg,m) */ +static int modflgr[256] = {0}; /* modified flags of receiver options */ +static int modflgs[256] = {0}; /* modified flags of system options */ +static int moniport = 52002; /* monitor port */ +static int keepalive = 0; /* keep alive flag */ +static int start = 0; /* auto start */ +static int fswapmargin = 30; /* file swap margin (s) */ +static char sta_name[256] = ""; /* station name */ + +/* receiver options table ----------------------------------------------------*/ +#define TIMOPT "0:gpst,1:utc,2:jst,3:tow" +#define CONOPT "0:dms,1:deg,2:xyz,3:enu,4:pyl" +#define FLGOPT "0:off,1:std+2:age/ratio/ns" +#define ISTOPT "0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripcli,7:ftp,8:http" +#define OSTOPT "0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,5:ntripsvr,9:ntripcas" +#define FMTOPT "0:rtcm2,1:rtcm3,2:oem4,4:ubx,5:swift,6:hemis,7:skytraq,8:javad,9:nvs,10:binex,11:rt17,12:sbf,14,15:sp3,19:imu" +#define NMEOPT "0:off,1:latlon,2:single" +#define SOLOPT "0:llh,1:xyz,2:enu,3:nmea,4:stat" +#define MSGOPT "0:all,1:rover,2:base,3:corr" + +static opt_t rcvopts[] = + { + {"inpstr1-type", 3, (void *)&strtype[0], ISTOPT}, + {"inpstr2-type", 3, (void *)&strtype[1], ISTOPT}, + {"inpstr3-type", 3, (void *)&strtype[2], ISTOPT}, + {"inpstr1-path", 2, (void *)strpath[0], ""}, + {"inpstr2-path", 2, (void *)strpath[1], ""}, + {"inpstr3-path", 2, (void *)strpath[2], ""}, + {"inpstr1-format", 3, (void *)&strfmt[0], FMTOPT}, + {"inpstr2-format", 3, (void *)&strfmt[1], FMTOPT}, + {"inpstr3-format", 3, (void *)&strfmt[2], FMTOPT}, + {"inpstr2-nmeareq", 3, (void *)&nmeareq, NMEOPT}, + {"inpstr2-nmealat", 1, (void *)&nmeapos[0], "deg"}, + {"inpstr2-nmealon", 1, (void *)&nmeapos[1], "deg"}, + {"inpstr2-nmeahgt", 1, (void *)&nmeapos[2], "m"}, + {"outstr1-type", 3, (void *)&strtype[3], OSTOPT}, + {"outstr2-type", 3, (void *)&strtype[4], OSTOPT}, + {"outstr1-path", 2, (void *)strpath[3], ""}, + {"outstr2-path", 2, (void *)strpath[4], ""}, + {"outstr1-format", 3, (void *)&strfmt[3], SOLOPT}, + {"outstr2-format", 3, (void *)&strfmt[4], SOLOPT}, + {"logstr1-type", 3, (void *)&strtype[5], OSTOPT}, + {"logstr2-type", 3, (void *)&strtype[6], OSTOPT}, + {"logstr3-type", 3, (void *)&strtype[7], OSTOPT}, + {"logstr1-path", 2, (void *)strpath[5], ""}, + {"logstr2-path", 2, (void *)strpath[6], ""}, + {"logstr3-path", 2, (void *)strpath[7], ""}, + + {"misc-svrcycle", 0, (void *)&svrcycle, "ms"}, + {"misc-timeout", 0, (void *)&timeout, "ms"}, + {"misc-reconnect", 0, (void *)&reconnect, "ms"}, + {"misc-nmeacycle", 0, (void *)&nmeacycle, "ms"}, + {"misc-buffsize", 0, (void *)&buffsize, "bytes"}, + {"misc-navmsgsel", 3, (void *)&navmsgsel, MSGOPT}, + {"misc-proxyaddr", 2, (void *)proxyaddr, ""}, + {"misc-fswapmargin", 0, (void *)&fswapmargin, "s"}, + {"", 0, NULL, ""}}; + +#define MAXCON 32 /* max number of consoles */ +#define MAXARG 10 /* max number of args in a command */ +#define MAXCMD 256 /* max length of a command */ +#define MAXSTR 1024 /* max length of a stream */ + + + +/* ins-gnss tightly coupled func-------------------------------------------- + * args: + * prcopt_t *popt I options + * const char *log I input log file + * return: status (1:ok,0:fall) + */ +extern int tcpos(){ + int i, outstat = 1, trace = 3, sock = 0; + char *TRACEFILE_my = "../tracefile/nav.trace"; + char *opt_file = "../config/Tc.conf"; + static sta_t sta[MAXRCV] = {{""}}; + double pos[3] = {0.0, 0.0, 0.0}, npos[3]; + char s1[3][MAXRCVCMD] = {"", "", ""}, *cmds[] = {NULL, NULL, NULL}; + char s2[3][MAXRCVCMD] = {"", "", ""}, *cmds_periodic[] = {NULL, NULL, NULL}; + char *ropts[] = {"", "", ""}; + char *paths[] = { + strpath[0], strpath[1], strpath[2], strpath[3], strpath[4], strpath[5], + strpath[6], strpath[7] + }; + char errmsg[2048] = ""; + int stropt[8] = {0}; + if (trace > 0) + { + traceopen(TRACEFILE_my); + tracelevel(trace); + } + /* initialize rtk server */ + rtksvrinit(&svr); + // strinit(&moni); + + /* load options file */ + + resetsysopts(); /* 清空配置信息 */ + if (!loadopts(opt_file, rcvopts) || !loadopts(opt_file, sysopts)) /* 从文件中读取配置信息 */ + { + printf("no options file: %s. defaults used\n", opt_file); + } + getsysopts(&prcopt, solopt, &filopt); /* 指针指向新的配置信息 */ + + /* open solution file */ + rtkopenstat(STATFILE, outstat); + /* 设置输出解算数据的格式信息 */ + solopt[0].posf = strfmt[3]; + solopt[1].posf = strfmt[4]; + + /* startsvr */ + + /* confirm overwrite */ + if (prcopt.refpos == 4) /* 4:rtcm pos */ + { /* rtcm */ + for (i = 0; i < 3; i++) + prcopt.rb[i] = 0.0; + } + + /* 设置需要发送GGA的位置信息 初试位置信息 */ + pos[0] = nmeapos[0] * D2R; + pos[1] = nmeapos[1] * D2R; + pos[2] = nmeapos[2]; + pos2ecef(pos, npos); + + /* 接收器 / 卫星选项的修改标志 */ + for (i = 0; *rcvopts[i].name; i++) + modflgr[i] = 0; + for (i = 0; *sysopts[i].name; i++) + modflgs[i] = 0; + + /* set stream options */ + stropt[0] = timeout; + stropt[1] = reconnect; + stropt[2] = 1000; + stropt[3] = buffsize; + stropt[4] = fswapmargin; + strsetopt(stropt); + + /* start rtk server */ + if (!tcsvrstart(&svr, svrcycle, buffsize, strtype, paths, strfmt, navmsgsel, + cmds, cmds_periodic, ropts, nmeacycle, nmeareq, npos, &prcopt, + solopt, NULL, errmsg)) + return 0; + + /* 输出当前配置信息 */ + printf("\n解算信息: \n"); + prcopt.nf==1?printf("L1\n"):prcopt.nf==2?printf("L1+L2\n"):prcopt.nf==3?printf("L1+L2+L5\n"):prcopt.nf==3?printf("L1+L2+L5+L6\n"):printf("Freq err\n"); + prcopt.navsys&0x01?printf("GPS "):NULL; + prcopt.navsys&0x04?printf("GLO "):NULL; + prcopt.navsys&0x08?printf("GAL "):NULL; + prcopt.navsys&0x10?printf("QZSS "):NULL; + prcopt.navsys&0x20?printf("BDS "):NULL; + printf("\n"); + + traceclose(); + + /* 等待子线程结束 */ + return 0; +} \ No newline at end of file diff --git a/TC_NAV_Zjut_post/Src/real_time/rt_tcsvr.c b/TC_NAV_Zjut_post/Src/real_time/rt_tcsvr.c new file mode 100644 index 0000000..d663a7c --- /dev/null +++ b/TC_NAV_Zjut_post/Src/real_time/rt_tcsvr.c @@ -0,0 +1,879 @@ +// +// Created by wakashaw on 23-3-17. +// +/*------------------------------------------------------------------------------ +* rtksvr.c : rtk server functions +* +* Copyright (C) 2007-2020 by T.TAKASU, All rights reserved. +* +* options : -DWIN32 use WIN32 API +* +* version : $Revision:$ $Date:$ +* history : 2009/01/07 1.0 new +* 2009/06/02 1.1 support glonass +* 2010/07/25 1.2 support correction input/log stream +* supoort online change of output/log streams +* supoort monitor stream +* added api: +* rtksvropenstr(),rtksvrclosestr() +* changed api: +* rtksvrstart() +* 2010/08/25 1.3 fix problem of ephemeris time inversion (2.4.0_p6) +* 2010/09/08 1.4 fix problem of ephemeris and ssr squence upset +* (2.4.0_p8) +* 2011/01/10 1.5 change api: rtksvrstart(),rtksvrostat() +* 2011/06/21 1.6 fix ephemeris handover problem +* 2012/05/14 1.7 fix bugs +* 2013/03/28 1.8 fix problem on lack of glonass freq number in raw +* fix problem on ephemeris with inverted toe +* add api rtksvrfree() +* 2014/06/28 1.9 fix probram on ephemeris update of beidou +* 2015/04/29 1.10 fix probram on ssr orbit/clock inconsistency +* 2015/07/31 1.11 add phase bias (fcb) correction +* 2015/12/05 1.12 support opt->pppopt=-DIS_FCB +* 2016/07/01 1.13 support averaging single pos as base position +* 2016/07/31 1.14 fix bug on ion/utc parameters input +* 2016/08/20 1.15 support api change of sendnmea() +* 2016/09/18 1.16 fix server-crash with server-cycle > 1000 +* 2016/09/20 1.17 change api rtksvrstart() +* 2016/10/01 1.18 change api rtksvrstart() +* 2016/10/04 1.19 fix problem to send nmea of single solution +* 2016/10/09 1.20 add reset-and-single-sol mode for nmea-request +* 2017/04/11 1.21 add rtkfree() in rtksvrfree() +* 2020/11/30 1.22 add initializing svr->nav in rtksvrinit() +* allocate double size ephemeris in rtksvrinit() +* handle multiple ephemeris sets in updatesvr() +* use API sat2freq() to get carrier frequency +* use integer types in stdint.h +*-----------------------------------------------------------------------------*/ +#include "rtklib.h" +#include "signal.h" + +#define MIN_INT_RESET 30000 /* mininum interval of reset command (ms) */ + +static int intflg =0; /* interrupt flag (2:shtdown) */ + +/* external stop signal ------------------------------------------------------*/ +static void sigshut(int sig) +{ + trace(3,"sigshut: sig=%d\n",sig); + + intflg=1; +} +/* write solution header to output stream ------------------------------------*/ +static void writesolhead(stream_t *stream, const solopt_t *solopt) +{ + uint8_t buff[1024]; + int n; + + n=outsolheads(buff,solopt); + strwrite(stream,buff,n); +} +/* save output buffer --------------------------------------------------------*/ +static void saveoutbuf(rtksvr_t *svr, uint8_t *buff, int n, int index) +{ + rtksvrlock(svr); + + n=nbuffsize-svr->nsb[index]?n:svr->buffsize-svr->nsb[index]; + memcpy(svr->sbuf[index]+svr->nsb[index],buff,n); + svr->nsb[index]+=n; + + rtksvrunlock(svr); +} +/* write solution to output stream -------------------------------------------*/ +static void writesol(rtksvr_t *svr, int index) +{ + solopt_t solopt=solopt_default; + uint8_t buff[MAXSOLMSG+1]; + int i,n; + + tracet(4,"writesol: index=%d\n",index); + + for (i=0;i<2;i++) { + + if (svr->solopt[i].posf==SOLF_STAT) { + + /* output solution status */ + rtksvrlock(svr); + n=rtkoutstat(&svr->rtk,(char *)buff); + rtksvrunlock(svr); + } + else { + /* output solution */ + n=outsols(buff,&svr->rtk.sol,svr->rtk.rb,svr->solopt+i); + } + strwrite(svr->stream+i+3,buff,n); + + /* save output buffer */ + saveoutbuf(svr,buff,n,i); + + /* output extended solution */ + n=outsolexs(buff,&svr->rtk.sol,svr->rtk.ssat,svr->solopt+i); + strwrite(svr->stream+i+3,buff,n); + + /* save output buffer */ + saveoutbuf(svr,buff,n,i); + } + /* output solution to monitor port */ + if (svr->moni) { + n=outsols(buff,&svr->rtk.sol,svr->rtk.rb,&solopt); + strwrite(svr->moni,buff,n); + } + /* save solution buffer */ + if (svr->nsolsolbuf[svr->nsol++]=svr->rtk.sol; + rtksvrunlock(svr); + } +} +/* update glonass frequency channel number in raw data struct ----------------*/ +static void update_glofcn(rtksvr_t *svr) +{ + int i,j,sat,frq; + + for (i=0;iraw[j].nav.geph[i].sat!=sat) continue; + frq=svr->raw[j].nav.geph[i].frq; + } + if (frq<-7||frq>6) continue; + + for (j=0;j<3;j++) { + if (svr->raw[j].nav.geph[i].sat==sat) continue; + svr->raw[j].nav.geph[i].sat=sat; + svr->raw[j].nav.geph[i].frq=frq; + } + } +} + +/* update observation data ---------------------------------------------------*/ +static void update_obs(rtksvr_t *svr, obs_t *obs, int index, int iobs) +{ + int i,n=0,sat,sys; + + if (iobsn;i++) { + sat=obs->data[i].sat; + sys=satsys(sat,NULL); + if (svr->rtk.opt.exsats[sat-1]==1||!(sys&svr->rtk.opt.navsys)) { + continue; + } + svr->obs[index][iobs].data[n]=obs->data[i]; + svr->obs[index][iobs].data[n++].rcv=index+1; + } + svr->obs[index][iobs].n=n; + sortobs(&svr->obs[index][iobs]); + } + svr->nmsg[index][0]++; +} + +/* update ephemeris ----------------------------------------------------------*/ +static void update_eph(rtksvr_t *svr, nav_t *nav, int ephsat, int ephset, + int index) +{ + eph_t *eph1,*eph2,*eph3; + geph_t *geph1,*geph2,*geph3; + int prn; + + if (satsys(ephsat,&prn)!=SYS_GLO) { + if (!svr->navsel||svr->navsel==index+1) { + /* svr->nav.eph={current_set1,current_set2,prev_set1,prev_set2} */ + eph1=nav->eph+ephsat-1+MAXSAT*ephset; /* received */ + eph2=svr->nav.eph+ephsat-1+MAXSAT*ephset; /* current */ + eph3=svr->nav.eph+ephsat-1+MAXSAT*(2+ephset); /* previous */ + if (eph2->ttr.time==0|| + (eph1->iode!=eph3->iode&&eph1->iode!=eph2->iode)|| + (timediff(eph1->toe,eph3->toe)!=0.0&& + timediff(eph1->toe,eph2->toe)!=0.0)|| + (timediff(eph1->toc,eph3->toc)!=0.0&& + timediff(eph1->toc,eph2->toc)!=0.0)) { + *eph3=*eph2; /* current ->previous */ + *eph2=*eph1; /* received->current */ + } + } + svr->nmsg[index][1]++; + } + else { + if (!svr->navsel||svr->navsel==index+1) { + geph1=nav->geph+prn-1; + geph2=svr->nav.geph+prn-1; + geph3=svr->nav.geph+prn-1+MAXPRNGLO; + if (geph2->tof.time==0|| + (geph1->iode!=geph3->iode&&geph1->iode!=geph2->iode)) { + *geph3=*geph2; + *geph2=*geph1; + update_glofcn(svr); + } + } + svr->nmsg[index][6]++; + } +} +/* update sbas message -------------------------------------------------------*/ +static void update_sbs(rtksvr_t *svr, sbsmsg_t *sbsmsg, int index) +{ + int i,sbssat=svr->rtk.opt.sbassatsel; + + if (sbsmsg&&(sbssat==sbsmsg->prn||sbssat==0)) { + sbsmsg->rcv=index+1; + if (svr->nsbssbsmsg[svr->nsbs++]=*sbsmsg; + } + else { + for (i=0;isbsmsg[i]=svr->sbsmsg[i+1]; + svr->sbsmsg[i]=*sbsmsg; + } + sbsupdatecorr(sbsmsg,&svr->nav); + } + svr->nmsg[index][3]++; +} +/* update ion/utc parameters -------------------------------------------------*/ +static void update_ionutc(rtksvr_t *svr, nav_t *nav, int index) +{ + if (svr->navsel==0||svr->navsel==index+1) { + matcpy(svr->nav.utc_gps,nav->utc_gps,8,1); + matcpy(svr->nav.utc_glo,nav->utc_glo,8,1); + matcpy(svr->nav.utc_gal,nav->utc_gal,8,1); + matcpy(svr->nav.utc_qzs,nav->utc_qzs,8,1); + matcpy(svr->nav.utc_cmp,nav->utc_cmp,8,1); + matcpy(svr->nav.utc_irn,nav->utc_irn,9,1); + matcpy(svr->nav.utc_sbs,nav->utc_sbs,4,1); + matcpy(svr->nav.ion_gps,nav->ion_gps,8,1); + matcpy(svr->nav.ion_gal,nav->ion_gal,4,1); + matcpy(svr->nav.ion_qzs,nav->ion_qzs,8,1); + matcpy(svr->nav.ion_cmp,nav->ion_cmp,8,1); + matcpy(svr->nav.ion_irn,nav->ion_irn,8,1); + } + svr->nmsg[index][2]++; +} +/* update antenna position ---------------------------------------------------*/ +static void update_antpos(rtksvr_t *svr, int index) +{ + sta_t *sta; + double pos[3],del[3]={0},dr[3]; + int i; + + if (svr->rtk.opt.refpos==POSOPT_RTCM&&index==1) { + if (svr->format[1]==STRFMT_RTCM2||svr->format[1]==STRFMT_RTCM3) { + sta=&svr->rtcm[1].sta; + } + else { + sta=&svr->raw[1].sta; + } + /* update base station position */ + for (i=0;i<3;i++) { + svr->rtk.rb[i]=sta->pos[i]; + } + /* antenna delta */ + ecef2pos(svr->rtk.rb,pos); + if (sta->deltype) { /* xyz */ + del[2]=sta->hgt; + enu2ecef(pos,del,dr); + for (i=0;i<3;i++) { + svr->rtk.rb[i]+=sta->del[i]+dr[i]; + } + } + else { /* enu */ + enu2ecef(pos,sta->del,dr); + for (i=0;i<3;i++) { + svr->rtk.rb[i]+=dr[i]; + } + } + } + svr->nmsg[index][4]++; +} +/* update ssr corrections ----------------------------------------------------*/ +static void update_ssr(rtksvr_t *svr, int index) +{ + int i,sys,prn,iode; + + for (i=0;irtcm[index].ssr[i].update) continue; + + /* check consistency between iods of orbit and clock */ + if (svr->rtcm[index].ssr[i].iod[0]!=svr->rtcm[index].ssr[i].iod[1]) { + continue; + } + svr->rtcm[index].ssr[i].update=0; + + iode=svr->rtcm[index].ssr[i].iode; + sys=satsys(i+1,&prn); + + /* check corresponding ephemeris exists */ + if (sys==SYS_GPS||sys==SYS_GAL||sys==SYS_QZS) { + if (svr->nav.eph[i ].iode!=iode&& + svr->nav.eph[i+MAXSAT].iode!=iode) { + continue; + } + } + else if (sys==SYS_GLO) { + if (svr->nav.geph[prn-1 ].iode!=iode&& + svr->nav.geph[prn-1+MAXPRNGLO].iode!=iode) { + continue; + } + } + svr->nav.ssr[i]=svr->rtcm[index].ssr[i]; + } + svr->nmsg[index][7]++; +} +/* update imu data -----------------------------------------------------------*/ +static void updata_imu(rtksvr_t *svr, imud_t imud){ + svr->imud[svr->n_imu++] = imud; +// printf("%lf\n",svr->imud[svr->n_imu].time); +// printf("%d\n",svr->n_imu); +} +/* update rtk server struct --------------------------------------------------*/ +static void update_svr(rtksvr_t *svr, int ret, obs_t *obs, nav_t *nav, + int ephsat, int ephset, sbsmsg_t *sbsmsg, int index, + int iobs, imud_t imud) +{ + tracet(4,"updatesvr: ret=%d ephsat=%d ephset=%d index=%d\n",ret,ephsat, + ephset,index); + + if (ret==1) { /* observation data */ + update_obs(svr,obs,index,iobs); + } + else if (ret==2) { /* ephemeris */ + update_eph(svr,nav,ephsat,ephset,index); + } + else if (ret==3) { /* sbas message */ + update_sbs(svr,sbsmsg,index); + } + else if (ret==9) { /* ion/utc parameters */ + update_ionutc(svr,nav,index); + } + else if (ret==5) { /* antenna postion */ + update_antpos(svr,index); + } + else if (ret==7) { /* dgps correction */ + svr->nmsg[index][5]++; + } + else if (ret==10) { /* ssr message */ + update_ssr(svr,index); + } + else if(ret==11 && (index==0||index==2)){ /* IMU data */ + updata_imu(svr,imud); + } + else if (ret==-1) { /* error */ + svr->nmsg[index][9]++; + } +} +/* decode receiver raw/rtcm data ---------------------------------------------*/ +static int decoderaw(rtksvr_t *svr, int index) +{ + obs_t *obs; + nav_t *nav; + sbsmsg_t *sbsmsg=NULL; + imud_t imud; + + int i,ret,ephsat,ephset,fobs=0; + + tracet(4,"decoderaw: index=%d\n",index); + + rtksvrlock(svr); + + for (i=0;inb[index];i++) { + + /* input rtcm/receiver raw data from stream */ + if (svr->format[index]==STRFMT_RTCM2) { + ret=input_rtcm2(svr->rtcm+index,svr->buff[index][i]); + obs=&svr->rtcm[index].obs; + nav=&svr->rtcm[index].nav; + ephsat=svr->rtcm[index].ephsat; + ephset=svr->rtcm[index].ephset; + } + else if (svr->format[index]==STRFMT_RTCM3) { + ret=input_rtcm3(svr->rtcm+index,svr->buff[index][i]); + obs=&svr->rtcm[index].obs; + nav=&svr->rtcm[index].nav; + ephsat=svr->rtcm[index].ephsat; + ephset=svr->rtcm[index].ephset; + /* only rover has imu */ + if(index==0){ + imud = svr->rtcm[index].imud; + } + } + else if(svr->format[index]==STRFMT_IMU){ + ret=input_imu(svr->raw+index,&imud,svr->buff[index][i]); + } + else { + ret=input_raw(svr->raw+index,svr->format[index],svr->buff[index][i]); + obs=&svr->raw[index].obs; + nav=&svr->raw[index].nav; + ephsat=svr->raw[index].ephsat; + ephset=svr->raw[index].ephset; + sbsmsg=&svr->raw[index].sbsmsg; + } +#if 0 /* record for receiving tick for debug */ + if (ret==1) { + trace(0,"%d %10d T=%s NS=%2d\n",index,tickget(), + time_str(obs->data[0].time,0),obs->n); + } +#endif + /* update rtk server */ + if (ret>0) { + update_svr(svr,ret,obs,nav,ephsat,ephset,sbsmsg,index,fobs,imud); + } + /* observation data received */ + if (ret==1) { + if (fobsprcout++; + } + } + svr->nb[index]=0; + rtksvrunlock(svr); + + return fobs; +} +/* decode download file ------------------------------------------------------*/ +static void decodefile(rtksvr_t *svr, int index) +{ + nav_t nav={0}; + char file[1024]; + int nb; + + tracet(4,"decodefile: index=%d\n",index); + + rtksvrlock(svr); + + /* check file path completed */ + if ((nb=svr->nb[index])<=2|| + svr->buff[index][nb-2]!='\r'||svr->buff[index][nb-1]!='\n') { + rtksvrunlock(svr); + return; + } + strncpy(file,(char *)svr->buff[index],nb-2); file[nb-2]='\0'; + svr->nb[index]=0; + + rtksvrunlock(svr); + + if (svr->format[index]==STRFMT_SP3) { /* precise ephemeris */ + + /* read sp3 precise ephemeris */ + readsp3(file,&nav,0); + if (nav.ne<=0) { + tracet(1,"sp3 file read error: %s\n",file); + return; + } + /* update precise ephemeris */ + rtksvrlock(svr); + + if (svr->nav.peph) free(svr->nav.peph); + svr->nav.ne=svr->nav.nemax=nav.ne; + svr->nav.peph=nav.peph; + svr->ftime[index]=utc2gpst(timeget()); + strcpy(svr->files[index],file); + + rtksvrunlock(svr); + } + else if (svr->format[index]==STRFMT_RNXCLK) { /* precise clock */ + + /* read rinex clock */ + if (readrnxc(file,&nav)<=0) { + tracet(1,"rinex clock file read error: %s\n",file); + return; + } + /* update precise clock */ + rtksvrlock(svr); + + if (svr->nav.pclk) free(svr->nav.pclk); + svr->nav.nc=svr->nav.ncmax=nav.nc; + svr->nav.pclk=nav.pclk; + svr->ftime[index]=utc2gpst(timeget()); + strcpy(svr->files[index],file); + + rtksvrunlock(svr); + } +} +/* carrier-phase bias (fcb) correction ---------------------------------------*/ +static void corr_phase_bias(obsd_t *obs, int n, const nav_t *nav) +{ + double freq; + uint8_t code; + int i,j; + + for (i=0;issr[obs[i].sat-1].pbias[code-1]*freq/CLIGHT; + } +} +/* periodic command ----------------------------------------------------------*/ +static void periodic_cmd(int cycle, const char *cmd, stream_t *stream) +{ + const char *p=cmd,*q; + char msg[1024],*r; + int n,period; + + for (p=cmd;;p=q+1) { + for (q=p;;q++) if (*q=='\r'||*q=='\n'||*q=='\0') break; + n=(int)(q-p); strncpy(msg,p,n); msg[n]='\0'; + + period=0; + if ((r=strrchr(msg,'#'))) { + sscanf(r,"# %d",&period); + *r='\0'; + while (*--r==' ') *r='\0'; /* delete tail spaces */ + } + if (period<=0) period=1000; + if (*msg&&cycle%period==0) { + strsendcmd(stream,msg); + } + if (!*q) break; + } +} +/* baseline length -----------------------------------------------------------*/ +static double baseline_len(const rtk_t *rtk) +{ + double dr[3]; + int i; + + if (norm(rtk->sol.rr,3)<=0.0||norm(rtk->rb,3)<=0.0) return 0.0; + + for (i=0;i<3;i++) { + dr[i]=rtk->sol.rr[i]-rtk->rb[i]; + } + return norm(dr,3)*0.001; /* (km) */ +} +/* send nmea request to base/nrtk input stream -------------------------------*/ +static void send_nmea(rtksvr_t *svr, uint32_t *tickreset) +{ + sol_t sol_nmea={{0}}; + double vel,bl; + uint32_t tick=tickget(); + int i; + + if (svr->stream[1].state!=1) return; + sol_nmea.ns=10; /* Some servers don't like when ns = 0 */ + + if (svr->nmeareq==1) { /* lat-lon-hgt mode */ + sol_nmea.stat=SOLQ_SINGLE; + sol_nmea.time=utc2gpst(timeget()); + matcpy(sol_nmea.rr,svr->nmeapos,3,1); + strsendnmea(svr->stream+1,&sol_nmea); + } + else if (svr->nmeareq==2) { /* single-solution mode */ + if (norm(svr->rtk.sol.rr,3)<=0.0) return; + sol_nmea.stat=SOLQ_SINGLE; + sol_nmea.time=utc2gpst(timeget()); + matcpy(sol_nmea.rr,svr->rtk.sol.rr,3,1); + strsendnmea(svr->stream+1,&sol_nmea); + } + else if (svr->nmeareq==3) { /* reset-and-single-sol mode */ + + /* send reset command if baseline over threshold */ + bl=baseline_len(&svr->rtk); + if (bl>=svr->bl_reset&&(int)(tick-*tickreset)>MIN_INT_RESET) { + strsendcmd(svr->stream+1,svr->cmd_reset); + + tracet(2,"send reset: bl=%.3f rr=%.3f %.3f %.3f rb=%.3f %.3f %.3f\n", + bl,svr->rtk.sol.rr[0],svr->rtk.sol.rr[1],svr->rtk.sol.rr[2], + svr->rtk.rb[0],svr->rtk.rb[1],svr->rtk.rb[2]); + *tickreset=tick; + } + if (norm(svr->rtk.sol.rr,3)<=0.0) return; + sol_nmea.stat=SOLQ_SINGLE; + sol_nmea.time=utc2gpst(timeget()); + matcpy(sol_nmea.rr,svr->rtk.sol.rr,3,1); + + /* set predicted position if velocity > 36km/h */ + if ((vel=norm(svr->rtk.sol.rr+3,3))>10.0) { + for (i=0;i<3;i++) { + sol_nmea.rr[i]+=svr->rtk.sol.rr[i+3]/vel*svr->bl_reset*0.8; + } + } + strsendnmea(svr->stream+1,&sol_nmea); + + tracet(3,"send nmea: rr=%.3f %.3f %.3f\n",sol_nmea.rr[0],sol_nmea.rr[1], + sol_nmea.rr[2]); + } +} +/* rtk server thread ---------------------------------------------------------*/ +#ifdef WIN32 +static DWORD WINAPI rtksvrthread(void *arg) +#else +static void *tcsvrthread(void *arg) +#endif +{ + rtksvr_t *svr=(rtksvr_t *)arg; + obs_t obs; + obsd_t data[MAXOBS*2]; + sol_t sol={{0}}; + double tt; + uint32_t tick,ticknmea,tick1hz,tickreset; + uint8_t *p,*q; + char msg[128]; + int i,j,n,fobs[3]={0},cycle,cputime; + + tracet(3,"rtksvrthread:\n"); + + svr->state=1; + svr->rtk.ins.init_flag=0; + obs.data=data; + svr->tick=tickget(); + ticknmea=tick1hz=svr->tick-1000; + tickreset=svr->tick-MIN_INT_RESET; + + for (cycle=0;svr->state;cycle++) { + tick=tickget(); + for (i=0;i<3;i++) { + p=svr->buff[i]+svr->nb[i]; + q=svr->buff[i]+svr->buffsize; + + /* read receiver raw/rtcm data from input stream */ + if ((n=strread(svr->stream+i,p,q-p))<=0) { + continue; + } + /* write receiver raw/rtcm data to log stream */ + strwrite(svr->stream+i+5,p,n); + svr->nb[i]+=n; + + /* save peek buffer */ + rtksvrlock(svr); + n=nbuffsize-svr->npb[i]?n:svr->buffsize-svr->npb[i]; + memcpy(svr->pbuf[i]+svr->npb[i],p,n); + svr->npb[i]+=n; + rtksvrunlock(svr); + } + svr->n_imu = 0; + for (i=0;i<3;i++) { + if (svr->format[i]==STRFMT_SP3||svr->format[i]==STRFMT_RNXCLK) { + /* decode download file */ + decodefile(svr,i); + } + else { + /* decode receiver raw/rtcm data */ + fobs[i]=decoderaw(svr,i); + } + } + /* averaging single base pos */ + if (fobs[1]>0&&svr->rtk.opt.refpos==POSOPT_SINGLE) { + if ((svr->rtk.opt.maxaveep<=0||svr->navertk.opt.maxaveep)&& + pntpos(svr->obs[1][0].data,svr->obs[1][0].n,&svr->nav, + &svr->rtk.opt,&sol,NULL,NULL,msg)) { + svr->nave++; + for (i=0;i<3;i++) { + svr->rb_ave[i]+=(sol.rr[i]-svr->rb_ave[i])/svr->nave; + } + } + for (i=0;i<3;i++) svr->rtk.opt.rb[i]=svr->rb_ave[i]; + } + + /* TC function */ + rt_tcfilter(svr, fobs[0], tick); + + /* send null solution if no solution (1hz) */ + if (svr->rtk.sol.stat==SOLQ_NONE&&(int)(tick-tick1hz)>=1000) { + writesol(svr,0); + tick1hz=tick; + } + /* write periodic command to input stream */ + for (i=0;i<3;i++) { + periodic_cmd(cycle*svr->cycle,svr->cmds_periodic[i],svr->stream+i); + } + /* send nmea request to base/nrtk input stream */ + if (svr->nmeacycle>0&&(int)(tick-ticknmea)>=svr->nmeacycle) { + send_nmea(svr,&tickreset); + ticknmea=tick; + } + if ((cputime=(int)(tickget()-tick))>0) svr->cputime=cputime; + + /* sleep until next cycle */ + sleepms(svr->cycle-cputime); + } + for (i=0;istream+i); + for (i=0;i<3;i++) { + svr->nb[i]=svr->npb[i]=0; + free(svr->buff[i]); svr->buff[i]=NULL; + free(svr->pbuf[i]); svr->pbuf[i]=NULL; + free_raw (svr->raw +i); + free_rtcm(svr->rtcm+i); + } + for (i=0;i<2;i++) { + svr->nsb[i]=0; + free(svr->sbuf[i]); svr->sbuf[i]=NULL; + } + return 0; +} + + + +/* start rtk server ------------------------------------------------------------ +* start rtk server thread +* args : rtksvr_t *svr IO rtk server +* int cycle I server cycle (ms) +* int buffsize I input buffer size (bytes) +* int *strs I stream types (STR_???) +* types[0]=input stream rover +* types[1]=input stream base station +* types[2]=input stream correction +* types[3]=output stream solution 1 +* types[4]=output stream solution 2 +* types[5]=log stream rover +* types[6]=log stream base station +* types[7]=log stream correction +* char *paths I input stream paths +* int *format I input stream formats (STRFMT_???) +* format[0]=input stream rover +* format[1]=input stream base station +* format[2]=input stream correction +* int navsel I navigation message select +* (0:rover,1:base,2:ephem,3:all) +* char **cmds I input stream start commands +* cmds[0]=input stream rover (NULL: no command) +* cmds[1]=input stream base (NULL: no command) +* cmds[2]=input stream corr (NULL: no command) +* char **cmds_periodic I input stream periodic commands +* cmds[0]=input stream rover (NULL: no command) +* cmds[1]=input stream base (NULL: no command) +* cmds[2]=input stream corr (NULL: no command) +* char **rcvopts I receiver options +* rcvopt[0]=receiver option rover +* rcvopt[1]=receiver option base +* rcvopt[2]=receiver option corr +* int nmeacycle I nmea request cycle (ms) (0:no request) +* int nmeareq I nmea request type +* (0:no,1:base pos,2:single sol,3:reset and single) +* double *nmeapos I transmitted nmea position (ecef) (m) +* prcopt_t *prcopt I rtk processing options +* solopt_t *solopt I solution options +* solopt[0]=solution 1 options +* solopt[1]=solution 2 options +* stream_t *moni I monitor stream (NULL: not used) +* char *errmsg O error message +* return : status (1:ok 0:error) +*-----------------------------------------------------------------------------*/ +extern int tcsvrstart(rtksvr_t *svr, int cycle, int buffsize, int *strs, + char **paths, int *formats, int navsel, char **cmds, + char **cmds_periodic, char **rcvopts, int nmeacycle, + int nmeareq, const double *nmeapos, prcopt_t *prcopt, + solopt_t *solopt, stream_t *moni, char *errmsg) +{ + gtime_t time,time0={0}; + int i,j,rw; + + tracet(3,"rtksvrstart: cycle=%d buffsize=%d navsel=%d nmeacycle=%d nmeareq=%d\n", + cycle,buffsize,navsel,nmeacycle,nmeareq); + + if (svr->state) { + sprintf(errmsg,"server already started"); + return 0; + } + strinitcom(); + svr->cycle=cycle>1?cycle:1; + svr->nmeacycle=nmeacycle>1000?nmeacycle:1000; + svr->nmeareq=nmeareq; + for (i=0;i<3;i++) svr->nmeapos[i]=nmeapos[i]; + svr->buffsize=buffsize>4096?buffsize:4096; + for (i=0;i<3;i++) svr->format[i]=formats[i]; + svr->navsel=navsel; + svr->nsbs=0; + svr->nsol=0; + svr->prcout=0; + rtkfree(&svr->rtk); + rtkinit(&svr->rtk,prcopt); + + if (prcopt->initrst) { /* init averaging pos by restart */ + svr->nave=0; + for (i=0;i<3;i++) svr->rb_ave[i]=0.0; + } + for (i=0;i<3;i++) { /* input/log streams */ + svr->nb[i]=svr->npb[i]=0; + if (!(svr->buff[i]=(uint8_t *)malloc(buffsize))|| + !(svr->pbuf[i]=(uint8_t *)malloc(buffsize))) { + tracet(1,"rtksvrstart: malloc error\n"); + sprintf(errmsg,"rtk server malloc error"); + return 0; + } + for (j=0;j<10;j++) svr->nmsg[i][j]=0; + for (j=0;jobs[i][j].n=0; + strcpy(svr->cmds_periodic[i],!cmds_periodic[i]?"":cmds_periodic[i]); + + /* initialize receiver raw and rtcm control */ + init_raw(svr->raw+i,formats[i]); + init_rtcm(svr->rtcm+i); + + /* set receiver and rtcm option */ + strcpy(svr->raw [i].opt,rcvopts[i]); + strcpy(svr->rtcm[i].opt,rcvopts[i]); + + /* connect dgps corrections */ + svr->rtcm[i].dgps=svr->nav.dgps; + } + for (i=0;i<2;i++) { /* output peek buffer */ + if (!(svr->sbuf[i]=(uint8_t *)malloc(buffsize))) { + tracet(1,"rtksvrstart: malloc error\n"); + sprintf(errmsg,"rtk server malloc error"); + return 0; + } + } + /* set solution options */ + for (i=0;i<2;i++) { + svr->solopt[i]=solopt[i]; + } + /* set base station position */ + if (prcopt->refpos!=POSOPT_SINGLE) { + for (i=0;i<6;i++) { + svr->rtk.rb[i]=i<3?prcopt->rb[i]:0.0; + } + } + /* update navigation data */ + for (i=0;inav.eph [i].ttr=time0; + for (i=0;inav.geph[i].tof=time0; + for (i=0;inav.seph[i].tof=time0; + + /* set monitor stream */ + svr->moni=moni; + + /* open input streams */ + for (i=0;i<8;i++) { + rw=i<3?STR_MODE_R:STR_MODE_W; + if (strs[i]!=STR_FILE) rw|=STR_MODE_W; + if (!stropen(svr->stream+i,strs[i],rw,paths[i])) { + sprintf(errmsg,"str%d open error path=%s",i+1,paths[i]); + for (i--;i>=0;i--) strclose(svr->stream+i); + return 0; + } + /* set initial time for rtcm and raw */ + if (i<3) { + time=utc2gpst(timeget()); + svr->raw [i].time=strs[i]==STR_FILE?strgettime(svr->stream+i):time; + svr->rtcm[i].time=strs[i]==STR_FILE?strgettime(svr->stream+i):time; + } + } + /* sync input streams */ + strsync(svr->stream,svr->stream+1); + strsync(svr->stream,svr->stream+2); + + /* write start commands to input streams */ + for (i=0;i<3;i++) { + if (!cmds[i]) continue; + strwrite(svr->stream+i,(unsigned char *)"",0); /* for connect */ + sleepms(100); + strsendcmd(svr->stream+i,cmds[i]); + } + /* write solution header to solution streams */ + for (i=3;i<5;i++) { + writesolhead(svr->stream+i,svr->solopt+i-3); + } + /* create rtk server thread */ +#ifdef WIN32 + if (!(svr->thread=CreateThread(NULL,0,rtksvrthread,svr,0,NULL))) { +#else + if (pthread_create(&svr->thread,NULL,tcsvrthread,svr)) { +#endif + for (i=0;istream+i); + sprintf(errmsg,"thread create error\n"); + return 0; + } + + signal(SIGINT, sigshut); /* keyboard interrupt */ + + while (!intflg){ + } + return 1; +} + diff --git a/TC_NAV_Zjut_post/cmake-build-debug/CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/ins.c.o b/TC_NAV_Zjut_post/cmake-build-debug/CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/ins.c.o index 7c2ccae2c5cab9792ffd91d20386c69f55350c0f..7a0b4613b3947b6af3ddba37de78c17c079adc16 100644 GIT binary patch delta 731 zcmYMyJxE(o6bJBk|Mwv}h(U^;lPTS-lh`HIfDRI*i_d@{E_M+z3SA0nUplpZ;TN{4 ztsr9kK*a<|Fib*ultzru8bR_6?WWWqOa_l{NsX{S}XH=t@N1AGV z)msb_3C5~r!aKa6hl(twsZsGB>-1Q$fD=k6KH!RyijVliPZdk3G~A_HLCkQU%KwD8 z;Q{3;Ji~*kHKYv>sn(G({92TZ$P+h^H9RTm2_C$OE5kFYEyTd{s%@mf3!-qf9pu1^ z_wsQLURLH%0v-<1UP#d LZf5s+;#c!O(&2n^ delta 731 zcmYMyJxE(o6bJBk|Mwww5JM3?CsW*7Cux^x13E~MQtLw~h>I>lM#07U^_(<{t+uJH zEjZLKY^#!Ji$p|PC{$+`Q3zQaMMt3sp7->a?fy82bMLwQiv?3Gm~3~0zmJ-^(ZEOfiEVs#Ls3iXQr^ z4El%!Qx!7d0|uy8F^5^IQ+&i4Jym?dZ%QcUaZE|YXI%1g#RAF=x2wJ)X1Gh`FCuQZ zSGfewaGz=!DZ@jm6^t345G5n>#8u22ej|DnJa`SqhTo~aAqJjPeMbuXMHH^Kjx2cL zUOo=Mi^>fY!K)=*f!9SX!4;c`Sk9GHWqC*B1+^^5a$c1~%<^7Ik1X%2woq^Rk0_kE z4L@%Aukt4nmj7w%FEm>|)Y=YOEgy-(E%NXzpQv_`vRn{#1V6KfG3!)6kYi2~;kF|h zabF;e$K#;hCiyziteBUX(`OyYQA9m=;I=8u&}(UGbnk8(L^(Anh9rb7g0O8EacUKW M!5!J|Pn`Iw$Ph@zLI+b(XdOfyBuIuXLZQ|dErn>U zTBToFtcV|xDotsuA6RO|kEj@nS`1WC2ceTVC^~xHHK!SJ;g@rB$ouD?N}`e|tPgpM zsLyHlB+PC{seV@}_Y{;lBN#x~3=2*pVkQNHh?*(EStQLtM%iC5gp?`N&|&5T=ds@` z2!@e1Pdw2Gx=e|&>~9!FxA`s@!#VRqFpj+WBe;miMxpwdOQ@K7!32I%gWw7R4mF9c zA>z;$k#`+2hqelDAmz{w(M_ZsN{I5vI@HEm^}pgRj5*ZK`sHg16^HhSZX*Kf6x~4@ zw2x&UZ5jp8fi-z3fer}^_zF5)(_c^*YZJfR8H6<*scEC89+s-(*({nh^@@s!Xv)^q zqUnU_E~1+HS$5|fyqKn(@E+ot2IT5}BsC4n>>*k;jk4@hJVHv-Wzjs+ny#|y{4cYB ztX9Dxj%6?ZQ0^{-!tPGkdd&D)rMO>xJh5GI+As7qX1p&5ExAu&ioC?W|BNp!3Z5fi z%7Pc%$Q3~e&1O~blI!_f@Cq#^sH@vvb5}PD-XLbS3(8#Fxb~{|-lEmC$!Ljd+$ng6 z4wDwV=NfklK5&h5f@N;;2*ZZ-ky|`2sBnuX7&iA6Zt+@{pHT43B#&%*pHWhQZR?b3 zit-VR^O5J7dmN#Z+w(t0o6u2CXj-=SazaJHG0x!u!(Q|FY3CXCubo9w1#@O{ROqNmhj8Hfv~2XRV~)k!BRCmE1*$Rr)UfjO}VO? zH0=}JLR3>X%kCV97t@p%77^EUSgzhiQqxhH-9@ve0hWD=38XZg72QKx(+I1^|1$TH z(<*p^W7)(%l)Db0u)7+z9%Fu1Yq(!sJh5GI*7kPQXS^>6&A5{=MP6dxpW;iCf+q-= zX~9!&iz+MkF&f0 diff --git a/TC_NAV_Zjut_post/cmake-build-debug/CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_doppler.c.o b/TC_NAV_Zjut_post/cmake-build-debug/CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_doppler.c.o index a0c30898b4c23600497e19132d7a7088d145f103..20ee8e798cb9a38d2ce891aa90bb1f20c0bfdf70 100644 GIT binary patch delta 5084 zcmYk=d3;sH6$kKp=S;|ZIrHF!umlJi1H}mFCn8F$d}=Hpo7R99qNoJif?Lu0sT6H* z$_F)wKqM%^H7ZLGlwd#tB8F0w-JqaBL4s^?VNs-D3#Gpqa^B59`MmEvclI+g@1=O1 zU%bw*+R-^!t5QmcrYOGA_q@s4^XOUS@iT&{D$dgdo<7fe$*JXbJ7r z%@F8>)go2zn?Hyat4w8vi{4R1%8Z2E(3YqwWo}C-P#csPEv!-v%G?#|v@+wMbGC`4 zDo*CnP;JOefLbIWR;|*>OcX6snPmPJDw|9oTCQ@)OoCjU@2en}%u~V@sxO%md9_C6 zkwG$?e|41_L}nJ`MzLDulX+S6p(-NtI>fd!AE{#UqNV8b%~%^6u3~YzNxAf>vIEIS zem#kZ%N2iEb$;euesEI7CeXq2Z@DZygtw|t<+c_mau`{-DMTu70~&0kQMKmpf&W>2 zr_%YT;Ct1HPXMmJKOl4MY&ra>a`_~Xl8iD(kgR7_-=Q@3+6HEo3B$ksUE>i!A& z*;eqg`ZIR~T<1JPZLhyYsZiBLwrc<~s!obcDwUDz)Jvz|F@( z9p{IE5iQZTw{<#Ck=GXK(_AW8tk0O)f_Jp%o8S%MyIT8Zk!XoV@-G)vY2%wUqNO_S zoAsjibQ|An6;#n{z6$n@8Y~T1;Xg3Enx~FfVqLn(w zH>sjky0>pSiayZTh+Rahbzk3HBKlD0`KGsMjqdN8zM_xxAm0qoK~saZ`Ucza$Ht>;a$eaHOrWQ3+$yiu0bed3rllv1O}kULM@AY$ZkGOE18R@suYJ2f0y zQGYgwxHBkDCEO}RIkyJJ*)pkA$?bqAELxYH?fy)#SHX0-vBoP5C?*7}y>NPEi3@K{ZyVsgO4TGt+@zsfd3DvN{0&q49iCr0Ed) zFBS78f-_WWE*G37obgwS{zo_uuM?f4V&4pg+*c7#*ZO8y#O8yo-`5dkZk1P+&Q@j& zlw{9`zlvJu2$_FCyKJ4w_OzG+9khz*4P<6Or>vs7v7LD#;tlXx zbp%s%V^+pX2zIh!U2>!HGBTo`_jD)N=z>~!1l%J7j_LSL@-ps)pS5mTcI>jY!L^i< z_HQ=wXr(OGCD^}fLPU6-pgS43yv{}#-d1SvSxKzFrc~mEn9LnIGfI9$s zQ6}%QY1yP4-V-8^_W^F7^~TEY4^hAeLlkmjh$21`Vm$v8VgmmXqL_aT5tOj~2GZ0} zDHBr1;Yup!DCQN!&+)N&`mRkVRK1%0TFyEY-9T&m}bC6r4I+&x4i zUkbQu@@hJ6E|wW@YU@+Ehlwb(9 z=4imp?@;W^Z*gbY z6<72LenYYG)T!BoW}tLpraB`(R-rvNgbOgciM@Rx(qkdzGz;^d z*rr*S>clq9LV6r&As1>E&ilkZ&B7uiwq_PGXFVEn$7}^d*Qtc5s1${oK2RBvxEIR!aLN0TsqSJc?&!J}r1k=#| zcYymnI31VDQJ}M}ZbsSC-WLQZgr8x_6yC)VG?}=IBbZHFdXziDDdMFS;#2fN{5gZi zlti&yI;R+s^TYK}I$7Xj`cp#0IVMoZ^i+!r?bkzvp|q6{VJMviy6mAVM+K`WrS4H$ zPW(2WyM=up%`6eDKqr?8YS540E$O2n#DJnSybhDSydpPL4Xf>X1v?b?JEQemDa0|bNk~M7- zpo=#V_XJ(fH>0)71zRxlR{>j4fVP%B*r&twYblmVtDAN2Llo$Tcid3dpnC&DwC16L zk8nii1MO^D)s}7U(;@i6&U9U~sCc+a^ye7qSd?~M+<}?4lj}yhld`?|i}=zY zDexvf-;Y=6J4z``qWbgoPwR{)yHNjlgxsz5Re;TE>vX?TzNXS}l6T`<{$tYG9$L&# z2)>~z4g`B?8BYe>S~O4%PZ8|HH9AA^Ej5~1fa~sl`+d%Sg__fO2zqpY@GJc#1n1fQ p9i(*pP=w}K9im)q=1alDG$_fu8!A7^tbp8qA{wiEUVTgU{{a=ndXfMD delta 5084 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 diff --git a/TC_NAV_Zjut_post/cmake-build-debug/CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_init.c.o b/TC_NAV_Zjut_post/cmake-build-debug/CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_init.c.o index 9ddf35eda10591c737579de38842e751eae88112..a016fe5034f57dd3ae521f1c08f4f6358b5cc325 100644 GIT binary patch delta 8737 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 beI7mx7XZdv$+N1+*wuG1f5n~M$8`FC=Lt<1 delta 8737 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 diff --git a/TC_NAV_Zjut_post/cmake-build-debug/CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_zaru.c.o b/TC_NAV_Zjut_post/cmake-build-debug/CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_zaru.c.o index f4b9a6d534ae6ee734e02a01f187b59f1af9f438..b7c3620869811b1a306892f5dbd18e31ce7fcbf5 100644 GIT binary patch delta 1019 zcmYMzOK1~O6b9g#|Bg`WIU$Rp1vgn1Md(T*Sg7Elf?(<@D^ZaeP*f06&^oCg#7AkY zL}Mc;TKk}pMq)Kciw3pUY9CaKf%*bB?tFkCxbe(wPO};2%eixM@0ownE$Nm*JNad- zNg3|~XrJpiQO|L_i*P8XxP&m>QCvoZ@``RWQ%TW-Ryr!^3L0ENj3#P`({n{H_R?EL z1__$;Ro8Hg76qxG!*!gZ--;~K^iOdEL*${ltPjtK6**LBo#G~b@_NN>)VUl{^&{f) zMwNdLQI|I>2M}|4n`#gVmv^d$kaRgN$^}~-M%Lv$qQO8TsJOgel}7~Jp}LO*_>jmR zZ4?FYkrnxv0v}fv@D+TrroZ4$(Iz>)_W)tT=W1#&oDvm-zb~TEu)McrJw(KCcTG)( zdsJg+Hry++Js-i38qO#mW2@n;E-j(eaG%zmpv`c<$ev;xF~cLO2_y`Uib}y|o+4?S z`t5RiFxdBQgu>n~*mxWW>M_YzS}HaxZu`}l&|&`zLi64WP+6MT-(Sk2S;ZvkXi4!( z68T**g+}_LcrEdSsWzBK6RlOek*sb|%pgiz6tfcC9mcOdG>0~dYiV9$+@V-NoK7g- zNsP}c-b;)#ibYBBU4b3a2TAdOq9Q3C7TCEjNs3oy`4NQ#<)vh&_X$(Z>d&hjr{SAi y>VL>(Oln>iLNV|3@)+%e&d7wuwR@*bsH`|EbC?v^WxkwtT3|ozWbsz`7ykzkjH!wM delta 1019 zcmYMzT}TvB6bJB`|DC|>oMj)RgkJVhiomDXAi?T~+N5&P zwzec9HPhN^Ym+Q2+ALj6(;{K}Ac9_c>jQ$Im(JYwxG%%}=G-}R@8LhGhEzjt6ZucE zC~3TtpslXsL_NpxPQjrbMG|4^Rh&kIvWgDW(}>~>8flN_g1uHL89jTy9ofN4v{$QBSbN0c2d>EV>bB5G9wlsfG{%x2SF+0p2OH zN6R7y-aRiLMesi5ZF~VAsOS&4O|(Kz@7+Pz@bQXj3@1hT;PW}u8tzctL&Wgeis}q^ zs_vuSaF@vT%)^fwPAeZ^wc(5|9Y&+!%UXMgCd2(Adx}Sh8NQ`@jD+F4qLE-Tqi8oy z^;)^z5$t;-LSe5NHXhr9`g+M%N-8!h?uPE^&@TTILbF~0RFEe2`EyzHS}}$y`lxsz ziTtK`iCX%t7?*g$lp9Q-jutD5lGSC3NknOt;*|trO`(b6TAG#^w~#ZTYL=pZpI%MyQ|w diff --git a/TC_NAV_Zjut_post/cmake-build-debug/CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_zvu.c.o b/TC_NAV_Zjut_post/cmake-build-debug/CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_zvu.c.o index 901ae1f2f2f498bf5336d4b3759242302d84ab26..100783c8509e41205458b292dd9bd42f2b5c2883 100644 GIT binary patch delta 991 zcmYMyO-NKx6bJD4{?|fq4!xe{j)Mbms8ujuz(JJLSw$Os>eg)`VsuGRVPso-GUu&cz6B8voBp+0S6B|D z)wq7JIk_UbHvELh6dr?Sboq(w`K}m~-_0qW!lN=dggsRTl@wJxlY>+##!*eRiV4(E zz2b!&ajW7b>S!0j|LrExKrLFDLO_QVud$61iZ|FvR}^m%r?lc7_R@&JPH7tZXjG9! z2T3TWN^;->`Y5B798wiDDQYQ`(oAy4;$`6@EIDd$3{+@jXL(!(@<(w(X0Sj;X)7ls z_9De8NxD>VTEZ1CFd=b#so1$CB+e?u8Huw-aZcjYhN@1<6BF1x=OxbuMVI8+sOXkF zO^OS6NZS=X$kJ}bMdW#p;xfuzZdP4|@A7_CcnvX^k0`GraJfU(i@3`@sy?*4+$)-0 zDAT)vE|>d7KMJ~utjlTDE%@L;RX^h3A(4%C8!7N`Q6VzmQDq9B!DA)OgP)7+O{U=) zepM11o)-Ns{C)tHhTp61z&D&LsoL;I)gWpN&x&l%yJ(6T{-V5x^@hLd*88Y4{7q{^ eXfRxSNe>Vh{v|b=X&7B~ delta 991 zcmYMyO-NKx6bJD4{?|fq4!xKbii98vf{7N|COYrhnOXksx$nIDKlkSA^Yy7Nul5)s zaWsP(UB~$a$H8GZ)GAmA(SlOyRJ6jU9^G~XG3phR8QFF;ne*1K-ie5ZZHuioh0EKe z)wq7JBe^EJF~}h@jTfL#x;!F#ekfkb@8%V+;8BSj!k%grHo6c;56AQM6qh8=Rz;WO zX;56obK0ZmMwSjJdXVRXie8ku+^Fhx zOJ#aD(e3hp=x3;YWL-|HZo>x;sqP>F9v0bXcaZ`=DJVb&Jfa-H7w}k73*bqSy~%s< z49^tBhChh@guhRr-0-X_4c~CCs7k}1RrgV4cur({4x%Au_^a{(HXHt?TZd3%_`B8~ fqRw#PB|Spi@NcQvOv6YRo)_77^>}cC*GB&V&q%#O diff --git a/TC_NAV_Zjut_post/cmake-build-debug/Makefile b/TC_NAV_Zjut_post/cmake-build-debug/Makefile index 478b1a9..5f17d7b 100644 --- a/TC_NAV_Zjut_post/cmake-build-debug/Makefile +++ b/TC_NAV_Zjut_post/cmake-build-debug/Makefile @@ -729,6 +729,54 @@ Src/rcvraw.c.s: $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/rcvraw.c.s .PHONY : Src/rcvraw.c.s +Src/real_time/client.o: Src/real_time/client.c.o +.PHONY : Src/real_time/client.o + +# target to build an object file +Src/real_time/client.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/client.c.o +.PHONY : Src/real_time/client.c.o + +Src/real_time/client.i: Src/real_time/client.c.i +.PHONY : Src/real_time/client.i + +# target to preprocess a source file +Src/real_time/client.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/client.c.i +.PHONY : Src/real_time/client.c.i + +Src/real_time/client.s: Src/real_time/client.c.s +.PHONY : Src/real_time/client.s + +# target to generate assembly for a file +Src/real_time/client.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/client.c.s +.PHONY : Src/real_time/client.c.s + +Src/real_time/imu.o: Src/real_time/imu.c.o +.PHONY : Src/real_time/imu.o + +# target to build an object file +Src/real_time/imu.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/imu.c.o +.PHONY : Src/real_time/imu.c.o + +Src/real_time/imu.i: Src/real_time/imu.c.i +.PHONY : Src/real_time/imu.i + +# target to preprocess a source file +Src/real_time/imu.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/imu.c.i +.PHONY : Src/real_time/imu.c.i + +Src/real_time/imu.s: Src/real_time/imu.c.s +.PHONY : Src/real_time/imu.s + +# target to generate assembly for a file +Src/real_time/imu.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/imu.c.s +.PHONY : Src/real_time/imu.c.s + Src/real_time/ins.o: Src/real_time/ins.c.o .PHONY : Src/real_time/ins.o @@ -849,6 +897,78 @@ Src/real_time/rt_ins-gnss.c.s: $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_ins-gnss.c.s .PHONY : Src/real_time/rt_ins-gnss.c.s +Src/real_time/rt_tcfilt.o: Src/real_time/rt_tcfilt.c.o +.PHONY : Src/real_time/rt_tcfilt.o + +# target to build an object file +Src/real_time/rt_tcfilt.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_tcfilt.c.o +.PHONY : Src/real_time/rt_tcfilt.c.o + +Src/real_time/rt_tcfilt.i: Src/real_time/rt_tcfilt.c.i +.PHONY : Src/real_time/rt_tcfilt.i + +# target to preprocess a source file +Src/real_time/rt_tcfilt.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_tcfilt.c.i +.PHONY : Src/real_time/rt_tcfilt.c.i + +Src/real_time/rt_tcfilt.s: Src/real_time/rt_tcfilt.c.s +.PHONY : Src/real_time/rt_tcfilt.s + +# target to generate assembly for a file +Src/real_time/rt_tcfilt.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_tcfilt.c.s +.PHONY : Src/real_time/rt_tcfilt.c.s + +Src/real_time/rt_tcpos.o: Src/real_time/rt_tcpos.c.o +.PHONY : Src/real_time/rt_tcpos.o + +# target to build an object file +Src/real_time/rt_tcpos.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_tcpos.c.o +.PHONY : Src/real_time/rt_tcpos.c.o + +Src/real_time/rt_tcpos.i: Src/real_time/rt_tcpos.c.i +.PHONY : Src/real_time/rt_tcpos.i + +# target to preprocess a source file +Src/real_time/rt_tcpos.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_tcpos.c.i +.PHONY : Src/real_time/rt_tcpos.c.i + +Src/real_time/rt_tcpos.s: Src/real_time/rt_tcpos.c.s +.PHONY : Src/real_time/rt_tcpos.s + +# target to generate assembly for a file +Src/real_time/rt_tcpos.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_tcpos.c.s +.PHONY : Src/real_time/rt_tcpos.c.s + +Src/real_time/rt_tcsvr.o: Src/real_time/rt_tcsvr.c.o +.PHONY : Src/real_time/rt_tcsvr.o + +# target to build an object file +Src/real_time/rt_tcsvr.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_tcsvr.c.o +.PHONY : Src/real_time/rt_tcsvr.c.o + +Src/real_time/rt_tcsvr.i: Src/real_time/rt_tcsvr.c.i +.PHONY : Src/real_time/rt_tcsvr.i + +# target to preprocess a source file +Src/real_time/rt_tcsvr.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_tcsvr.c.i +.PHONY : Src/real_time/rt_tcsvr.c.i + +Src/real_time/rt_tcsvr.s: Src/real_time/rt_tcsvr.c.s +.PHONY : Src/real_time/rt_tcsvr.s + +# target to generate assembly for a file +Src/real_time/rt_tcsvr.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/TC_NAV_Zjut.dir/build.make CMakeFiles/TC_NAV_Zjut.dir/Src/real_time/rt_tcsvr.c.s +.PHONY : Src/real_time/rt_tcsvr.c.s + Src/real_time/rt_zaru.o: Src/real_time/rt_zaru.c.o .PHONY : Src/real_time/rt_zaru.o @@ -1461,6 +1581,12 @@ help: @echo "... Src/rcvraw.o" @echo "... Src/rcvraw.i" @echo "... Src/rcvraw.s" + @echo "... Src/real_time/client.o" + @echo "... Src/real_time/client.i" + @echo "... Src/real_time/client.s" + @echo "... Src/real_time/imu.o" + @echo "... Src/real_time/imu.i" + @echo "... Src/real_time/imu.s" @echo "... Src/real_time/ins.o" @echo "... Src/real_time/ins.i" @echo "... Src/real_time/ins.s" @@ -1476,6 +1602,15 @@ help: @echo "... Src/real_time/rt_ins-gnss.o" @echo "... Src/real_time/rt_ins-gnss.i" @echo "... Src/real_time/rt_ins-gnss.s" + @echo "... Src/real_time/rt_tcfilt.o" + @echo "... Src/real_time/rt_tcfilt.i" + @echo "... Src/real_time/rt_tcfilt.s" + @echo "... Src/real_time/rt_tcpos.o" + @echo "... Src/real_time/rt_tcpos.i" + @echo "... Src/real_time/rt_tcpos.s" + @echo "... Src/real_time/rt_tcsvr.o" + @echo "... Src/real_time/rt_tcsvr.i" + @echo "... Src/real_time/rt_tcsvr.s" @echo "... Src/real_time/rt_zaru.o" @echo "... Src/real_time/rt_zaru.i" @echo "... Src/real_time/rt_zaru.s" diff --git a/TC_NAV_Zjut_post/cmake-build-debug/Testing/Temporary/LastTest.log b/TC_NAV_Zjut_post/cmake-build-debug/Testing/Temporary/LastTest.log index 089c242..ef7c738 100644 --- a/TC_NAV_Zjut_post/cmake-build-debug/Testing/Temporary/LastTest.log +++ b/TC_NAV_Zjut_post/cmake-build-debug/Testing/Temporary/LastTest.log @@ -1,3 +1,3 @@ -Start testing: Mar 15 14:54 CST +Start testing: Mar 25 14:06 CST ---------------------------------------------------------- -End testing: Mar 15 14:54 CST +End testing: Mar 25 14:06 CST diff --git a/TC_NAV_Zjut_post/config/Tc.conf b/TC_NAV_Zjut_post/config/Tc.conf index d68f194..9ed2ca5 100644 --- a/TC_NAV_Zjut_post/config/Tc.conf +++ b/TC_NAV_Zjut_post/config/Tc.conf @@ -135,9 +135,9 @@ inpstr1-path =ttyUSB0:460800:8:n:1:off # inpstr2-path =caxm002:m2ywj94n@sdk.pnt.10086.cn:8002/RTCM33_GRCEJ inpstr2-path = inpstr3-path = -inpstr1-format =rtcm3 # (0:rtcm2,1:rtcm3,2:oem4,4:ubx,5:swift,6:hemis,7:skytraq,8:javad,9:nvs,10:binex,11:rt17,12:sbf,15:sp3) -inpstr2-format =rtcm3 # (0:rtcm2,1:rtcm3,2:oem4,4:ubx,5:swift,6:hemis,7:skytraq,8:javad,9:nvs,10:binex,11:rt17,12:sbf,15:sp3) -inpstr3-format =rtcm3 # (0:rtcm2,1:rtcm3,2:oem4,4:ubx,5:swift,6:hemis,7:skytraq,8:javad,9:nvs,10:binex,11:rt17,12:sbf,15:sp3) +inpstr1-format =rtcm3 # (0:rtcm2,1:rtcm3,2:oem4,4:ubx,5:swift,6:hemis,7:skytraq,8:javad,9:nvs,10:binex,11:rt17,12:sbf,15:sp3,19:imu) +inpstr2-format =rtcm3 # (0:rtcm2,1:rtcm3,2:oem4,4:ubx,5:swift,6:hemis,7:skytraq,8:javad,9:nvs,10:binex,11:rt17,12:sbf,15:sp3,19:imu) +inpstr3-format =rtcm3 # (0:rtcm2,1:rtcm3,2:oem4,4:ubx,5:swift,6:hemis,7:skytraq,8:javad,9:nvs,10:binex,11:rt17,12:sbf,15:sp3,19:imu) inpstr2-nmeareq =single # (0:off,1:latlon,2:single) inpstr2-nmealat =30.23469717 # (deg) inpstr2-nmealon =120.04264567 # (deg) diff --git a/TC_NAV_Zjut_post/include/rtklib.h b/TC_NAV_Zjut_post/include/rtklib.h index b912b9b..bf73f3a 100644 --- a/TC_NAV_Zjut_post/include/rtklib.h +++ b/TC_NAV_Zjut_post/include/rtklib.h @@ -485,6 +485,7 @@ extern "C" { #define STRFMT_RNXCLK 16 /* stream format: RINEX CLK */ #define STRFMT_SBAS 17 /* stream format: SBAS messages */ #define STRFMT_NMEA 18 /* stream format: NMEA 0183 */ +#define STRFMT_IMU 19 /* stream format: IMU */ #define MAXRCVFMT 13 /* max number of receiver format */ #define STR_MODE_R 0x1 /* stream mode: read */ @@ -559,6 +560,8 @@ extern "C" { #define MAXIMUBUF 1000 /* max number of imu measurement data buffer */ +#define IMUBUFF_SIZE 300 /* imu buffer size */ + #define SQR(x) ((x)*(x)) #define SQRT(x) ((x)<=0.0||(x)!=(x)?0.0:sqrt(x)) @@ -1931,6 +1934,10 @@ EXPORT int decode_gal_fnav(const uint8_t *buff, eph_t *eph, double *ion, EXPORT int decode_irn_nav(const uint8_t *buff, eph_t *eph, double *ion, double *utc); +/* decode imu data in imu.c */ +EXPORT int input_imu (raw_t *raw, imud_t *imud ,uint8_t data); +EXPORT int decode_imu (uint8_t *buff,imud_t *imud); + EXPORT int init_raw (raw_t *raw, int format); EXPORT void free_raw (raw_t *raw); EXPORT int input_raw (raw_t *raw, int format, uint8_t data);