00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 #include "GPSObserver.h"
00014 
00015 using namespace std;
00016 
00017 
00018 GPSObserver::GPSObserver( )
00019 {
00020         Initialize( );
00021 }
00022 
00023 
00024 
00025 
00026 
00027 GPSObserver::GPSObserver( TiXmlHandle handle, Whorl* ptr_whorl )
00028 {
00029         m_whorl = ptr_whorl;
00030 
00031         Initialize( );
00032 
00033         
00034         Parse( handle );
00035 }
00036 
00037 
00038 GPSObserver::~GPSObserver( )
00039 { }
00040 
00041 
00042 
00043 int GPSObserver::Initialize( )
00044 {
00045         
00046         static const char               GPS_HOST[]      = "128.173.89.201"; 
00047         static const unsigned short     GPS_PORT        = 5002; 
00048 
00049         
00050         m_SpaceVehicle.Connect( GPS_HOST, GPS_PORT );
00051 
00052         m_WGS84Vector.initialize(6);
00053         m_ECEFVector.initialize(6);
00054         m_ECIVector.initialize(6);
00055 
00056         m_InitialTime = Now( );
00057         
00058         return( 0 );
00059 }
00060 
00061 
00062 
00063 
00064 void GPSObserver::Parse( TiXmlHandle handle )
00065 {
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 }
00093 
00094 
00095 int GPSObserver::Run( )
00096 {
00097         
00098         
00099         if ( m_SpaceVehicle.GetCurrentPosition( m_SpaceVehiclePosition ) )
00100         {
00101                 cerr << "WARNING: GPS Status returned failure.  "<< endl;
00102                 return( 0 );
00103         }
00104 
00105         if (  m_SpaceVehiclePosition.m_numSatellites <= 4 )
00106         {
00107                 cerr << "WARNING: Number of GPS Satellites less than 4.  "<< endl;
00108                 return( 0 );
00109         }
00110 
00111 
00112         
00113         
00114 
00115         TangentPlaneState( m_SpaceVehiclePosition, m_WGS84Vector );
00116         
00117         m_ECEFVector = WGS842ECEF( m_WGS84Vector(1), m_WGS84Vector(2), m_WGS84Vector(3),  m_WGS84Vector(4),  m_WGS84Vector(5),  m_WGS84Vector(6) );
00118 
00119         
00120         static ssfTime currentTime = Now( );
00121         static tm currentTimetm;
00122         currentTimetm = currentTime.GetDateTime( );
00123         tm G12Time;
00124         G12Time.tm_mday = currentTimetm.tm_mday;
00125         G12Time.tm_mon = currentTimetm.tm_mon;
00126         G12Time.tm_year = currentTimetm.tm_year;
00127         G12Time.tm_hour = int( m_SpaceVehiclePosition.m_UTC_Timetag ) /10000; 
00128         G12Time.tm_min = int( ( m_SpaceVehiclePosition.m_UTC_Timetag - double( G12Time.tm_hour )*10000 ) /100 ); 
00129         G12Time.tm_sec = int( ( m_SpaceVehiclePosition.m_UTC_Timetag - G12Time.tm_hour*10000 ) - G12Time.tm_min*100 ); 
00130         static double u_sec = ( ( m_SpaceVehiclePosition.m_UTC_Timetag - G12Time.tm_hour*10000 ) - G12Time.tm_min*100 ) - G12Time.tm_sec; 
00131         static ssfTime GPSTime( G12Time );
00132         static ssfTime Time( GPSTime.GetSeconds( ) + u_sec );
00133 
00134 
00135         m_ECIVector = ECEF2ECI( m_ECEFVector, Time.GetJulianDate( ) );
00136 
00137         
00138         m_SpaceVehicleOsculatingCOE.SetOsculatingOrbitalElements( m_ECIVector/1000 );
00139 
00140         
00141         m_SpaceVehicleMeanCOE = m_SpaceVehicleOsculatingCOE.GetMeanOrbitalElements( ) ;
00142         static double a, e, i, Lon, Arg, tru, E, M, M0;
00143                                 a = m_SpaceVehicleMeanCOE.GetSemimajorAxis( );
00144                                 e = m_SpaceVehicleMeanCOE.GetEccentricity( );
00145                                 i = m_SpaceVehicleMeanCOE.GetInclination( );
00146                                 Lon = m_SpaceVehicleMeanCOE.GetLongAscNode( );
00147                                 Arg = m_SpaceVehicleMeanCOE.GetArgPerigee( );
00148                                 tru = m_SpaceVehicleMeanCOE.GetTrueAnomaly( );
00149                                 E = m_SpaceVehicleMeanCOE.GetEccentricAnomaly( );
00150                                 M = m_SpaceVehicleMeanCOE.GetMeanAnomaly( );
00151                                 M0 = M - m_SpaceVehicleMeanCOE.GetMeanMotion( ) * ( Time.GetSeconds( ) - m_InitialTime.GetSeconds( ) );
00152         
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163         m_whorl->SetCOE( m_SpaceVehicleMeanCOE );
00164         m_whorl->SetOscCOE( m_SpaceVehicleOsculatingCOE.GetOsculatingOrbitalElements( ) );
00165         m_whorl->SetECI( m_ECIVector );
00166 
00167         return( 0 );
00168 }
00169 
00170 Vector GPSObserver::GetWGS84( )
00171 {
00172         return( m_WGS84Vector );
00173 }
00174 
00175 Vector GPSObserver::GetECEF( )
00176 {
00177         return( m_ECEFVector );
00178 }
00179 
00180 Vector GPSObserver::GetECI( )
00181 {
00182         return( m_ECIVector );
00183 }
00184 
00185 Keplerian GPSObserver::GetOsculatingOrbitalElements( )
00186 {
00187         return( m_SpaceVehicleOsculatingCOE.GetOsculatingOrbitalElements( ) );
00188 }
00189 
00190 Keplerian GPSObserver::GetMeanOrbitalElements( )
00191 {
00192         return( m_SpaceVehicleMeanCOE );
00193 }
00194 
00195 
00196 void GPSObserver::GPS2Screen( AshtechG12_GPS_PhysicalDevice::Position _spaceVehicle )
00197 {
00198         cout << "......Navigation Information Obtained from GPS Receiver......." << endl;
00199         cout << "RTCM... " << _spaceVehicle.m_RTCM << endl;
00200         cout << "Num Sats...   " <<  _spaceVehicle.m_numSatellites << endl;
00201         printf ("UTC Timetag: %6.2f\n", _spaceVehicle.m_UTC_Timetag);
00202         cout << "latitude... " << _spaceVehicle.m_latitude << endl;
00203         cout << "latitude sector... " << _spaceVehicle.m_latitudeSector << endl;
00204         cout << "long... " << _spaceVehicle.m_longitude << endl;
00205         cout << "long sector... " << _spaceVehicle.m_longitudeSector << endl;
00206         cout << "alt.. " << _spaceVehicle.m_altitude << endl;
00207         cout << "ground.. " << _spaceVehicle.m_groundTrack << endl;
00208         cout << "speed.. " << _spaceVehicle.m_groundSpeed << endl;
00209         cout << "vert.. " << _spaceVehicle.m_verticalVelocity << endl;
00210         cout << "Pdop.. " << _spaceVehicle.m_PDOP << endl;
00211         cout << "hdop.. " << _spaceVehicle.m_HDOP << endl;
00212         cout << "vdop.. " << _spaceVehicle.m_VDOP << endl;
00213         cout << "Tdop.. " << _spaceVehicle.m_TDOP << endl;
00214 }
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222 
00223 
00224 
00225 
00226 
00227