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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? gpsfunc.cpp

?? 基于USB接口的GPS應(yīng)用程序
?? CPP
?? 第 1 頁 / 共 3 頁
字號(hào):
	 bm[i]=((sat_pvtpara[i].pos[0]*cos(alpha)-sat_pvtpara[i].pos[1]*sin(alpha)-x)*sat_pvtpara[i].vel[0]+
			  (sat_pvtpara[i].pos[1]*cos(alpha)+sat_pvtpara[i].pos[0]*sin(alpha)-y)*sat_pvtpara[i].vel[1]+
			  (sat_pvtpara[i].pos[2]-z)*sat_pvtpara[i].vel[2])/r -
                           sat_pvtpara[i].doppler_freq*lambda;
  }

  for ( i=0;i<4;i++)
  {
	  br[i]=0.0;
	  for (j=0;j<nsl;j++)br[i]+=bm[j]*pm[i][j];
  }

 ECEFvel[0] = br[0] + y*OmegaDotEarth;
 ECEFvel[1] = br[1] - x*OmegaDotEarth;
 ECEFvel[2] = br[2];
 clk_bias = br[3]/SpeedOfLight*1000000.0;

// then calculate matrix G for dops
 Matrix H(nsl,4),G(4,4);

 EnterCriticalSection(&GpsCriticalSection);
  for( int i=0; i< allchtrtime.ch_count; i++)
 {
  allch_navresult[i].prn = allchtrtime.ch_transtime[i].prn;
  allch_navresult[i].valid = true;
  // calculate pseudorange
  allch_navresult[i].pseudorange =( AccurateTime -
                                 allchtrtime.ch_transtime[i].tr_time)*
                                 SpeedOfLight;
  // calculate elevation and azimuth


  /* Distance from user to sat */
  Dx = sat_pvtpara[i].pos[0] - UserPos[0];
  Dy = sat_pvtpara[i].pos[1] - UserPos[1];
  Dz = sat_pvtpara[i].pos[2] - UserPos[2];

  UserToSatRange = sqrt((Dx * Dx) + (Dy * Dy) + (Dz * Dz));

  H(i+1,1)= Dx/UserToSatRange;
  H(i+1,2)= Dy/UserToSatRange;
  H(i+1,3)= Dz/UserToSatRange;
  H(i+1,4)= 1.0;


   /* Director cosines */
  DirCos[0] = Dx / UserToSatRange;
  DirCos[1] = Dy / UserToSatRange;
  DirCos[2] = Dz / UserToSatRange;

  /* Transformation to local tangent plane */
  EnuCos[0] = (PlaneET1 * DirCos[0]) + (PlaneET2 * DirCos[1]);
  EnuCos[1] = (PlaneNT1 * DirCos[0]) + (PlaneNT2 * DirCos[1])
    + (PlaneCE  * DirCos[2]);
  EnuCos[2] = (PlaneUTx * DirCos[0]) + (PlaneUTy * DirCos[1])
    + (PlaneUTz * DirCos[2]);

  /* Azimuth and elevation of sat as seen by user */
  allch_navresult[i].ele = asin(EnuCos[2]) * (180.0 / PI);
  allch_navresult[i].azi = atan2(EnuCos[0], EnuCos[1]) * (180.0 / PI);

 }
 G=(H.t()*H).i();

 hdop=sqrt(G(1,1)+G(2,2));
 vdop=sqrt(G(3,3));
 tdop=sqrt(G(4,4));
 pdop=sqrt(G(1,1)+G(2,2)+G(3,3));
 gdop=sqrt(G(1,1)+G(2,2)+G(3,3)+G(4,4));

 LeaveCriticalSection(&GpsCriticalSection);



 #ifdef GPS_FUNC_DBG
 debugfile << " Pos of User:"
 << x << " " << y << " " << z <<" " << t<< " "
 <<nits << " " << correct_mag<<endl;
 #endif
}

//--------------------------------------------------------------------
/*++
 Routine Description:
   Process one channel's GPS message, idx is the channel's index
    using global variable allch_nagmsg to transfer msgs

 Argument:
         idx :  indicate which channel to read
 Rreturn:
         none;

--*/

