00001 ////////////////////////////////////////////////////////////////////////////////////////////////// 00002 /*! \file WhorlSim.cpp 00003 * \brief Implementation of the WhorlSim class. 00004 * \author $Author: jayhawk_hokie $ 00005 * \version $Revision: 1.8 $ 00006 * \date $Date: 2007/08/31 16:00:19 $ 00007 *////////////////////////////////////////////////////////////////////////////////////////////////// 00008 /*! 00009 */ 00010 ////////////////////////////////////////////////////////////////////////////////////////////////// 00011 00012 #include "WhorlSim.h" 00013 00014 // Constructor/Deconstructor 00015 WhorlSim::WhorlSim( ) 00016 { } 00017 00018 WhorlSim::WhorlSim( Whorl* ptr_whorl ) 00019 { 00020 m_omniscient = ptr_whorl; 00021 } 00022 00023 WhorlSim::~WhorlSim( ) 00024 { 00025 cerr << "\n--------------------------------------------------------------" << endl; 00026 cerr << "Deinitializing WhorlSim Object" << endl; 00027 cerr << "--------------------------------------------------------------" << endl; 00028 00029 switch ( s_mapStringValues[ m_omniscient->GetHardwareFlag( ) ] ) 00030 { 00031 case ON: 00032 switch ( s_mapStringValues[ m_observerName ] ) 00033 { 00034 case OFF : 00035 // No Observer Set 00036 break; 00037 default: 00038 delete m_omnipresent; 00039 cerr << "Delete " << m_observerName << " Object" << endl; 00040 break; 00041 } 00042 00043 switch ( s_mapStringValues[ m_controllerName ] ) 00044 { 00045 case OFF : 00046 // No Control Set 00047 break; 00048 default: 00049 delete m_omnipotent; 00050 cerr << "Delete " << m_controllerName << " Object" << endl; 00051 break; 00052 } 00053 break; 00054 case OFF: 00055 // Hardware OFF 00056 break; 00057 default: 00058 break; 00059 } 00060 00061 switch ( s_mapStringValues[ m_OrbitObserverName ] ) 00062 { 00063 case OFF : 00064 // No Observer Set 00065 break; 00066 default: 00067 delete m_omnipresent2; 00068 cerr << "Delete " << m_OrbitObserverName << " Object" << endl; 00069 break; 00070 } 00071 00072 cerr << "\nDeinitialization of WhorlSim Object Complete " << endl; 00073 cerr << "--------------------------------------------------------------" << endl; 00074 cerr << "--------------------------------------------------------------" << endl; 00075 } 00076 00077 00078 /*! \brief Initialize a whorlsim object 00079 * @param handle XML handle with current whorl as starting node 00080 */ 00081 int WhorlSim::Initialize( TiXmlHandle handle ) 00082 { 00083 cerr << "\n--------------------------------------------------------------" << endl; 00084 cerr << "Creating WhorlSim Object " << endl; 00085 cerr << "--------------------------------------------------------------" << endl; 00086 00087 s_mapStringValues["ON"] = ON; 00088 s_mapStringValues["OFF"] = OFF; 00089 // Observer 00090 s_mapStringValues["atterrbiasObserver"] = s_atterrbiasObserver; 00091 s_mapStringValues["AttitudeObserver"] = s_AttitudeObserver; 00092 s_mapStringValues["DefaultObserver"] = s_DefaultObserver; 00093 s_mapStringValues["triadObserver"] = s_triadObserver; 00094 s_mapStringValues["QuaternionEKFObserver"] = s_QuaternionEKFObserver; 00095 // Controller 00096 s_mapStringValues["DefaultController"] = s_DefaultController; 00097 s_mapStringValues["AngularRateController"] = s_AngularRateController; 00098 s_mapStringValues["MWCMGController"] = s_MWCMGController; 00099 s_mapStringValues["OpenLoopMWController"]= s_OpenLoopMWController; 00100 s_mapStringValues["MRPTracking"]= s_MRPTracking; 00101 s_mapStringValues["slidingModeControlMRPMW"]= s_slidingModeControlMRPMW; 00102 00103 // Orbit Observer 00104 s_mapStringValues["GPSObserver"] = s_GPSObserver; 00105 s_mapStringValues["OrbitPropObserver"] = s_OrbitPropObserver; 00106 00107 // Orbit Controller 00108 s_mapStringValues["COENaaszController"] = s_COENaaszController; 00109 00110 00111 switch ( s_mapStringValues[ m_omniscient->GetHardwareFlag( ) ] ) 00112 { 00113 case ON: 00114 SetObserver( handle ); 00115 SetController( handle ); 00116 break; 00117 case OFF: 00118 break; 00119 default: 00120 break; 00121 } 00122 00123 // Orbit Observer 00124 SetOrbitObserver( handle ); 00125 00126 // Orbit Controller 00127 SetOrbitController( handle ); 00128 00129 cerr << "\nInitialization of WhorlSim Object Complete " << endl; 00130 cerr << "--------------------------------------------------------------" << endl; 00131 cerr << "--------------------------------------------------------------" << endl; 00132 00133 return( 0 ); 00134 } 00135 00136 /*! \brief Set Observer 00137 * @param handle XML handle with current whorl as starting node 00138 */ 00139 void WhorlSim::SetObserver( TiXmlHandle handle ) 00140 { 00141 // get observer name from configuration file 00142 m_observerName = handle.FirstChild( m_omniscient->GetSimulatorName( ) ).Child("OBSERVER", 0).Element() -> Attribute("value"); 00143 00144 switch ( s_mapStringValues[ m_observerName ] ) 00145 { 00146 case OFF: 00147 cerr << "\nNo Observer Set." << endl; 00148 break; 00149 case s_atterrbiasObserver: 00150 m_omnipresent = new atterrbiasObserver( m_omniscient ); 00151 cerr << " \nObserver Set: " << m_observerName << endl; 00152 break; 00153 case s_AttitudeObserver: 00154 m_omnipresent = new AttitudeObserver( m_omniscient ); 00155 cerr << " \nObserver Set: " << m_observerName << endl; 00156 break; 00157 case s_DefaultObserver: 00158 m_omnipresent = new DefaultObserver( m_omniscient ); 00159 cerr << " \nObserver Set: " << m_observerName << endl; 00160 break; 00161 case s_triadObserver: 00162 m_omnipresent = new triadObserver( handle, m_omniscient ); 00163 cerr << " \nObserver Set: " << m_observerName << endl; 00164 break; 00165 case s_QuaternionEKFObserver: 00166 m_omnipresent = new QuaternionEKFObserver( handle, m_omniscient ); 00167 cerr << " \nObserver Set: " << m_observerName << endl; 00168 break; 00169 default: 00170 cerr << "WARNING: Observer Name from Configuration File not recognized. Observer -> " << m_observerName << endl; 00171 break; 00172 } 00173 return ; 00174 } 00175 00176 00177 /*! \brief Set Controller 00178 * @param handle XML handle with current whorl as starting node 00179 */ 00180 void WhorlSim::SetController( TiXmlHandle handle ) 00181 { 00182 // get controller name from configuration file 00183 m_controllerName = handle.FirstChild( m_omniscient->GetSimulatorName( ) ).Child("CONTROLLER", 0).Element() -> Attribute("value"); 00184 00185 switch ( s_mapStringValues[ m_controllerName ] ) 00186 { 00187 case OFF : 00188 // No Control Set 00189 cerr << "\nNo Controller Set" << endl; 00190 break; 00191 case s_DefaultController : 00192 // Lyapunov angular rate controller 00193 m_omnipotent = new DefaultController(m_omniscient); 00194 cerr << "\nController Set: " << m_controllerName << endl; 00195 break; 00196 case s_AngularRateController : 00197 // Lyapunov angular rate controller 00198 m_omnipotent = new AngularRateController(m_omniscient); 00199 cerr << "\nController Set: " << m_controllerName << endl; 00200 break; 00201 case s_MWCMGController : 00202 // momentum wheel and CMG controller 00203 m_omnipotent = new MWCMGController(m_omniscient); 00204 cerr << "\nController Set: " << m_controllerName << endl; 00205 break; 00206 case s_OpenLoopMWController : 00207 m_omnipotent = new OpenLoopMWController(m_omniscient); 00208 cerr << "\nController Set: " << m_controllerName << endl; 00209 break; 00210 case s_MRPTracking : 00211 m_omnipotent = new MRPTracking(m_omniscient); 00212 cerr << "\nController Set: " << m_controllerName << endl; 00213 break; 00214 case s_slidingModeControlMRPMW : 00215 m_omnipotent = new slidingModeControlMRPMW(m_omniscient); 00216 cerr << "\nController Set: " << m_controllerName << endl; 00217 break; 00218 default: 00219 cerr << "WARNING: Controller Name from Configuration File not recognized. Controller -> " << m_controllerName << endl; 00220 break; 00221 } 00222 return ; 00223 } 00224 00225 00226 /*! \brief Set Orbit Observer 00227 * @param handle XML handle with current whorl as starting node 00228 */ 00229 void WhorlSim::SetOrbitObserver( TiXmlHandle handle ) 00230 { 00231 // get observer name from configuration file 00232 m_OrbitObserverName = handle.FirstChild( m_omniscient->GetSimulatorName( ) ).Child("ORBIT_OBSERVER", 0).Element() -> Attribute("value"); 00233 00234 switch ( s_mapStringValues[ m_OrbitObserverName ] ) 00235 { 00236 case OFF: 00237 cerr << "\nNo Orbit Observer Set." << endl; 00238 break; 00239 case s_GPSObserver: 00240 m_omnipresent2 = new GPSObserver( handle, m_omniscient ); 00241 cerr << " \nOrbit Observer Set: " << m_OrbitObserverName << endl; 00242 break; 00243 case s_OrbitPropObserver: 00244 m_omnipresent2 = new OrbitPropObserver( handle, m_omniscient ); 00245 cerr << " \nOrbit Observer Set: " << m_OrbitObserverName << endl; 00246 break; 00247 default: 00248 cerr << "WARNING: Orbit Observer Name from Configuration File not recognized. Observer -> " << m_OrbitObserverName << endl; 00249 break; 00250 } 00251 return ; 00252 } 00253 00254 /*! \brief Set Orbit Controller 00255 * @param handle XML handle with current whorl as starting node 00256 */ 00257 void WhorlSim::SetOrbitController( TiXmlHandle handle ) 00258 { 00259 // get observer name from configuration file 00260 m_OrbitControllerName = handle.FirstChild( m_omniscient->GetSimulatorName( ) ).Child("ORBIT_CONTROLLER", 0).Element() -> Attribute("value"); 00261 00262 switch ( s_mapStringValues[ m_OrbitControllerName ] ) 00263 { 00264 case OFF: 00265 cerr << "\nNo Orbit Observer Set." << endl; 00266 break; 00267 case s_GPSObserver: 00268 m_omnipotent2 = new COENaaszController( m_omniscient ); 00269 cerr << " \nOrbit Controller Set: " << m_OrbitControllerName << endl; 00270 break; 00271 default: 00272 cerr << "WARNING: Orbit Controller Name from Configuration File not recognized. Controller -> " << m_OrbitControllerName << endl; 00273 break; 00274 } 00275 return ; 00276 } 00277 00278 // Do not change the comments below - they will be added automatically by CVS 00279 /***************************************************************************** 00280 * $Log: WhorlSim.cpp,v $ 00281 * Revision 1.8 2007/08/31 16:00:19 jayhawk_hokie 00282 * Added Orbit Control Capability. 00283 * 00284 * Revision 1.7 2007/07/24 09:40:35 jayhawk_hokie 00285 * Removed matrix and vector pointers. 00286 * 00287 * Revision 1.6 2007/05/29 19:14:58 jayhawk_hokie 00288 * Added Constructor Comments 00289 * 00290 * Revision 1.5 2007/05/21 17:50:34 jayhawk_hokie 00291 * Added Quaternion Observer 00292 * 00293 * Revision 1.4 2007/04/09 14:00:10 jayhawk_hokie 00294 * Modifications to parsing XML config file. 00295 * 00296 * Revision 1.3 2007/03/27 19:12:35 jayhawk_hokie 00297 * Added Switch case for observers and Controllers. 00298 * 00299 * Revision 1.2 2007/01/12 20:31:04 bwilliam 00300 * Modified to use XML parser. 00301 * 00302 * Revision 1.1 2003/08/18 19:23:47 mavandyk 00303 * *** empty log message *** 00304 * 00305 * Revision 1.7 2003/08/06 21:44:21 mavandyk 00306 * Altered to get config parsing to work. 00307 * 00308 ******************************************************************************/