亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gpsfunc.cpp

?? 基于USB接口的GPS應用程序
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/*-------------------------------------------------------------------
 File description :
 cpp file for Gps_func class;
 Calculate sat visibility using Almanac file, current time, user's rough location
 Read GPS nav message, get ephemeris data;
 Calculate pseudorange;
 Resolve P.V.T. ( position, velocity, time bias );

--------------------------------------------------------------------*/

#include "Gpsfunc.h"
#include "CMatrix3.h"
#include <time.h>
#include <math.h>
#include <assert.h>
#include <string.h>


/*******************************************************************************
FUNCTION exor(char bit, long parity)
RETURNS  None.

PARAMETERS
			bit     char
			parity  long

PURPOSE
			count the number of bits set in the parameter parity and
			do an exclusive or with the parameter bit

WRITTEN BY
	Clifford Kelley
CHANGED BY
        Yu Lu

*******************************************************************************/
static int exor(char bit, unsigned int parity)
{
  char i;
  int result, tmp_par;
  result=0;
  tmp_par = parity>>6;
  for (i=0;i<24;i++)
  {
    if( tmp_par & 0x1) result++;
    tmp_par = tmp_par>>1;
  }
  result=result%2;

  result=(bit ^ result) & 0x1;
  return(result);
}

//------------------------------------------------------------------
// Class constructor and destructor

GPS_Func::GPS_Func()
{
 double pos[3];

 thrdtermed = true;
 for( int i=0; i<SatMax+1; i++)
 {
  Almanac[i].SatId = 0;  // id == 0 means this is not a valid data
  Ephemeris[i].valid = 0; // init epe validity to false
  eph_valid[i] = false;
  Ephemeris[i].iodc = -1; // invalid iodc
  Ephemeris[i].iode = -1; // invalid iode
 }

 for( int i=0; i<CH_NUM; i++)
  for( int j=0; j<5; j++)
  navmsgparity[i].par[j] = 0x1;  // init parity values for 5 frm of all channels

 memset(ch_prn, 0, CH_NUM*sizeof( unsigned char ));

 // default userposition is in Riverside, CA  :=)
 pos[0] = -117.3;  // longi
 pos[1] = 33.4;  // lati
 pos[2] = 500.;  // altitude

 // init user's position to invalid value;

 ECEFuserpos[0] = 1.;
 ECEFuserpos[1] = 1.;
 ECEFuserpos[2] = 1.;
 NEDuserpos[0] = 0.;      //long
 NEDuserpos[1] = 0.;      //lat
 NEDuserpos[2] = 0.;      //alt
 ECEFvel[0] = 0.;
 ECEFvel[1] = 0.;
 ECEFvel[2] = 0.;
 clk_bias = 0.;
 pdop=tdop=hdop=vdop=gdop=0.;

 // init user's accurate time to invalid value;
 AccurateTime = -1.;

 for( int i=0; i<CH_NUM; i++)
 {
  allch_navresult[i].prn = 0;
  allch_navresult[i].valid = false;
  allch_navresult[i].pseudorange = 0.;
  allch_navresult[i].ele = 0.;
  allch_navresult[i].azi = 0.;
 }

 SetUserPos(pos);
#ifdef GPS_FUNC_DBG
 debugfile.open(".\\log\\gps_func.log",ios::out);
#endif
}
GPS_Func::~GPS_Func()
{
#ifdef GPS_FUNC_DBG
 debugfile.close();
#endif
}
//------------------------------------------------------------------
// set longitude, latitude, altitude
// and calculate tangent plane parameters
void GPS_Func::SetUserPos( double* Pos)
{
 double SinLat, CosLat, SinLong, CosLong;
 UserPos[0] = Pos[0];  // longi
 UserPos[1] = Pos[1];  // lati
 UserPos[2] = Pos[2];  // altitude


 SinLat  = sin(Pos[1]*PI/180.);
 CosLat  = cos(Pos[1]*PI/180.);
 SinLong = sin(Pos[0]*PI/180.);
 CosLong = cos(Pos[0]*PI/180.);

 PlaneCE  =  CosLat;
 PlaneET1 = -SinLong;
 PlaneET2 =  CosLong;
 PlaneNT1 = -SinLat * CosLong;
 PlaneNT2 = -SinLat * SinLong;
 PlaneUTx =  CosLat * CosLong;
 PlaneUTy =  CosLat * SinLong;
 PlaneUTz =  SinLat;
 
}
//--------------------------------------------------------------------
//  PosECEF : destination position , in ECEF format
//  Pos:      souce position , in llh format
void GPS_Func::ConvertToECEF( double *PosECEF, double *Pos)
{
  double Dx = 0.0;
  double Dy = 0.0;
  double Dz = 0.0;

  double NormRadius, ActHeight;
  double CosLat, SinLat, CosLong, SinLong;
                 
  CosLong = cos( Pos[0] * PI / 180.0 );
  SinLong = sin( Pos[0] * PI / 180.0 );
  CosLat  = cos( Pos[1] * PI / 180.0 );
  SinLat  = sin( Pos[1] * PI / 180.0 );

  NormRadius = SemiMajorAxis /
    sqrt( 1.0 - ( EccentrSquared * SinLat * SinLat ) );
  ActHeight = NormRadius + Pos[2];

  PosECEF[0] = ActHeight * CosLat * CosLong - Dx;
  PosECEF[1] = ActHeight * CosLat * SinLong - Dy;
  PosECEF[2] = ( OneMinusEccentrSquared * NormRadius + Pos[2]) * SinLat - Dz;
}

