} /* start rtk server ----------------------------------------------------------*/ static int startsvr(vt_t *vt) { double pos[3],npos[3]; char s[3][MAXRCVCMD]={"","",""},*cmds[]={NULL,NULL,NULL}; char *ropts[]={"","",""}; char *paths[]={ strpath[0],strpath[1],strpath[2],strpath[3],strpath[4],strpath[5], strpath[6],strpath[7] }; int i,ret,stropt[8]={0}; trace(3,"startsvr:\n"); /* read start commads from command files */ for (i=0;i<3;i++) { if (!*rcvcmds[i]) continue; if (!readcmd(rcvcmds[i],s[i],0)) { printvt(vt,"no command file: %s\n",rcvcmds[i]); } else cmds[i]=s[i]; } /* confirm overwrite */ for (i=3;i<8;i++) { if (strtype[i]==STR_FILE&&!confwrite(vt,strpath[i])) return 0; } if (prcopt.refpos==4) { /* rtcm */ for (i=0;i<3;i++) prcopt.rb[i]=0.0; } pos[0]=nmeapos[0]*D2R; pos[1]=nmeapos[1]*D2R; pos[2]=0.0; pos2ecef(pos,npos); /* read antenna file */ readant(vt,&prcopt,&svr.nav); /* open geoid data file */ if (solopt[0].geoid>0&&!opengeoid(solopt[0].geoid,filopt.geoid)) { trace(2,"geoid data open error: %s\n",filopt.geoid); printvt(vt,"geoid data open error: %s\n",filopt.geoid); } 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); if (strfmt[2]==8) strfmt[2]=STRFMT_SP3; /* set ftp/http directory and proxy */ strsetdir(filopt.tempdir); strsetproxy(proxyaddr); /* execute start command */ if (*startcmd&&(ret=system(startcmd))) { trace(2,"command exec error: %s (%d)\n",startcmd,ret); printvt(vt,"command exec error: %s (%d)\n",startcmd,ret); } solopt[0].posf=strfmt[3]; solopt[1].posf=strfmt[4]; /* start rtk server */ if (!rtksvrstart(&svr,svrcycle,buffsize,strtype,paths,strfmt,navmsgsel, cmds,ropts,nmeacycle,nmeareq,npos,&prcopt,solopt,&moni)) { trace(2,"rtk server start error\n"); printvt(vt,"rtk server start error\n"); return 0; }
static jboolean RtkServer__rtksvrstart(JNIEnv* env, jclass thiz, jint j_cycle, jint j_buffsize, jintArray j_strs, jobjectArray j_paths, jintArray j_format, jint j_navsel, jobjectArray j_cmds, jobjectArray j_rcvopts, jint j_nmea_cycle, jint j_nmea_req, jdoubleArray j_nmeapos, jobject j_procopt, jobject j_solopt1, jobject j_solopt2 ) { struct native_ctx_t *nctx; int i; jobject obj; jboolean res; /* Input stream types */ int strs[8]; /* input stream paths */ const char *paths[8] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }; jstring paths_jstring[8] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }; /* input stream formats (STRFMT_???) */ int format[3]; /* input stream start commands */ const char *cmds[3] = {NULL, NULL, NULL}; jstring cmds_jstring[3] = {NULL, NULL, NULL}; /* receiver options */ const char *rcvopts[3] = {NULL, NULL, NULL}; char *rcvopts_jstring[3] = {NULL, NULL, NULL}; /* rtk processing options */ prcopt_t prcopt; /* solution options */ solopt_t solopt[2]; /* nmea position */ double nmeapos[3]; res = JNI_FALSE; for (i=0; i<sizeof(paths)/sizeof(paths[0]); ++i) { paths_jstring[i] = (*env)->GetObjectArrayElement(env, j_paths, i); if ((*env)->ExceptionOccurred(env)) goto rtksvrstart_end; if (paths_jstring[i] != NULL) { paths[i] = (*env)->GetStringUTFChars(env, paths_jstring[i], NULL); if (paths[i] == NULL) goto rtksvrstart_end; } } for (i=0; i<sizeof(cmds)/sizeof(cmds[0]); ++i) { cmds_jstring[i] = (*env)->GetObjectArrayElement(env, j_cmds, i); if ((*env)->ExceptionOccurred(env)) goto rtksvrstart_end; if (cmds_jstring[i] != NULL) { cmds[i] = (*env)->GetStringUTFChars(env, cmds_jstring[i], NULL); if (cmds[i] == NULL) goto rtksvrstart_end; } } for (i=0; i<sizeof(rcvopts)/sizeof(rcvopts[0]); ++i) { rcvopts_jstring[i] = (*env)->GetObjectArrayElement(env, j_rcvopts, i); if ((*env)->ExceptionOccurred(env)) goto rtksvrstart_end; if (rcvopts_jstring[i] != NULL) { rcvopts[i] = (*env)->GetStringUTFChars(env, rcvopts_jstring[i], NULL); if (rcvopts[i] == NULL) goto rtksvrstart_end; } } (*env)->GetIntArrayRegion(env, j_strs, 0, sizeof(strs)/sizeof(strs[0]), strs); if ((*env)->ExceptionOccurred(env)) goto rtksvrstart_end; (*env)->GetIntArrayRegion(env, j_format, 0, sizeof(format)/sizeof(format[0]), format); if ((*env)->ExceptionOccurred(env)) goto rtksvrstart_end; (*env)->GetDoubleArrayRegion(env, j_nmeapos, 0, sizeof(nmeapos)/sizeof(nmeapos[0]), nmeapos); if ((*env)->ExceptionOccurred(env)) goto rtksvrstart_end; solution_options2solopt_t(env, j_solopt1, &solopt[0]); solution_options2solopt_t(env, j_solopt2, &solopt[1]); nctx = (struct native_ctx_t *)(uintptr_t)(*env)->GetLongField(env, thiz, m_object_field); if (nctx == NULL) { LOGV("nctx is null"); goto rtksvrstart_end; } { /* Open trace / solution files */ gtime_t now; now = timeget(); if (solopt[0].trace > 0) open_trace_file(env, solopt[0].trace, now); /* treat processing options only now for having trace */ processing_options2prcopt_t(env, j_procopt, &prcopt); if (solopt[0].sstat > 0) open_solution_status_file(env, solopt[0].sstat, now); } if ((*env)->ExceptionOccurred(env)) goto rtksvrstart_end; char errmsg[2048]=""; // Modif Mathieu Peyréga : adapt to new 2.4.3b26 API char *cmds_periodic[]={NULL,NULL,NULL}; // Modif Mathieu Peyréga : adapt to new 2.4.3b26 API if (!rtksvrstart( &nctx->rtksvr, /* SvrCycle ms */ j_cycle, /* SvrBuffSize */ j_buffsize, /* stream types */ strs, /* paths */ (char **)paths, /* input stream format */ format, /* NavSelect */ j_navsel, /* input stream start commands */ (char **)cmds, /* input stream periodic commands */ (char **)cmds_periodic, // Modif Mathieu Peyréga : adapt to new 2.4.3b26 API /* receiver options */ (char **)rcvopts, /* nmea request cycle ms */ j_nmea_cycle, /* nmea request type */ j_nmea_req, /* transmitted nmea position */ nmeapos, /* rtk processing options */&prcopt, /* solution options */ solopt, /* monitor stream */ &nctx->monistr, /* err */errmsg // Modif Mathieu Peyréga : adapt to new 2.4.3b26 API )) { }else { res = JNI_TRUE; } rtksvrstart_end: for (i=0; i<sizeof(paths)/sizeof(paths[0]); ++i) { if (paths[i] != NULL) (*env)->ReleaseStringUTFChars(env, paths_jstring[i], paths[i]); } for (i=0; i<sizeof(cmds)/sizeof(cmds[0]); ++i) { if (cmds[i] != NULL) (*env)->ReleaseStringUTFChars(env, cmds_jstring[i], cmds[i]); } for (i=0; i<sizeof(rcvopts)/sizeof(rcvopts[0]); ++i) { if (rcvopts[i] != NULL) (*env)->ReleaseStringUTFChars(env, rcvopts_jstring[i], rcvopts[i]); } if (!res) { traceclose(); rtkclosestat(); } return res; }
int main()//OPTIMIZATION LEVEL = 0 { HAL_Init(); SystemClockConfig(); ConfigLED(); ConfigTimer(); rtksvrstart(&svr); ConfigUART(svr.format[0]); fobs[0]=fobs[1]=0; //svr.raw[1].time.time = 1429540822;//test SS2 data //svr.raw[1].time.time = 1429539852;//test SS2 data while (HAL_UART_Receive_DMA(&UartGPSHandle,svr.buff[0],MAX_RAW_LEN) != HAL_OK); while (HAL_UART_Receive_DMA(&UartRFHandle,svr.buff[1],MAX_RAW_LEN) != HAL_OK); HAL_Delay(3000); sendRequest(svr.format[0]); // test(); while(1) { #ifndef _TEST_RESULT if (flagTimeout) { int index,temp; flagTimeout=0; //SendIntStr(UartGPSHandle.Instance->SR); //SendIntStr(UartRFHandle.Instance->SR); for (index=0;index<2;index++) { if (index==0) temp = UartGPSHandle.hdmarx->Instance->NDTR & 0xffff; else temp = UartRFHandle.hdmarx->Instance->NDTR & 0xffff; if (temp + svr.buffPtr[index] <= MAX_RAW_LEN) svr.nb[index] = MAX_RAW_LEN - svr.buffPtr[index] - temp; else svr.nb[index] = 2*MAX_RAW_LEN - temp - svr.buffPtr[index]; fobs[index] = decode_raw(&svr,index); svr.buffPtr[index] = MAX_RAW_LEN - temp; } // temp = UartGPSHandle.hdmarx->Instance->NDTR & 0xffff; // if (temp + svr.buffPtr[0] <= MAX_RAW_LEN) // svr.nb[0] = MAX_RAW_LEN - svr.buffPtr[0] - temp; // else // svr.nb[0] = 2*MAX_RAW_LEN - temp - svr.buffPtr[0]; // if (svr.buffPtr[0] + svr.nb[0] <= MAX_RAW_LEN) // { // for (i = svr.buff[0] + svr.buffPtr[0] ; // i < svr.buff[0] + svr.buffPtr[0] + svr.nb[0]; i++) // { // HAL_UART_Transmit(&UartResultHandle,i,1,1); // } // } // else // { // for (i = svr.buff[0] + svr.buffPtr[0] ; // i < svr.buff[0] + MAX_RAW_LEN; i++) // { // HAL_UART_Transmit(&UartResultHandle,i,1,1); // } // for (i = svr.buff[0] ; // i < svr.buff[0] + svr.nb[0] + svr.buffPtr[0] - MAX_RAW_LEN ; i++) // { // HAL_UART_Transmit(&UartResultHandle,i,1,1); // } // } // svr.buffPtr[0] = MAX_RAW_LEN - temp; //rtk positioning********************************************************************** // if (0) if (fobs[1]) { fobs[1]=0; LED4_TOGGLE; } if (fobs[0]) { int i; fobs[0]=0; LED3_TOGGLE; #ifdef TIME_MEASURE start=HAL_GetTick(); #endif temp=svr.obs[0].n; for (i=0;i<temp;i++) { obsd[i]=svr.obs[0].data[i]; } for (i=0;(i<svr.obs[1].n)&&(i+temp<MAX_OBS);i++) { obsd[i+temp]=svr.obs[1].data[i]; } if (!rtkpos(&svr.rtk,obsd,i+temp,&svr.nav)) // if (1) { LED5_TOGGLE; #ifdef TIME_MEASURE t=HAL_GetTick()-start; svr.rtk.sol.processTime = t; #endif if (svr.rtk.sol.stat==SOLQ_FIX) LED6_TOGGLE; outsol(&svr.rtk.sol,svr.rtk.rb); SendStr(svr.rtk.sol.result); } else { HAL_UART_Transmit_DMA(&UartResultHandle,(unsigned char*)svr.rtk.errbuf,svr.rtk.errLen); } } } #else if (flagTimeout) { static int i; char* res = svr.rtk.sol.result; flagTimeout = 0; res+=sprintf(res, "%04.0f/%02.0f/%02.0f %02.0f:%02.0f:%06.3f %14.4f %14.4f %14.4f %3d %3d %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %6.2f %6.1f", 2015.0,10.0,12.0,3.0,45.0,18.0,//time yy/mm/dd hh:mm:ss.ssss 1.0,2.0,1.0, 1,1, 1.0,1.0,1.0, 1.0,1.0,1.0, 1.0,1.0); res+=sprintf(res," %4d",i++); res[0]='\n'; SendStr(svr.rtk.sol.result); } #endif } }