void GPS_Func::readOneChMsg(int idx)
{
 int cur_idx;
 cur_idx = (allch_navmsg[idx].index + 1)%302;

 // pre_bit[0-1] are used to check paritys
 prev_bit[0] = (allch_navmsg[idx].msg[ cur_idx ])>>29;
 prev_bit[1] = (allch_navmsg[idx].msg[ (++cur_idx)%302 ])>>29;

 // re-organize the message bits to form message words
 for( int wi = 0; wi < 10; wi++ )
 {
  nav_msg[idx][wi] = 0;
  for( int j=0; j<30; j++)
  {
   if( allch_navmsg[idx].msg[(++cur_idx)%302] & 0x20000000 )
    nav_msg[idx][wi] = nav_msg[idx][wi]*2 + 0x1;
   else
    nav_msg[idx][wi] = nav_msg[idx][wi]*2 ;
  }
 }
  // till now , we have read all data for this channel in this time

 parity_check(idx);

 if( p_error[idx] == 0) // only when parity check passed
 {
  int frmidx = nav_msg[idx][1];
  frmidx = (frmidx>>2) & 0x07;
  if( frmidx >=1 && frmidx<=5 )
  {
//#ifdef GPS_FUNC_DBG
//   debugfile << hex << "CH #" << idx << ": ";
//   for( int k=0;k<10; k++)
//    debugfile <<  nav_msg[idx][k]<< " ";
//   debugfile << ". Parity: " << p_error[idx] << " frmidx:" << frmidx << endl;
//#endif
   navmsgparity[idx].par[frmidx-1] = 0;
   memcpy((void*)&navmsgparity[idx].msg[frmidx-1][0],(void*)&nav_msg[idx][0],10*sizeof(unsigned int));
   if( frmidx == 5) // we get all 5 subframes
    read_allsubframe(idx);
  }
 }
}