//--------------------------------------------------------------------
// Pos:   Desitination position , in llh format
// PosECEF: Source position, in ECEF format

void GPS_Func::ConvertToLongLatAlt( double *Pos, double *PosECEF)
{
  double P, Q, R, D, SinL, SinL2;
  double X, Y, Z;
  double Long, Lat, Alt;

  X = PosECEF[0];
  Y = PosECEF[1];
  Z = PosECEF[2];

  Long = atan2( Y, X );

  P = sqrt( (X * X) + (Y * Y) );
  Q = Z / P;
  Alt = 0.0;

  Lat = atan2( Q, OneMinusEccentrSquared );

  do {
    SinL = sin(Lat);
    SinL2 = SinL * SinL;
    R = SemiMajorAxis / sqrt(1.0 - (EccentrSquared * SinL2));
    D = Alt;
    Alt = (P / cos(Lat)) - R;
    Lat = atan2(Q * (R + Alt), (OneMinusEccentrSquared * R) + Alt);
  }  while ( fabs(Alt - D) > 0.2 );

  Pos[0] = Long * 180.0 / PI;
  Pos[1] = Lat  * 180.0 / PI;
  Pos[2] = Alt;

}
//--------------------------------------------------------------------
//  sec : in 0-59;
//  min : in 0-59;
//  hr  : in 0-23;
//  day : in 1-31;
//  mon : in 1-12;
// calculate Julian day using sec,min,hr,day,mon,yr
long double GPS_Func::CalcJulianDay(int sec,int min,int hr,int day,int mon,int year)
{
 int e_year,e_mon;
 long double jd,h_jd, tmp_d;


 if( mon <=2){
  e_mon = mon +12;
  e_year = year -1;
 }
 else
 {
  e_mon = mon;
  e_year = year;
 }
 h_jd = (hr + min/60. + sec/3600.)/24.;
 tmp_d = (long double)(floor(365.25*e_year)) + (long double)(floor(30.6001*(e_mon+1)))+ (long double)day;
 jd =  tmp_d +  h_jd + 1720981.5L;
 return jd;
}
// calculate julian day using tm variable
long double GPS_Func::CalcJulianDay(struct tm * gt)
{
 int sec,min,hr,day,mon,year;

 sec = gt->tm_sec;
 min = gt->tm_min;
 hr  = gt->tm_hour;
 day = gt->tm_mday;
 mon = gt->tm_mon+1;
 year = gt->tm_year+1900;

 return CalcJulianDay(sec,min,hr,day,mon,year);
}
//--------------------------------------------------------------------
// calculate GPS week using Julian day
int GPS_Func::CalcGpsWeek(long double jd )
{
  int gw;
  gw = floor((jd-2444244.5)/7.); // 2444244.5 is JD of Jan,6,1980
  return (gw%1024);
}
// use current system time to calc gps time
void GPS_Func::get_gpsweek(void)
{
 struct tm *gmt;
 time_t curtime;
 double jd;

 time(&curtime);
 gmt = gmtime(&curtime);
 jd = CalcJulianDay(gmt);
 GpsWeek = CalcGpsWeek(jd);
}
// calculate time(in sec) of week using julian day
int GPS_Func::CalcToW( long double jd)
{
 int gw ;
 gw = floor((jd-2444244.5L)/7.);
 return( jd -2444244.5L - gw*7.)*SecPerDay ;
}
//--------------------------------------------------------------------
// read Almanac data for one satellite

