亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
欧美性色黄大片| 日韩亚洲欧美成人一区| 91.com视频| 日本一区二区三区久久久久久久久不| 亚洲欧美一区二区视频| 蜜臀av性久久久久蜜臀aⅴ四虎 | 中文字幕av一区 二区| 亚洲一区二区在线免费看| 国产不卡在线播放| 欧美一区二区性放荡片| 亚洲精品久久嫩草网站秘色| 国产一区二区成人久久免费影院 | 韩国av一区二区三区在线观看| 91网上在线视频| 国产欧美日韩不卡| 看片网站欧美日韩| 欧美日韩大陆一区二区| 日韩伦理电影网| 国产伦精品一区二区三区免费 | 激情文学综合丁香| 在线不卡免费av| 亚洲美女少妇撒尿| 成人免费不卡视频| 国产女人水真多18毛片18精品视频 | 日韩精品一卡二卡三卡四卡无卡| 91免费看`日韩一区二区| 国产丝袜欧美中文另类| 免费成人在线网站| 正在播放一区二区| 日产欧产美韩系列久久99| 欧美色视频在线观看| 亚洲综合男人的天堂| 色噜噜偷拍精品综合在线| 中文字幕一区二区三区四区| 成人免费高清在线观看| 国产欧美在线观看一区| 成人午夜av电影| 国产精品蜜臀av| 成人精品一区二区三区四区 | 国产91丝袜在线播放| 久久久亚洲精品石原莉奈| 久久精品国产一区二区三区免费看| 制服丝袜亚洲播放| 久久精品国产精品亚洲精品| 欧美三级午夜理伦三级中视频| 亚洲美女免费视频| 欧美三级视频在线观看| 男人的j进女人的j一区| 久久亚洲综合色| 国产酒店精品激情| 国产精品国产三级国产a| 91丝袜美女网| 日一区二区三区| 26uuu亚洲| 成人av网站在线观看| 亚洲免费在线观看| 欧美狂野另类xxxxoooo| 国精品**一区二区三区在线蜜桃| 国产日韩欧美不卡| 99国产欧美另类久久久精品 | 国产精品久久毛片av大全日韩| 成人av在线看| 午夜一区二区三区视频| 精品人伦一区二区色婷婷| 成人美女视频在线看| 亚洲第一狼人社区| 久久综合精品国产一区二区三区| av电影一区二区| 日韩综合小视频| 国产精品伦一区二区三级视频| 91麻豆精品一区二区三区| 日本亚洲最大的色成网站www| 精品国产91亚洲一区二区三区婷婷 | 91免费小视频| 美女视频一区二区| 一色屋精品亚洲香蕉网站| 欧美理论电影在线| 国产黑丝在线一区二区三区| 亚洲欧美日韩一区| 精品国产髙清在线看国产毛片 | 国产精品国产精品国产专区不蜜 | 国产米奇在线777精品观看| 亚洲精品国久久99热| 日韩欧美在线综合网| 一本一道波多野结衣一区二区| 麻豆精品在线播放| 亚洲一区在线看| 国产精品视频第一区| 欧美电影精品一区二区| 欧美性感一区二区三区| 高清shemale亚洲人妖| 国产成人8x视频一区二区| 亚洲一区二区精品视频| 中文字幕av在线一区二区三区| 日韩一区二区影院| 欧美日韩在线播放三区四区| 高清日韩电视剧大全免费| 日本亚洲免费观看| 亚洲一二三区不卡| 亚洲人成亚洲人成在线观看图片| 久久一二三国产| 欧美大片在线观看一区| 欧美老肥妇做.爰bbww| 欧美自拍偷拍午夜视频| 99久久久久免费精品国产 | 国产传媒欧美日韩成人| 美女一区二区三区在线观看| 亚洲一区二区av在线| 自拍偷拍亚洲欧美日韩| 国产精品国产自产拍高清av| 国产日韩一级二级三级| 久久久久久久性| 久久久久久久综合日本| 久久久久国产精品麻豆ai换脸 | 国产精品99精品久久免费| 蜜桃视频在线观看一区| 热久久国产精品| 人人超碰91尤物精品国产| 日韩和欧美的一区| 奇米在线7777在线精品| 老鸭窝一区二区久久精品| 免费人成黄页网站在线一区二区| 日韩精品一卡二卡三卡四卡无卡| 丝袜美腿亚洲色图| 天天综合色天天综合色h| 日本不卡的三区四区五区| 蜜桃91丨九色丨蝌蚪91桃色| 奇米一区二区三区| 激情亚洲综合在线| 国产ts人妖一区二区| 成人福利视频在线| 色先锋aa成人| 欧美久久久久久蜜桃| 精品乱人伦一区二区三区| 久久久久久免费网| 亚洲日本电影在线| 午夜成人在线视频| 久久激情五月婷婷| 国产成人aaa| 欧美在线高清视频| 日韩一级大片在线| 国产精品三级av| 一二三四社区欧美黄| 奇米777欧美一区二区| 国产成a人亚洲精| 在线影院国内精品| 日韩欧美精品在线| 国产精品久久久久毛片软件| 亚洲一区二区三区国产| 激情都市一区二区| 91欧美一区二区| 日韩精品一区二区三区四区| 国产精品素人视频| 亚洲一本大道在线| 国产美女一区二区| 欧美午夜片在线看| 久久久久久夜精品精品免费| 亚洲乱码国产乱码精品精可以看| 免费人成在线不卡| a4yy欧美一区二区三区| 欧美一级片免费看| 亚洲女人的天堂| 激情小说欧美图片| 欧美日韩在线直播| 国产欧美视频一区二区| 日韩黄色片在线观看| 成人18视频在线播放| 日韩美女视频在线| 一区二区三区日本| 国产精品99久| 91精品国产色综合久久不卡电影| 国产精品视频一二| 久久精品av麻豆的观看方式| 91成人在线精品| 国产精品麻豆网站| 国产永久精品大片wwwapp| 欧美日韩视频在线第一区| 国产精品大尺度| 国产一区二区三区观看| 91精品国产欧美日韩| 亚洲一区二区美女| 99精品热视频| 国产精品网站导航| 国产一区二区在线观看视频| 91精品久久久久久久99蜜桃| 一区二区三区不卡视频在线观看| 国产精品1区二区.| 26uuu欧美| 久久国产精品72免费观看| 正在播放亚洲一区| 亚洲香肠在线观看| 欧美系列日韩一区| 亚洲精品久久久蜜桃| 色网站国产精品| 亚洲精品国产高清久久伦理二区| 成人深夜视频在线观看| 国产网站一区二区| 成人免费看视频| 中文字幕一区二区在线播放| av影院午夜一区|