//--------------------------------------------------------------------
/*++
 Routine Description:
    Check parity for one subframe
     For details algorithmm, refer to ICD_GPS_200C
 Argument:
         ch_i :  indicate which channel to read
 Rreturn:
         none;

--*/
void GPS_Func::parity_check(int ch_i)
{
 char b_1, b_2, b_3, b_4, b_5, b_6;
 int parity, m_parity;
 p_error[ch_i] = 0x0;

 for( int word=0; word<10; word++)
 {
       m_parity = nav_msg[ch_i][word] & 0x3f;
       b_1=exor(prev_bit[0],nav_msg[ch_i][word] & pb1) *32;
       b_2=exor(prev_bit[1],nav_msg[ch_i][word] & pb2) *16;
       b_3=exor(prev_bit[0],nav_msg[ch_i][word] & pb3) *8;
       b_4=exor(prev_bit[1],nav_msg[ch_i][word] & pb4) *4;
       b_5=exor(0,nav_msg[ch_i][word] & pb5) *2;
       b_6=exor(prev_bit[0]^prev_bit[1],nav_msg[ch_i][word] & pb6);
       parity=b_1+b_2+b_3+b_4+b_5+b_6;
       if( parity != m_parity ) // parity check failed
        p_error[ch_i] = p_error[ch_i]*2 +1;
       else
        p_error[ch_i] = p_error[ch_i]*2;

       if( prev_bit[1] )
        nav_msg[ch_i][word] = nav_msg[ch_i][word]^0x3fffffc0;
       nav_msg[ch_i][word] = nav_msg[ch_i][word]>>6;
       prev_bit[0]=(m_parity & 0x2) >>1;
       prev_bit[1]= m_parity & 0x1;
 }

}
//--------------------------------------------------------------------
/*++
 Routine Description:
   Read nav msg for one channel,
    get ephemeris data for this channel.
 Argument:
         idx :  indicate which channel to read
 Rreturn:
         none;

--*/
void GPS_Func::read_allsubframe(int idx)
{
 int iodc,iode,idoe, iweek, iura, ihealth, iaf0, im0, inc0, iomega0,iw;
 int iomegadot, idot, prn;
 char itgd,iaf2;
 unsigned int itoc, ie,isqra, itoe;
 short int iaf1,icrs, idn, icuc,icus,icic,icis,icrc;
 unsigned int *sf;
 double r_sqra,r_inc0,r_ety;

 sf = (unsigned int*)&navmsgparity[idx].msg[0][0];
 prn = ch_prn[idx];

 if( navmsgparity[idx].par[0] == 0 &&
     navmsgparity[idx].par[1] == 0 &&
     navmsgparity[idx].par[2] == 0) // if frm1-3 is correct
     {
      iodc=int(((sf[0*10+2] & 0x3) <<8 ) | ((sf[0*10+7] & 0xFF0000) >>16));
      iode=int(sf[1*10+2]  >> 16);
      idoe=int(sf[2*10+9] >> 16);

      if( (iode == idoe) &&
          ( (iode!= Ephemeris[ prn ].iode) || (iodc!=Ephemeris[ prn ].iodc) ))
      {

       // subframe 1

       iweek= int(sf[0*10+2] >> 14);
       iura=int(( sf[0*10+2] & 0xF00 ) >> 8);
       ihealth=int(( sf[0*10+2] & 0xFC ) >> 2);
       itgd=sf[0*10+6] & 0xFF;
       itoc=sf[0*10+7] & 0xFFFF;
       iaf2=sf[0*10+8] >> 16;
       iaf1=sf[0*10+8] & 0xFFFF;
       iaf0=sf[0*10+9] >> 2;
       if( iaf0 & 0x200000) iaf0=iaf0 | 0xFFC00000; // sign extension

       //   subframe 2
       icrs=sf[1*10+2] & 0xFFFF;
       idn =(sf[1*10+3]>>8) & 0xFFFF;
       im0=((sf[1*10+3] & 0xFF) << 24) | sf[1*10+4];
       icuc=(sf[1*10+5]>>8) & 0xFFFF;
       ie=((sf[1*10+5] & 0xFF) << 24) | sf[1*10+6];
       icus=(sf[1*10+7]>>8) & 0xFFFF;
       isqra=(((sf[1*10+7] & 0xFF) << 24) | sf[1*10+8]);
       itoe=int(sf[1*10+9] >> 8);

       // subframe 3
       icic=(sf[2*10+2]>>8) & 0xFFFF;
       icis=(sf[2*10+4]>>8) & 0xFFFF;
       inc0=((sf[2*10+4] & 0xFF) << 24) | sf[2*10+5];
       iomega0=((sf[2*10+2] & 0xFF) << 24) | sf[2*10+3];
       icrc=(sf[2*10+6]>>8) & 0xFFFF;
       iw=((sf[2*10+6] & 0xFF) << 24) | sf[2*10+7];
       iomegadot=sf[2*10+8];
       if (iomegadot&0x800000)
        iomegadot=iomegadot | 0xFF000000;  // sign extension
       idot=((sf[2*10+9] & 0xFFFC) >> 2);
       if (idot&0x2000)
        idot=idot | 0xFFFFC000; // sign extension

       r_sqra=isqra*c_2m19;
       r_inc0=inc0*c_2m31*PI;
       r_ety=ie*c_2m33;

       if (   (r_inc0<1.05 && r_inc0>0.873)&&
              (r_sqra>5100.0 && r_sqra<5200.0)&&
              (r_ety <.05 && r_ety>0.0)  )
        {
          Ephemeris[prn].valid=1;
          eph_valid[prn] = true;  //set this global variable for gpsnav thread use

          Ephemeris[prn].iode=iode;
          Ephemeris[prn].iodc=iodc;
	  Ephemeris[prn].week=iweek;
	  Ephemeris[prn].ura=iura;
	  Ephemeris[prn].health=ihealth;
	  Ephemeris[prn].tgd=itgd*c_2m31;
	  Ephemeris[prn].toc=itoc*16.0;
	  Ephemeris[prn].af2=iaf2*c_2m55;
	  Ephemeris[prn].af1=iaf1*c_2m43;
	  Ephemeris[prn].af0=iaf0*c_2m31;
	  Ephemeris[prn].crs=icrs*c_2m5;
	  Ephemeris[prn].dn=idn*c_2m43*PI;
	  Ephemeris[prn].ma=im0*c_2m31*PI;
	  Ephemeris[prn].cuc=icuc*c_2m29;
	  Ephemeris[prn].ety=r_ety;
	  Ephemeris[prn].cus=icus*c_2m29;
	  Ephemeris[prn].sqra=r_sqra;
	  Ephemeris[prn].wm=19964981.84/pow(r_sqra,3);
	  Ephemeris[prn].toe=itoe*c_2p4;
	  Ephemeris[prn].cic=icic*c_2m29;
	  Ephemeris[prn].cis=icis*c_2m29;
	  Ephemeris[prn].inc0=r_inc0;
	  Ephemeris[prn].w0=iomega0*c_2m31*PI;
	  Ephemeris[prn].crc=icrc*c_2m5;
	  Ephemeris[prn].w=iw*c_2m31*PI;
	  Ephemeris[prn].omegadot=iomegadot*c_2m43*PI;
	  Ephemeris[prn].idot=idot*c_2m43*PI;
        } // end of  if (   (r_inc0<1.05 && r_inc0>0.873)&&
      } // end of if ( (iode == idoe) &&

     } // end of if( navmsgparity[idx].par[0] == 0 &&


  // finally init parity to invalid values back
  for( int j=0; j<5; j++)
  {
   navmsgparity[idx].par[j] = 0x1;  // init parity values for 5 frm of all channels
   memset((void*)&navmsgparity[idx].msg[j][0],0,10*sizeof(unsigned int));
  }
}
//--------------------------------------------------------------------
/*++
 Routine Description:
   Get result of processing ,
    such as user's pos, user's velocity, accurate time, etc.
 Argument:
         nav_pt:  pointer for processing result storing;
 Rreturn:
         none;

--*/