void GPS_Func::read_almparam(AlmInfo *almpt, FILE *almfile)
{
  char info[1024],*begin_info;
  int tmp_int;
  double tmp_double;

  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_HEALTH_STR)) ) break;
  }
  // we find health string 
  sscanf(begin_info, "Health:%d", &tmp_int);
  almpt->Health = tmp_int;
  
  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_ECCEN_STR)) ) break;
  }
  // we find eccentricity str 
  sscanf(begin_info, "Eccentricity: %lg", &tmp_double);
  almpt->E = tmp_double;


  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_TIME_STR)) ) break;
  }
  // we find time of availablity str 
  sscanf(begin_info, "Time of Applicability(s): %lg", &tmp_double);
  almpt->Toa = tmp_double;

  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_ORB_STR)) ) break;
  }
  // we find ORB str
  sscanf(begin_info, "Orbital Inclination(rad): %le", &tmp_double);
  almpt->DeltaI = tmp_double;

  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_RRA_STR)) ) break;
  }
  // we find RRA str 
  sscanf(begin_info, "Rate of Right Ascen(r/s): %le", &tmp_double);
  almpt->OmegaDot = tmp_double;

  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_SQRTA_STR)) ) break;
  }
  // we find SQRTA str 
  sscanf(begin_info, "SQRT(A)  (m 1/2): %le", &tmp_double);
  almpt->SqrtA = tmp_double;

  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_RAAW_STR)) ) break;
  }
  // we find RAAW str 
  sscanf(begin_info, "Right Ascen at Week(rad): %le", &tmp_double);
  almpt->Omega0 = tmp_double;

  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_AOP_STR)) ) break;
  }
  // we find AOP str 
  sscanf(begin_info, "Argument of Perigee(rad): %le", &tmp_double);
  almpt->Omega = tmp_double;

  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_MA_STR)) ) break;
  }
  // we find MA str 
  sscanf(begin_info, "Mean Anom(rad): %le",  &tmp_double);
  almpt->M0 = tmp_double;

  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_AF0_STR)) ) break;
  }
  // we find AF0 str 
  sscanf(begin_info, "Af0(s): %le", &tmp_double);
  almpt->Af0 = tmp_double;

  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_AF1_STR)) ) break;
  }
  // we find AF1 str 
  sscanf(begin_info, "Af1(s/s): %le", &tmp_double);
  almpt->Af1 = tmp_double;

  while( (fgets(info, 1024, almfile)) != NULL){
    if( (begin_info=strstr(info, ALM_WK_STR)) ) break;
  }
  // we find Week str 
  sscanf(begin_info, "week: %d", &tmp_int);
  almpt->WeekNo = tmp_int;
}
//--------------------------------------------------------------------
// read Almanac data for all satellites
void GPS_Func::ReadAlm(FILE *almfile)
{
  char info[1024],*begin_info, dummy[1024];
  int satid;

  AlmInfo  *alm;

  while( (fgets(info,1024,almfile)) != NULL){
    begin_info = strstr(info, ALM_ID_STR);  // find the beginning of ID str
    if( begin_info ){
      sscanf(begin_info, "%s %d", dummy, &satid); // read the id
      assert(satid <32);
      assert(satid >=0);
      alm = &Almanac[satid];
      alm->SatId = satid;
      read_almparam(alm, almfile);
    } // end of if( begin_info )
  }// end of while
}
//--------------------------------------------------------------------
// calculate sat position using ephemeris data and time of week
void GPS_Func::SatPosECEFEphinfo(EphInfo *EphPtr, double Time, int WeekNo, double *Pos)
{
 double d_toc,bclk,tc, d_toe, ei, ea, diff, aol, ta;
 double delr, delal, delinc, r, inc, la, xp, yp;

 d_toc = Time - EphPtr->toc;
 if(d_toc>302400.0)
  d_toc = d_toc - 604800.0;
 else if(d_toc<-302400.0)
  d_toc = d_toc + 604800.0;

 bclk = EphPtr->af0 + EphPtr->af1*d_toc + EphPtr->af2*d_toc*d_toc
	-EphPtr->tgd;
 tc = Time - bclk;

 d_toe = tc - EphPtr->toe;
 if(d_toe>302400.0)
  d_toe = d_toe-604800.0;
 else if(d_toe<-302400.0)
  d_toe = d_toe+604800.0;

 ei = EphPtr->ma + d_toe*(EphPtr->wm + EphPtr->dn);
 ea = ei;
 do
 {
   diff = (ei - (ea - EphPtr->ety*sin(ea)))/(1.0E0 - EphPtr->ety*cos(ea));
   ea = ea + diff;
 } while (fabs(diff) > 1.0e-12 );

 bclk = bclk - 4.442807633E-10*EphPtr->ety*EphPtr->sqra*sin(ea);
 EphPtr->bclk = bclk;

//     ea is the eccentric anomaly
 ta = atan2(sqrt(1.00-pow(EphPtr->ety,2))*sin(ea),cos(ea)-EphPtr->ety);

//     TA IS THE TRUE ANOMALY (ANGLE FROM PERIGEE)

 aol = ta + EphPtr->w;

//     AOL IS THE ARGUMENT OF LATITUDE OF THE SATELLITE

//     calculate the second harmonic perturbations of the orbit

 delr  = EphPtr->crc*cos(2.0*aol) + EphPtr->crs*sin(2.0*aol);
 delal = EphPtr->cuc*cos(2.0*aol) + EphPtr->cus*sin(2.0*aol);
 delinc= EphPtr->cic*cos(2.0*aol) + EphPtr->cis*sin(2.0*aol);

 //     R IS THE RADIUS OF SATELLITE ORBIT AT TIME T

 r = pow(EphPtr->sqra,2)*(1.00 - EphPtr->ety*cos(ea)) + delr;
 aol = aol + delal;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
㊣最新国产の精品bt伙计久久| 亚洲狠狠丁香婷婷综合久久久| jvid福利写真一区二区三区| 美日韩黄色大片| 一区二区三区四区不卡视频| 一区精品在线播放| 亚洲视频一二区| 18欧美亚洲精品| 国产精品天干天干在线综合| 91精品久久久久久久91蜜桃| 欧美精品 日韩| 日韩三级.com| 精品国产91乱码一区二区三区| 精品国产电影一区二区| 极品少妇xxxx精品少妇偷拍| 3d动漫精品啪啪1区2区免费| 久久国产夜色精品鲁鲁99| 久久国产免费看| 国产精品99精品久久免费| 成人一区二区三区在线观看| 91在线观看一区二区| 在线观看成人免费视频| 3d动漫精品啪啪1区2区免费| 精品成人一区二区三区四区| 中文在线一区二区| 亚洲在线一区二区三区| 久久精品999| jlzzjlzz欧美大全| 欧美区在线观看| 久久亚洲精品国产精品紫薇| 中文字幕一区二区三区四区不卡| 亚洲综合男人的天堂| 久色婷婷小香蕉久久| 成人黄色777网| 91麻豆精品91久久久久久清纯 | 一区二区在线观看免费| 视频一区视频二区中文字幕| 久久机这里只有精品| 成人黄色免费短视频| 欧美日韩国产一级片| 国产丝袜美腿一区二区三区| 亚洲综合丁香婷婷六月香| 久久99九九99精品| 91黄色激情网站| 久久久久久久久久电影| 亚洲国产精品久久艾草纯爱| 国产麻豆91精品| 欧美精品一卡二卡| 亚洲欧洲成人av每日更新| 久久精品国产精品亚洲精品| 91视视频在线观看入口直接观看www| 在线播放日韩导航| 亚洲精品一二三| 成熟亚洲日本毛茸茸凸凹| 91麻豆精品91久久久久同性| 亚洲色图制服丝袜| 成人手机电影网| 欧美va在线播放| 天天影视色香欲综合网老头| jiyouzz国产精品久久| 2020国产精品久久精品美国| 亚洲妇女屁股眼交7| 91美女精品福利| 亚洲国产成人私人影院tom| 久久99久国产精品黄毛片色诱| 欧美午夜一区二区| 亚洲激情六月丁香| heyzo一本久久综合| 国产欧美精品一区aⅴ影院| 精品一区二区久久| 欧美一级高清大全免费观看| 午夜激情综合网| 欧美亚洲综合在线| 一区二区三区欧美激情| 91蜜桃网址入口| 亚洲色图.com| 91国产丝袜在线播放| 国产精品久久久久一区二区三区共| 精品在线免费视频| 久久久午夜电影| 国产麻豆精品95视频| 久久精品亚洲精品国产欧美| 国产麻豆成人精品| 国产欧美日韩在线观看| 成人sese在线| 亚洲精品日韩一| 欧美日韩国产系列| 九九热在线视频观看这里只有精品| 日韩欧美一卡二卡| 国产一区二区三区美女| 国产视频一区在线观看 | 欧美午夜电影一区| 五月天亚洲精品| 欧美一区二区三区在线观看| 精品一区二区免费在线观看| 久久女同互慰一区二区三区| 成人av网站免费观看| 亚洲一区二区视频在线| 欧美日韩午夜在线| 精品中文字幕一区二区| 国产精品夫妻自拍| 欧美日韩国产系列| 国产盗摄视频一区二区三区| 亚洲色图视频网| 欧美精品在线一区二区| 国产一区在线看| 亚洲免费三区一区二区| 欧美日本一道本在线视频| 国产成人亚洲综合a∨婷婷 | 日韩高清不卡在线| 久久日韩粉嫩一区二区三区| 99riav久久精品riav| 日本欧美在线观看| 亚洲欧洲精品一区二区三区不卡| 在线中文字幕一区| 国产一区二区不卡在线| 亚洲黄色免费网站| 久久精品免视看| 欧美三级乱人伦电影| 国产成人在线影院| 三级久久三级久久| 国产精品萝li| 4438亚洲最大| 91精品1区2区| 成人综合婷婷国产精品久久蜜臀| 亚洲一区二区三区中文字幕在线 | 99国产精品久| 国产伦精品一区二区三区在线观看| 亚洲乱码精品一二三四区日韩在线| 日韩欧美的一区二区| 色吧成人激情小说| 国产91精品一区二区麻豆亚洲| 视频一区视频二区在线观看| 亚洲人成伊人成综合网小说| 久久夜色精品一区| 91精品国产一区二区| 在线观看一区二区视频| 99免费精品视频| 高清不卡一二三区| 国产一区二区三区久久悠悠色av| 午夜天堂影视香蕉久久| 亚洲乱码国产乱码精品精可以看| 久久久久久免费网| 久久综合九色综合久久久精品综合| 欧美在线视频日韩| 色伊人久久综合中文字幕| 成人动漫视频在线| 国产成人在线观看免费网站| 麻豆极品一区二区三区| 视频一区视频二区中文| 视频在线观看一区| 日韩国产欧美在线视频| 日韩—二三区免费观看av| 亚洲另类春色校园小说| 国产精品国产精品国产专区不蜜| 久久久综合精品| 久久久精品综合| 欧美激情综合网| 国产精品不卡在线观看| 国产精品麻豆网站| 亚洲人成影院在线观看| 一区二区三区影院| 亚洲国产综合91精品麻豆| 亚洲国产视频网站| 亚洲线精品一区二区三区| 亚洲.国产.中文慕字在线| 午夜成人免费视频| 麻豆国产一区二区| 国产99久久久久久免费看农村| 成人美女视频在线观看18| eeuss鲁片一区二区三区| 91国产免费观看| 日韩限制级电影在线观看| 精品欧美一区二区三区精品久久| 久久综合999| 亚洲欧美日韩人成在线播放| 亚洲第一主播视频| 国模冰冰炮一区二区| 豆国产96在线|亚洲| 色爱区综合激月婷婷| 欧美一区二区三区在线电影| 久久先锋影音av| 亚洲人成亚洲人成在线观看图片| 亚洲一区成人在线| 狠狠色综合日日| 99久久久国产精品| 久久99精品网久久| 不卡av免费在线观看| 欧美日韩中文字幕一区| 国产成人精品免费视频网站| 成人国产在线观看| 欧美高清视频一二三区 | 3atv一区二区三区| 国产午夜精品一区二区三区嫩草| 综合自拍亚洲综合图不卡区| 久久国产人妖系列| 色综合天天视频在线观看| 日韩视频一区二区三区| 亚洲免费高清视频在线| 韩国一区二区三区|