void GPS_Func::get_navinfo( PT_navinfo_disp nav_pt)
{
 memcpy(nav_pt->ECEFpos, ECEFuserpos, 3*sizeof(double));
 memcpy(nav_pt->NEDpos, NEDuserpos, 3*sizeof(double));
 memcpy(nav_pt->ECEFvel, ECEFvel, 3*sizeof(double));
 nav_pt->clk_bias = clk_bias;
 nav_pt->rcv_time = AccurateTime;
 nav_pt->GDOP = gdop;
 nav_pt->TDOP = tdop;
 nav_pt->PDOP = pdop;
 nav_pt->HDOP = hdop;
 nav_pt->VDOP = vdop;
}

//--------------------------------------------------------------------
/*++
 Routine Description:
  Set prn allocation according to sat's elevation.
 Argument:
         pn_num:  prn allocation buffer pointer;
 Rreturn:
         none;
--*/

void GPS_Func::SelectPrn(int* pn_num)
{
 int prn_idx[SatMax+1],tmp_id, sat_count, flag ;
 double ele[SatMax+1], tmp_ele;

 sat_count = 0;
 memset(prn_idx, 0, sizeof(prn_idx));

 for(int i=0 ; i<  SatMax+1; i++)
 {
  if( Almanac[i].SatId != 0 && Almanac[i].Ele > 0.) // a valid satellite
  {
   prn_idx[sat_count] = Almanac[i].SatId;
   ele[sat_count] = Almanac[i].Ele;
   sat_count++;
  }
 }
 // bubble sort to find the 6 biggest elevations
 do{
  flag = 0;
  for( int i=1; i< sat_count; i++)
   if( ele[i] > ele[i-1] )
   {   // swap i and i-1
    tmp_id = prn_idx[i];
    tmp_ele = ele[i];

    prn_idx[i] = prn_idx[i-1];
    ele[i] = ele[i-1];

    prn_idx[i-1] = tmp_id;
    ele[i-1] = tmp_ele;

    flag = 1; // set flat to indicate we need further addjustment
   }
 }while( flag );

 for( int idx = 0; idx < 6 ; idx++)
  pn_num[idx] = prn_idx[idx];

}

//--------------------------------------------------------------------
/*++
 Routine Description:
  calculate position of sats through almanac data
   and set prn allocation accordingly.
 Argument:
         pn:  prn allocation buffer pointer;
         gt:  struct tm* pointer, pointing to time of setting;
         AlmFile: FILE pointer of almanac file;
         Pos: roughly guessed user position;
 Rreturn:
         0;

--*/

int GPS_Func::CalcPrnSetting( int *pn, struct tm* gt, FILE* AlmFile, double *Pos )
{
 long double jd;
 int gpsweek, timeweek;

 SetUserPos(Pos);

 jd = CalcJulianDay(gt);
 gpsweek = CalcGpsWeek( jd );

 timeweek = CalcToW(jd);

 ReadAlm(AlmFile);
 process_allsat(timeweek, gpsweek);
 SelectPrn(pn);

 return 0; // should return some more meaningful value?
}
//--------------------------------------------------------------------
/*++
 Thread related functions...
 --*/

void GPS_Func::CreateGpsThrd(void)
{
 gpsthrd = new GpsThrd(true,this);
 thrdtermed = false;
 gpsthrd->Resume();
}
void GPS_Func::TerminateThrd(void)
{
 if( gpsthrd )
  gpsthrd->Terminate();
}
// function to set the terminate status of sampling thread
void GPS_Func::SetThrdStatus(bool stat)
{
 thrdtermed = stat;
}
bool GPS_Func::NavThrdIsTermed()
{
 return (thrdtermed);
}




?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
26uuu成人网一区二区三区| 国产欧美日韩久久| 国产成人免费在线观看不卡| 亚洲一区二区三区四区的| 久久久不卡影院| 4438x成人网最大色成网站| caoporn国产一区二区| 久久99久久99| 午夜激情一区二区| 一区二区三区四区在线播放| 久久九九久久九九| 日韩欧美一级二级三级久久久| 色94色欧美sute亚洲线路一久| 国内国产精品久久| 免费在线视频一区| 一二三区精品视频| 亚洲免费观看高清完整版在线观看| 精品久久久久久综合日本欧美 | 色婷婷精品大视频在线蜜桃视频| 激情五月播播久久久精品| 日韩成人一级大片| 亚洲成av人片www| 夜夜嗨av一区二区三区网页| 国产精品久久久久久一区二区三区 | 欧美大胆人体bbbb| 91精品免费观看| 欧美精品一二三| 欧美人体做爰大胆视频| 在线免费观看不卡av| 色综合天天综合色综合av| 99久久国产综合精品女不卡| 国产aⅴ精品一区二区三区色成熟| 精品中文av资源站在线观看| 美女在线视频一区| 毛片不卡一区二区| 精品综合久久久久久8888| 久久成人免费网| 国产乱子伦一区二区三区国色天香| 美女视频网站黄色亚洲| 日本系列欧美系列| 久久成人麻豆午夜电影| 韩国精品主播一区二区在线观看| 精品一区二区三区蜜桃| 麻豆国产91在线播放| 韩国午夜理伦三级不卡影院| 国产老妇另类xxxxx| 国产一二精品视频| 成人动漫av在线| 色一区在线观看| 欧美日韩国产一级| 欧美一区二区三区成人| 精品成人一区二区三区| 日本一区二区在线不卡| **欧美大码日韩| 亚洲综合色在线| 卡一卡二国产精品| 丁香激情综合国产| 色综合天天综合在线视频| 欧美日韩免费一区二区三区| 9191国产精品| 久久久亚洲精品石原莉奈| 国产精品久久久久一区二区三区共| 亚洲另类色综合网站| 肉色丝袜一区二区| 国产麻豆成人精品| 欧美在线不卡一区| 日韩精品中文字幕在线一区| 国产精品欧美经典| 亚洲第一福利视频在线| 国产一区二区三区最好精华液| 成人精品免费看| 欧美日韩精品欧美日韩精品一 | 国产资源精品在线观看| 色综合天天在线| 欧美一级黄色录像| 国产精品国产三级国产普通话蜜臀 | 香蕉av福利精品导航| 激情图区综合网| 在线视频亚洲一区| 精品久久久久久久久久久院品网| 中文字幕日韩av资源站| 奇米精品一区二区三区四区| www.色精品| 精品日韩成人av| 亚洲一区二区三区在线播放| 国产麻豆成人传媒免费观看| 欧美主播一区二区三区美女| 精品国产在天天线2019| 亚洲精品大片www| 国产精品亚洲专一区二区三区| 91免费观看视频在线| 日韩欧美一区二区久久婷婷| 亚洲免费电影在线| 精品一区二区免费视频| 欧美丝袜丝交足nylons图片| 国产欧美一区二区精品婷婷| 日韩和欧美一区二区三区| 成人动漫中文字幕| 精品国产百合女同互慰| 香蕉成人啪国产精品视频综合网| 成人ar影院免费观看视频| 精品国产髙清在线看国产毛片| 亚洲一区av在线| 色综合婷婷久久| 国产精品视频一区二区三区不卡| 久久福利视频一区二区| 欧美男人的天堂一二区| 亚洲三级在线看| 国产99久久精品| 欧美精品一区二区蜜臀亚洲| 亚洲第一电影网| 91豆麻精品91久久久久久| 中文字幕在线不卡一区| 国产成人综合在线播放| 精品国产乱码久久久久久久| 青青草视频一区| 欧美日韩国产综合久久| 亚洲午夜成aⅴ人片| 一本色道亚洲精品aⅴ| 成人欧美一区二区三区黑人麻豆| 国产精品一区二区久久不卡| 精品剧情在线观看| 久久99九九99精品| 日韩女同互慰一区二区| 免费日本视频一区| 91精品国产欧美日韩| 亚洲成人免费影院| 欧美日韩精品一区二区三区四区| 亚洲在线视频免费观看| 欧美视频一区二区| 亚洲伊人伊色伊影伊综合网| 在线观看视频欧美| 亚洲高清免费观看高清完整版在线观看| 色综合一区二区| 亚洲黄色免费网站| 91精品91久久久中77777| 亚洲综合999| 7777精品伊人久久久大香线蕉 | 精品一区二区三区免费视频| 精品少妇一区二区三区免费观看| 精品一区二区三区免费观看| 精品国产91久久久久久久妲己 | 51精品久久久久久久蜜臀| 免费亚洲电影在线| 精品国产伦一区二区三区观看方式| 国内精品写真在线观看| 国产亚洲欧美日韩在线一区| 高清不卡一区二区在线| 国产精品超碰97尤物18| 欧美这里有精品| 日本va欧美va欧美va精品| 久久影院视频免费| youjizz国产精品| 亚洲一区二区三区视频在线播放 | 欧美猛男男办公室激情| 久久成人羞羞网站| 欧美激情资源网| 在线观看网站黄不卡| 日本怡春院一区二区| 久久一区二区三区国产精品| 成人动漫视频在线| 亚洲成av人在线观看| 欧美大白屁股肥臀xxxxxx| 风流少妇一区二区| 一区二区三区在线视频免费观看| 欧美人牲a欧美精品| 国产精品1区二区.| 亚洲美女屁股眼交3| 欧美一区二区三区四区久久| 国产盗摄女厕一区二区三区| 亚洲综合在线观看视频| 日韩欧美资源站| 99久久99久久精品国产片果冻| 午夜精品123| 国产精品毛片无遮挡高清| 欧美性猛片xxxx免费看久爱| 国内成+人亚洲+欧美+综合在线| 亚洲视频免费看| 日韩一区二区免费在线观看| 成人精品免费看| 青青草成人在线观看| 中文字幕在线一区| 91精品国产一区二区三区| 成人在线视频首页| 日韩二区在线观看| 综合自拍亚洲综合图不卡区| 欧美一级欧美三级在线观看| 成人免费观看av| 久久精品国产99国产| 一区二区三区色| 欧美激情一区二区三区| 日韩视频123| 欧美在线一二三| 成人动漫一区二区在线| 久久成人av少妇免费| 亚洲国产sm捆绑调教视频| 国产精品三级视频| 2022国产精品视频| 666欧美在线视频| 色婷婷精品大在线视频 |