Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

UserVehicles.cpp

Go to the documentation of this file.
00001 /*
00002  * UserVehicles.cpp
00003  *
00004  * Part of Fly! Legacy project
00005  *
00006  * Copyright 2003 Chris Wallace
00007  *
00008  * Fly! Legacy is free software; you can redistribute it and/or modify
00009  *   it under the terms of the GNU General Public License as published by
00010  *   the Free Software Foundation; either version 2 of the License, or
00011  *   (at your option) any later version.
00012  *
00013  * Fly! Legacy is distributed in the hope that it will be useful,
00014  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  *   GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  *   along with Fly! Legacy; if not, write to the Free Software
00020  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021  *
00022  */
00023 
00037 #include "../Include/Globals.h"
00038 #include "../Include/FlyLegacy.h"
00039 #include "../Include/UserVehicles.h"
00040 #include "../Include/Subsystems.h"
00041 #include "../Include/Cameras.h"
00042 #include "../Include/Ui.h"
00043 #include "../Include/Utility.h"
00044 
00045 using namespace std;
00046 
00047 
00048 //
00049 // CSimulatedVehicle
00050 //
00051 
00052 CSimulatedVehicle::CSimulatedVehicle (const char* svhFilename)
00053 {
00054   SStream s;
00055   strcpy (s.filename, "World\\");
00056   strcat (s.filename, svhFilename);
00057   strcpy (s.mode, "r");
00058   if (OpenStream (&s)) {
00059     ReadFrom (this, &s);
00060     CloseStream (&s);
00061   }
00062 }
00063 
00064 
00065 int CSimulatedVehicle::Read (SStream *stream, Tag tag)
00066 {
00067   int rc = TAG_IGNORED;
00068 
00069   switch (tag) {
00070   case 'type':
00071     // Object type
00072     ReadTag (&type, stream);
00073     rc = TAG_READ;
00074     break;
00075   case 'mxdt':
00076     // Minimum simulation frame rate
00077     ReadUInt (&mxdt, stream);
00078     rc = TAG_READ;
00079     break;
00080   case 'name':
00081     // Aircraft name
00082     ReadString (name, 64, stream);
00083     rc = TAG_READ;
00084     break;
00085   case 'acid':
00086     // Tail number (default)
00087     ReadString (acid, 64, stream);
00088     rc = TAG_READ;
00089     break;
00090   case 'make':
00091     // Manufacturer model name
00092     ReadString (make, 64, stream);
00093     rc = TAG_READ;
00094     break;
00095   case 'emas':
00096     // Empty mass (slugs)
00097     ReadFloat (&emas, stream);
00098     rc = TAG_READ;
00099     break;
00100   case 'mine':
00101     // Moments of Inertia
00102     ReadVector (&mine, stream);
00103     rc = TAG_READ;
00104     break;
00105   case 'CofG':
00106     // Default center of gravity, relative to visual model center
00107     ReadVector (&CofG, stream);
00108     rc = TAG_READ;
00109     break;
00110   case 'imbl':
00111     // Imbalance limit
00112     ReadFloat (&imbl, stream);
00113     rc = TAG_READ;
00114     break;
00115   case 'iceR':
00116     // Ice accumulation rate
00117     ReadFloat (&iceR, stream);
00118     rc = TAG_READ;
00119     break;
00120   case '000a':
00121     // Wing area (sq. ft.)
00122     ReadFloat (&wingarea, stream);
00123     rc = TAG_READ;
00124     break;
00125   case '001a':
00126     // Wing span (ft.)
00127     ReadFloat (&wingspan, stream);
00128     rc = TAG_READ;
00129     break;
00130   case '002a':
00131     // Mean chord (ft.)
00132     ReadFloat (&meanchord, stream);
00133     rc = TAG_READ;
00134     break;
00135   case 'CEIL':
00136     // Ceiling (ft.)
00137     ReadFloat (&ceiling, stream);
00138     rc = TAG_READ;
00139     break;
00140   case '043a':
00141     // Max cruise speed (kts)
00142     ReadFloat (&maxcruisespeed, stream);
00143     rc = TAG_READ;
00144     break;
00145   case '044a':
00146     // Approach speed (kts)
00147     ReadFloat (&approachspeed, stream);
00148     rc = TAG_READ;
00149     break;
00150   case '045a':
00151     // Best climb rate (fps)
00152     ReadFloat (&wingarea, stream);
00153     rc = TAG_READ;
00154     break;
00155   case '048a':
00156     // Never exceed speed (kts)
00157     ReadFloat (&vne, stream);
00158     rc = TAG_READ;
00159     break;
00160   case 'saoa':
00161     // Stall angle of attack
00162     ReadFloat (&stallaoa, stream);
00163     rc = TAG_READ;
00164     break;
00165   case 'posG':
00166     // Positive G limit
00167     ReadFloat (&posG, stream);
00168     rc = TAG_READ;
00169     break;
00170   case 'aoaL':
00171     // Angle of attack limit
00172     ReadFloat (&aoaL, stream);
00173     rc = TAG_READ;
00174     break;
00175   case 'negG':
00176     // Negative G limit
00177     ReadFloat (&negG, stream);
00178     rc = TAG_READ;
00179     break;
00180   case 'stal':
00181     // Simple stall speed (kts)
00182     ReadFloat (&stallspeed, stream);
00183     rc = TAG_READ;
00184     break;
00185   case 'blst':
00186     ReadFloat (&blst, stream);
00187     rc = TAG_READ;
00188     break;
00189   case 'wTrb':
00190     // Wing turbulence data
00191     ReadFloat (&wTrbSpeed, stream);   // Speed
00192     ReadFloat (&wTrbTimK, stream);    // Time constant
00193     ReadFloat (&wTrbCeiling, stream); // Ceiling ft MSL
00194     ReadFloat (&wTrbDuration, stream);  // Duration sec
00195     rc = TAG_READ;
00196     break;
00197   case 'nTrb':
00198     // ??? turbulence data
00199     ReadFloat (&nTrbSpeed, stream);   // Speed
00200     ReadFloat (&nTrbTimK, stream);    // Time constant
00201     ReadFloat (&nTrbCeiling, stream); // Ceiling ft MSL
00202     ReadFloat (&nTrbDuration, stream);  // Duration sec
00203     rc = TAG_READ;
00204     break;
00205   case 'dieh':
00206     // Diehedral Effect Table
00208     SkipObject (stream);
00209     rc = TAG_READ;
00210     break;
00211   case 'pitd':
00212     // Pitch moment table
00213     SkipObject (stream);
00214     rc = TAG_READ;
00215     break;
00216   case 'acrd':
00217     // Rudder deflection vs. bank angle
00218     SkipObject (stream);
00219     rc = TAG_READ;
00220     break;
00221   case 'sfxd':
00222     // Sound effects
00223     ReadTag (&sfxdTag, stream);
00224     ReadString (sfxdFilename, 64, stream);
00225     rc = TAG_READ;
00226     break;
00227   case 'mAlt':
00228     // Status bar display : Altitude message
00229     ReadMessage (&mAlt, stream);
00230     rc = TAG_READ;
00231     break;
00232   case 'mSpd':
00233     // Status bar display : Airspeed message
00234     ReadMessage (&mSpd, stream);
00235     rc = TAG_READ;
00236     break;
00237   case 'mVsi':
00238     // Status bar display : Vertical speed message
00239     ReadMessage (&mVsi, stream);
00240     rc = TAG_READ;
00241     break;
00242   case 'mMag':
00243     // Status bar display : Magnetic compass heading message
00244     ReadMessage (&mMag, stream);
00245     rc = TAG_READ;
00246     break;
00247   case 'mRpm':
00248     // Status bar display : Engine RPM
00249     ReadMessage (&mRpm, stream);
00250     rc = TAG_READ;
00251     break;
00252   }
00253 
00254   if (rc != TAG_READ) {
00255     // Tag was not processed by this object, it is unrecognized
00256     char s[16];
00257     TagToString (s, tag);
00258     globals->logWarning->Write ("CSimulatedVehicle::Read : Unrecognized tag <%s>", s);
00259   }
00260 
00261   return rc;
00262 }
00263 
00264 void CSimulatedVehicle::ReadFinished (void)
00265 {
00266 }
00267 
00268 void CSimulatedVehicle::Write (SStream *stream)
00269 {
00270 }
00271 
00272 
00273 //
00274 // CFuelSystem
00275 //
00276 
00277 CFuelSystem::CFuelSystem (const char* gasFilename)
00278 {
00279   // Initialize data members
00280   grad = AIRPORT_FUEL_100LL;
00281 
00282   // Populate data members from GAS stream file
00283   SStream s;
00284   strcpy (s.filename, "World\\");
00285   strcat (s.filename, gasFilename);
00286   strcpy (s.mode, "r");
00287   if (OpenStream (&s)) {
00288     ReadFrom (this, &s);
00289     CloseStream (&s);
00290   }
00291 }
00292 
00293 CFuelSystem::~CFuelSystem (void)
00294 {
00295   vector<CFuelSubsystem*>::iterator i;
00296   for (i=fsub.begin(); i!=fsub.end(); i++) delete *i;
00297 }
00298 
00299 int CFuelSystem::Read (SStream *stream, Tag tag)
00300 {
00301   int rc = TAG_IGNORED;
00302 
00303   switch (tag) {
00304   case 'grad':
00305     // Preferred fuel grade
00306     {
00307       char s[64];
00308       ReadString (s, 64, stream);
00309       if (stricmp (s, "AVGAS_80") == 0) {
00310         grad = AIRPORT_FUEL_80;
00311       } else if (stricmp (s, "AVGAS_100") == 0) {
00312         grad = AIRPORT_FUEL_100;
00313       } else if (stricmp (s, "AVGAS_100LL") == 0) {
00314         grad = AIRPORT_FUEL_100LL;
00315       } else if (stricmp (s, "AVGAS_115") == 0) {
00316         grad = AIRPORT_FUEL_115;
00317       } else if (stricmp (s, "JETA") == 0) {
00318         grad = AIRPORT_FUEL_JETA;
00319       } else if (stricmp (s, "JETA1") == 0) {
00320         grad = AIRPORT_FUEL_JETA1;
00321       } else if (stricmp (s, "JETA1PLUS") == 0) {
00322         grad = AIRPORT_FUEL_JETA1PLUS;
00323       } else if (stricmp (s, "JETB") == 0) {
00324         grad = AIRPORT_FUEL_JETB;
00325       } else if (stricmp (s, "AVGAS_JETBPLUS") == 0) {
00326         grad = AIRPORT_FUEL_JETBPLUS;
00327       } else if (stricmp (s, "AUTOMOTIVE") == 0) {
00328         grad = AIRPORT_FUEL_AUTOMOTIVE;
00329       } else {
00330         globals->logWarning->Write ("CFuelSystem::Read : Unknown fuel grade %s", s);
00331       }
00332     }
00333     rc = TAG_READ;
00334     break;
00335 
00336   case 'fsub':
00337     // Fuel subsystem
00338     {
00339       char type_string[64];
00340       ReadString (type_string, 64, stream);
00341       Tag type = StringToTag (type_string);
00342 
00343       CFuelSubsystem *f = NULL;
00344 
00345       switch (type) {
00346       case SUBSYSTEM_FUEL_SUBSYSTEM:
00347         f = new CFuelSubsystem;
00348         break;
00349 
00350       case SUBSYSTEM_FUEL_TAP:
00351         f = new CFuelTap;
00352         break;
00353 
00354       case SUBSYSTEM_FUEL_CELL:
00355         f = new CFuelCell;
00356         break;
00357 
00358       case SUBSYSTEM_FUEL_HEATER:
00359         f = new CFuelHeater;
00360         break;
00361 
00362       case SUBSYSTEM_FUEL_MATH:
00363         f = new CFuelMath;
00364         break;
00365 
00366       case SUBSYSTEM_FUEL_PUMP:
00367         f = new CFuelPump;
00368         break;
00369 
00370       case SUBSYSTEM_FUEL_SOURCE:
00371         f = new CFuelSource;
00372         break;
00373 
00374       case SUBSYSTEM_FUEL_TANK:
00375         f = new CFuelTank;
00376         break;
00377 
00378       case SUBSYSTEM_ENGINE_FUEL_PUMP:
00379         f = new CEngineFuelPump;
00380         break;
00381 
00382       case SUBSYSTEM_FUEL_MANAGEMENT:
00383         f = new CFuelManagement;
00384         break;
00385 
00386       case SUBSYSTEM_APU_FUEL_SOURCE:
00387         f = new CAPUFuelSource;
00388         break;
00389       }
00390 
00391       if (f != NULL) {
00392         // A valid CFuelSubsystem was instantiated, load it
00393         ReadFrom (f, stream);
00394         fsub.push_back (f);
00395         rc = TAG_READ;
00396       } else {
00397         globals->logWarning->Write ("CFuelSystem : Unknown fsub type = %s",
00398           type_string);
00399       }
00400     }
00401     break;
00402   }
00403 
00404   if (rc != TAG_READ) {
00405     // Tag was not processed by this object, it is unrecognized
00406     char s[16];
00407     TagToString (s, tag);
00408     globals->logWarning->Write ("CFuelSystem::Read : Unrecognized tag <%s>", s);
00409   }
00410 
00411   return rc;
00412 }
00413 
00414 void CFuelSystem::ReadFinished (void)
00415 {
00416 }
00417 
00418 void CFuelSystem::Write (SStream *stream)
00419 {
00420 }
00421 
00422 
00423 //
00424 // AerodynamicModel
00425 //
00426 
00427 CAerodynamicModel::CAerodynamicModel (const char* svhFilename)
00428 {
00429   // Initialize
00430   dofa.x = dofa.y = dofa.z = 0.0;
00431   grnd = false;
00432   geff = 0.0f;
00433   gAGL = 0.0f;
00434   cd = 0.0f;
00435 
00436   // Read from stream file
00437   SStream s;
00438   strcpy (s.filename, "World\\");
00439   strcat (s.filename, svhFilename);
00440   strcpy (s.mode, "r");
00441   if (OpenStream (&s)) {
00442     ReadFrom (this, &s);
00443     CloseStream (&s);
00444   }
00445 }
00446 
00447 int CAerodynamicModel::Read (SStream *stream, Tag tag)
00448 {
00449   int rc = TAG_IGNORED;
00450 
00451   switch (tag) {
00452   case 'dofa':
00453     // Vector distance from empty CG to aerodynamic datum (ft)
00454     ReadVector (&dofa, stream);
00455     rc = TAG_READ;
00456     break;
00457   case 'grnd':
00458     // Global ground effect enabled
00459     grnd = true;
00460     rc = TAG_READ;
00461     break;
00462   case 'geff':
00463     // Global ground effect factor
00464     ReadFloat (&geff, stream);
00465     rc = TAG_READ;
00466     break;
00467   case 'gAGL':
00468     // Global ground effect altitude
00469     ReadFloat (&gAGL, stream);
00470     rc = TAG_READ;
00471     break;
00472   case '+cd+':
00473     // Global drag coefficient fudge factor
00474     ReadFloat (&cd, stream);
00475     rc = TAG_READ;
00476     break;
00477   case 'foil':
00478     // Airfoil
00479     SkipObject (stream);
00480     rc = TAG_READ;
00481     break;
00482   case 'wing':
00483     // Wing section
00484     SkipObject (stream);
00485     rc = TAG_READ;
00486     break;
00487   }
00488 
00489   if (rc != TAG_READ) {
00490     // Tag was not processed by this object, it is unrecognized
00491     char s[16];
00492     TagToString (s, tag);
00493     globals->logWarning->Write ("CAerodynamicModel::Read : Unrecognized tag <%s>", s);
00494   }
00495 
00496   return rc;
00497 }
00498 
00499 
00500 //
00501 // CElectricalSystem
00502 //
00503 
00504 CElectricalSystem::CElectricalSystem (const char* ampFilename)
00505 {
00506   // Initialize control subsystem pointers
00507   pAileron = NULL;
00508   pElevator = NULL;
00509   pRudder = NULL;
00510   pAileronTrim = NULL;
00511   pElevatorTrim = NULL;
00512   pRudderTrim = NULL;
00513 
00514   // Read from AMP file stream
00515   SStream s;
00516   strcpy (s.filename, "World\\");
00517   strcat (s.filename, ampFilename);
00518   strcpy (s.mode, "r");
00519   if (OpenStream (&s)) {
00520     ReadFrom (this, &s);
00521     CloseStream (&s);
00522   }
00523 }
00524 
00525 CElectricalSystem::~CElectricalSystem (void)
00526 {
00527   vector<CSubsystem*>::iterator i;
00528   for (i=subs.begin(); i!=subs.end(); i++) {
00529     CSubsystem *s = *i;
00530     delete s;
00531   }
00532 }
00533 
00534 int CElectricalSystem::Read (SStream *stream, Tag tag)
00535 {
00536   int rc = TAG_IGNORED;
00537 
00538   switch (tag) {
00539   case 'subs':
00540     {
00541       char tag_string[64];
00542       ReadString (tag_string, 64, stream);
00543       Tag type = StringToTag (tag_string);
00544 
00545       CSubsystem *s = NULL;
00546 
00547       switch (type) {
00548       case SUBSYSTEM_DEPENDENT:
00549         s = new CDependent;
00550         break;
00551 
00552       case SUBSYSTEM_ANNOUNCEMENT:
00553         s = new CAnnouncement;
00554         break;
00555 
00556       case SUBSYSTEM_GENERIC_MONITOR:
00557         s = new CGenericMonitor;
00558         break;
00559 
00560       case SUBSYSTEM_GENERIC_INDICATOR:
00561         s = new CGenericIndicator;
00562         break;
00563 
00564       case SUBSYSTEM_HISTORY:
00565         s = new CHistory;
00566         break;
00567 
00568       case SUBSYSTEM_PNEUMATIC_PUMP:
00569         s = new CPneumaticPump;
00570         break;
00571 
00572       case SUBSYSTEM_EMERGENCY_LOCATOR:
00573         s = new CEmergencyLocator;
00574         break;
00575 
00576       case SUBSYSTEM_EXTERIOR_LIGHT:
00577         s = new CExteriorLight;
00578         break;
00579 
00580       case SUBSYSTEM_PITOT_HEAT_SWITCH:
00581         s = new CPitotHeatSwitch;
00582         break;
00583 
00584       case SUBSYSTEM_STATIC_SOURCE_SWITCH:
00585         s = new CStaticSourceSwitch;
00586         break;
00587 
00588       case SUBSYSTEM_ANNUNCIATOR_LIGHT:
00589         s = new CAnnunciatorLight;
00590         break;
00591 
00592       case SUBSYSTEM_STALL_WARNING:
00593         s = new CStallWarning;
00594         break;
00595 
00596       case SUBSYSTEM_LIGHT_SETTING_STATE:
00597         s = new CLightSettingState;
00598         break;
00599 
00600       case SUBSYSTEM_SWITCH_SET:
00601         s = new CSwitchSet;
00602         break;
00603 
00604       case SUBSYSTEM_ROTARY_IGNITION_SWITCH:
00605         s = new CRotaryIgnitionSwitch;
00606         break;
00607 
00608       case SUBSYSTEM_BATTERY:
00609         s = new CBattery;
00610         break;
00611 
00612       case SUBSYSTEM_ALTERNATOR:
00613         s = new CAlternator;
00614         break;
00615 
00616       //
00617       // Gauge subsystems
00618       //
00619 
00620       case SUBSYSTEM_ALTIMETER:
00621         s = new CAltimeter;
00622         break;
00623 
00624       case SUBSYSTEM_VERTICAL_SPEED:
00625         {
00626           char *mark1 = new char[32];
00627           strcpy (mark1, "vsi start");
00628         s = new CVerticalSpeedIndicator;
00629           char *mark2 = new char[32];
00630           strcpy (mark2, "vsi end");
00631         }
00632         break;
00633 
00634       case SUBSYSTEM_AIRSPEED:
00635         s = new CAirspeedIndicator;
00636         break;
00637 
00638       case SUBSYSTEM_ATTITUDE:
00639         s = new CAttitudeIndicator;
00640         break;
00641 
00642       case SUBSYSTEM_DIRECTIONAL_GYRO:
00643         s = new CDirectionalGyro;
00644         break;
00645 
00646       case SUBSYSTEM_VACUUM_INDICATOR:
00647         s = new CVacuumIndicator;
00648         break;
00649 
00650       case SUBSYSTEM_TURN_COORDINATOR:
00651         s = new CTurnCoordinator;
00652         break;
00653 
00654       case SUBSYSTEM_MAGNETIC_COMPASS:
00655         s = new CMagneticCompass;
00656         break;
00657 
00658       case SUBSYSTEM_NAVIGATION:
00659         s = new CNavigation;
00660         break;
00661 
00662       case SUBSYSTEM_DIGITAL_CLOCK_OAT:
00663         s = new CDigitalClockOAT;
00664         break;
00665 
00666       case SUBSYSTEM_KAP140_PANEL:
00667         s = new CBKKAP140Panel;
00668         break;
00669 
00670       case SUBSYSTEM_MARKER_PANEL:
00671         s = new CMarkerPanel;
00672         break;
00673 
00674       case SUBSYSTEM_AMMETER:
00675         s = new CAmmeter;
00676         break;
00677 
00678       //
00679       // Engine subsystems
00680       //
00681 
00682       case SUBSYSTEM_TACHOMETER:
00683         s = new CTachometer;
00684         break;
00685 
00686       case SUBSYSTEM_OIL_TEMPERATURE:
00687         s = new COilTemperature;
00688         break;
00689 
00690       case SUBSYSTEM_OIL_PRESSURE:
00691         s = new COilPressure;
00692         break;
00693 
00694       case SUBSYSTEM_EXHAUST_GAS_TEMPERATURE:
00695         s = new CExhaustGasTemperature;
00696         break;
00697 
00698       case SUBSYSTEM_MANIFOLD_PRESSURE:
00699         s = new CManifoldPressure;
00700         break;
00701 
00702       case SUBSYSTEM_HOBBS_METER:
00703         s = new CHobbsMeter;
00704         break;
00705 
00706       case SUBSYSTEM_TACHOMETER_TIMER:
00707         s = new CTachometerTimer;
00708         break;
00709 
00710       //
00711       // Aircraft control subsystems
00712       //
00713 
00714       case SUBSYSTEM_THROTTLE_CONTROL:
00715         s = new CThrottleControl;
00716         break;
00717 
00718       case SUBSYSTEM_MIXTURE_CONTROL:
00719         s = new CMixtureControl;
00720         break;
00721 
00722       case SUBSYSTEM_STEERING_CONTROL:
00723         s = new CSteeringControl;
00724         break;
00725 
00726       case SUBSYSTEM_FLAP_CONTROL:
00727         s = new CFlapControl;
00728         break;
00729 
00730       case SUBSYSTEM_ELEVATOR_CONTROL:
00731         s = new CElevatorControl;
00732         if (pElevator == NULL) {
00733           // Assign to shortcut pointer
00734           pElevator = (CElevatorControl *)s;
00735         } else {
00736           // Multiple control subsystems
00737           globals->logWarning->Write ("Multiple elevator subsystems defined");
00738         }
00739         break;
00740 
00741       case SUBSYSTEM_AILERON_CONTROL:
00742         s = new CAileronControl;
00743         if (pAileron == NULL) {
00744           // Assign to shortcut pointer
00745           pAileron = (CAileronControl *)s;
00746         } else {
00747           // Multiple control subsystems
00748           globals->logWarning->Write ("Multiple aileron subsystems defined");
00749         }
00750         break;
00751 
00752       case SUBSYSTEM_RUDDER_CONTROL:
00753         s = new CRudderControl;
00754         if (pRudder == NULL) {
00755           // Assign to shortcut pointer
00756           pRudder = (CRudderControl *)s;
00757         } else {
00758           // Multiple control subsystems
00759           globals->logWarning->Write ("Multiple rudder subsystems defined");
00760         }
00761         break;
00762 
00763       case SUBSYSTEM_ELEVATOR_TRIM_CONTROL:
00764         s = new CElevatorTrimControl;
00765         if (pElevatorTrim == NULL) {
00766           // Assign to shortcut pointer
00767           pElevatorTrim = (CElevatorTrimControl *) s;
00768         } else {
00769           // Multiple control subsystems
00770           globals->logWarning->Write ("Multiple elevator trim subsystems defined");
00771         }
00772         break;
00773 
00774       case SUBSYSTEM_AILERON_TRIM_CONTROL:
00775         s = new CAileronTrimControl;
00776         if (pAileronTrim == NULL) {
00777           // Assign to shortcut pointer
00778           pAileronTrim = (CAileronTrimControl *) s;
00779         } else {
00780           // Multiple control subsystems
00781           globals->logWarning->Write ("Multiple aileron trim subsystems defined");
00782         }
00783         break;
00784 
00785       case SUBSYSTEM_RUDDER_TRIM_CONTROL:
00786         s = new CRudderTrimControl;
00787         if (pRudderTrim == NULL) {
00788           // Assign to shortcut pointer
00789           pRudderTrim = (CRudderTrimControl *) s;
00790         } else {
00791           // Multiple control subsystems
00792           globals->logWarning->Write ("Multiple rudder trim subsystems defined");
00793         }
00794         break;
00795 
00796       case SUBSYSTEM_BRAKE_CONTROL:
00797         s = new CBrakeControl;
00798         break;
00799 
00800       //
00801       // Radio subsystems
00802       //
00803 
00804       case SUBSYSTEM_NAV_RADIO:
00805         s = new CNavRadio;
00806         break;
00807 
00808       case SUBSYSTEM_RNAV_RADIO:
00809         s = new CRnavRadio;
00810         break;
00811 
00812       case SUBSYSTEM_COMM_RADIO:
00813         s = new CCommRadio;
00814         break;
00815 
00816       case SUBSYSTEM_TRANSPONDER_RADIO:
00817         s = new CTransponderRadio;
00818         break;
00819 
00820       case SUBSYSTEM_ADF_RADIO:
00821         s = new CADFRadio;
00822         break;
00823 
00824       case SUBSYSTEM_KLN89_GPS_RADIO:
00825         s = new CBKKLN89GPSRadio;
00826         break;
00827 
00828       case SUBSYSTEM_KX155_RADIO:
00829         s = new CBKKX155Radio;
00830         break;
00831 
00832       case SUBSYSTEM_KT76_RADIO:
00833         s = new CBKKT76Radio;
00834         break;
00835 
00836       case SUBSYSTEM_KAP140_RADIO:
00837         s = new CBKKAP140Radio;
00838         break;
00839 
00840       case SUBSYSTEM_AUDIO_PANEL_RADIO:
00841         s = new CAudioPanelRadio;
00842         break;
00843 
00844       //
00845       // Fuel subsystems
00846       //
00847 
00848       case SUBSYSTEM_FUEL_MATH:
00849         // Skip 'fMat' subsystem, this has been made obsolete by
00850         //   fuel subsystem objects in the CFuelManager class but
00851         //   older aircraft AMP files may still have a subystem defined
00852         SkipObject (stream);
00853         rc = TAG_READ;
00854         break;
00855 
00856         // *
00857         // * End of actively implemented subsystems
00858         // *
00859 
00860 /*
00861         case SUBSYSTEM_ON_GROUND_MONITOR:
00862         {
00863           // COnGroundMonitor
00864           SkipObject (stream);
00865           rc = TAG_READ;
00866         }
00867         break;
00868 
00869         case SUBSYSTEM_ALTITUDE_MONITOR:
00870         {
00871           // CAltitudeMonitor
00872           SkipObject (stream);
00873           rc = TAG_READ;
00874         }
00875         break;
00876 
00877         case SUBSYSTEM_SPEED_MONITOR:
00878         {
00879           // CSpeedMonitor
00880           SkipObject (stream);
00881           rc = TAG_READ;
00882         }
00883         break;
00884 
00885         case SUBSYSTEM_ENGINE_STATUS:
00886         {
00887           // CEngineStatus
00888           SkipObject (stream);
00889           rc = TAG_READ;
00890         }
00891         break;
00892 
00893         case SUBSYSTEM_TIME_DELAY:
00894         {
00895           // CTimeDelay
00896           SkipObject (stream);
00897           rc = TAG_READ;
00898         }
00899         break;
00900 
00901         case SUBSYSTEM_KEYED_SYSTEM:
00902         {
00903           // CKeyedSystem
00904           SkipObject (stream);
00905           rc = TAG_READ;
00906         }
00907         break;
00908 
00909         case SUBSYSTEM_TACHOMETER_V1:
00910         {
00911           // CTachometerV1
00912           SkipObject (stream);
00913           rc = TAG_READ;
00914         }
00915         break;
00916 
00917         case SUBSYSTEM_THROTTLE_CONTROL_V1:
00918         {
00919           // CThrottleV1
00920           SkipObject (stream);
00921           rc = TAG_READ;
00922         }
00923         break;
00924 
00925         case SUBSYSTEM_MIXTURE_CONTROL_V1:
00926         {
00927           // CMixtureControlV1
00928           SkipObject (stream);
00929           rc = TAG_READ;
00930         }
00931         break;
00932 
00933         case SUBSYSTEM_PROPELLER_CONTROL_V1:
00934         {
00935           // CPropellerControlV1
00936           SkipObject (stream);
00937           rc = TAG_READ;
00938         }
00939         break;
00940 
00941         case SUBSYSTEM_PRIME_CONTROL_V1:
00942         {
00943           // CPrimeControlV1
00944           SkipObject (stream);
00945           rc = TAG_READ;
00946         }
00947         break;
00948 
00949         case SUBSYSTEM_ENGINE_ANTI_ICE_V1:
00950         {
00951           // CEngineAntiIceV1
00952           SkipObject (stream);
00953           rc = TAG_READ;
00954         }
00955         break;
00956 
00957         case SUBSYSTEM_IDLE_CONTROL_V1:
00958         {
00959           // CIdleControlV1
00960           SkipObject (stream);
00961           rc = TAG_READ;
00962         }
00963         break;
00964 
00965         case SUBSYSTEM_ALTIMETER_V1:
00966         {
00967           // CAltimeterV1
00968           SkipObject (stream);
00969           rc = TAG_READ;
00970         }
00971         break;
00972 
00973         case SUBSYSTEM_VERTICAL_SPEED_V1:
00974         {
00975           // CVerticalSpeedV1
00976           SkipObject (stream);
00977           rc = TAG_READ;
00978         }
00979         break;
00980 
00981         case SUBSYSTEM_AIRSPEED_V1:
00982         {
00983           // CAirspeedV1
00984           SkipObject (stream);
00985           rc = TAG_READ;
00986         }
00987         break;
00988 
00989         case SUBSYSTEM_ATTITUDE_V1:
00990         {
00991           // CAttitudeV1
00992           SkipObject (stream);
00993           rc = TAG_READ;
00994         }
00995         break;
00996 
00997         case SUBSYSTEM_DIRECTIONAL_GYRO_V1:
00998         {
00999           // CDirectionalGyroV1
01000           SkipObject (stream);
01001           rc = TAG_READ;
01002         }
01003         break;
01004 
01005         case SUBSYSTEM_TURN_COORDINATOR_V1:
01006         {
01007           // CTurnCoordinatorV1
01008           SkipObject (stream);
01009           rc = TAG_READ;
01010         }
01011         break;
01012 
01013         case SUBSYSTEM_AUDIO_PANEL_V1:
01014         {
01015           // CAudioPanelV1
01016           SkipObject (stream);
01017           rc = TAG_READ;
01018         }
01019         break;
01020 
01021         case SUBSYSTEM_BATTERY:
01022         {
01023           // CBattery
01024           SkipObject (stream);
01025           rc = TAG_READ;
01026         }
01027         break;
01028 
01029         case SUBSYSTEM_ALTERNATOR:
01030         {
01031           // CAlternator
01032           SkipObject (stream);
01033           rc = TAG_READ;
01034         }
01035         break;
01036 
01037         case SUBSYSTEM_AMMETER:
01038         {
01039           // CAmmeter
01040           SkipObject (stream);
01041           rc = TAG_READ;
01042         }
01043         break;
01044 
01045         case SUBSYSTEM_STARTER_CONTROL:
01046         {
01047           // CStarterControl
01048           SkipObject (stream);
01049           rc = TAG_READ;
01050         }
01051         break;
01052 
01053         case SUBSYSTEM_MAGNETO_CONTROL:
01054         {
01055           // CMagnetoControl
01056           SkipObject (stream);
01057           rc = TAG_READ;
01058         }
01059         break;
01060 
01061         case SUBSYSTEM_VOLTMETER:
01062         {
01063           // CVoltmeter
01064           SkipObject (stream);
01065           rc = TAG_READ;
01066         }
01067         break;
01068 
01069         case SUBSYSTEM_GENERATOR:
01070         {
01071           // CGenerator
01072           SkipObject (stream);
01073           rc = TAG_READ;
01074         }
01075         break;
01076 
01077         case SUBSYSTEM_FREQUENCY_METER:
01078         {
01079           // CFrequencyMeter
01080           SkipObject (stream);
01081           rc = TAG_READ;
01082         }
01083         break;
01084 
01085         case SUBSYSTEM_INVERTER:
01086         {
01087           // CInverter
01088           SkipObject (stream);
01089           rc = TAG_READ;
01090         }
01091         break;
01092 
01093         case SUBSYSTEM_ENGINE_GAUGE:
01094         {
01095           // CEngineGauge
01096           SkipObject (stream);
01097           rc = TAG_READ;
01098         }
01099         break;
01100 
01101         case SUBSYSTEM_FUEL_GAUGE:
01102         {
01103           // CFuelGauge
01104           SkipObject (stream);
01105           rc = TAG_READ;
01106         }
01107         break;
01108 
01109         case SUBSYSTEM_FLAP_CONTROL:
01110         {
01111           // CFlapControl
01112           SkipObject (stream);
01113           rc = TAG_READ;
01114         }
01115         break;
01116 
01117         case SUBSYSTEM_GEAR_CONTROL:
01118         {
01119           // CGearControl
01120           SkipObject (stream);
01121           rc = TAG_READ;
01122         }
01123         break;
01124 
01125         case SUBSYSTEM_NAVIGATION_GAUGE:
01126         {
01127           // CNavigationGauge
01128           SkipObject (stream);
01129           rc = TAG_READ;
01130         }
01131         break;
01132 
01133         case SUBSYSTEM_AUDIO_PANEL:
01134         {
01135           // CAudioPanel
01136           SkipObject (stream);
01137           rc = TAG_READ;
01138         }
01139         break;
01140 
01141         case SUBSYSTEM_PROPELLER_CONTROL:
01142         {
01143           // CPropellerControl
01144           SkipObject (stream);
01145           rc = TAG_READ;
01146         }
01147         break;
01148 
01149         case SUBSYSTEM_PRIME_CONTROL:
01150         {
01151           // CPrimeControl
01152           SkipObject (stream);
01153           rc = TAG_READ;
01154         }
01155         break;
01156 
01157         case SUBSYSTEM_EXTERIOR_LIGHT:
01158         {
01159           // CExteriorLight
01160           SkipObject (stream);
01161           rc = TAG_READ;
01162         }
01163         break;
01164 
01165         case SUBSYSTEM_HIGH_LIFT_CONTROL:
01166         {
01167           // CHighLiftControl
01168           SkipObject (stream);
01169           rc = TAG_READ;
01170         }
01171         break;
01172 
01173         case SUBSYSTEM_FUEL_FLOW_GAUGE:
01174         {
01175           // CFuelFlowGauge
01176           SkipObject (stream);
01177           rc = TAG_READ;
01178         }
01179         break;
01180 
01181         case SUBSYSTEM_FUEL_PRESSURE_GAUGE:
01182         {
01183           // CFuelPressureGauge
01184           SkipObject (stream);
01185           rc = TAG_READ;
01186         }
01187         break;
01188 
01189         case SUBSYSTEM_ANNUNCIATOR_LIGHT:
01190         {
01191           // CAnnunciatorLight
01192           SkipObject (stream);
01193           rc = TAG_READ;
01194         }
01195         break;
01196 
01197         case SUBSYSTEM_SUCTION_GAUGE:
01198         {
01199           // CSuctionGauge
01200           SkipObject (stream);
01201           rc = TAG_READ;
01202         }
01203         break;
01204 
01205         case SUBSYSTEM_FLAP_GAUGE:
01206         {
01207           // CFlapGauge
01208           SkipObject (stream);
01209           rc = TAG_READ;
01210         }
01211         break;
01212 
01213         case SUBSYSTEM_HOBBS_METER:
01214         {
01215           // CTachTimer
01216           SkipObject (stream);
01217           rc = TAG_READ;
01218         }
01219         break;
01220 
01221         case SUBSYSTEM_TACH_TIMER:
01222         {
01223           // CTachTimer
01224           SkipObject (stream);
01225           rc = TAG_READ;
01226         }
01227         break;
01228 
01229         case SUBSYSTEM_ANNUNCIATOR:
01230         {
01231           // CAnnunciator
01232           SkipObject (stream);
01233           rc = TAG_READ;
01234         }
01235         break;
01236 
01237         case SUBSYSTEM_EMERGENCY_LOCATOR:
01238         {
01239           // CEmergencyLocator
01240           SkipObject (stream);
01241           rc = TAG_READ;
01242         }
01243         break;
01244 
01245         case SUBSYSTEM_PRESSURIZATION:
01246         {
01247           // CPressurization
01248           SkipObject (stream);
01249           rc = TAG_READ;
01250         }
01251         break;
01252 
01253         case SUBSYSTEM_N1_TACHOMETER:
01254         {
01255           // CN1Tachometer
01256           SkipObject (stream);
01257           rc = TAG_READ;
01258         }
01259         break;
01260 
01261         case SUBSYSTEM_N2_TACHOMETER:
01262         {
01263           // CN2Tachometer
01264           SkipObject (stream);
01265           rc = TAG_READ;
01266         }
01267         break;
01268 
01269         case SUBSYSTEM_TORQUE_METER:
01270         {
01271           // CTorqueMeter
01272           SkipObject (stream);
01273           rc = TAG_READ;
01274         }
01275         break;
01276 
01277         case SUBSYSTEM_MARKER_PANEL:
01278         {
01279           // CMarkerPanel
01280           SkipObject (stream);
01281           rc = TAG_READ;
01282         }
01283         break;
01284 
01285         case SUBSYSTEM_DME_PANEL:
01286         {
01287           // CDmePanel
01288           SkipObject (stream);
01289           rc = TAG_READ;
01290         }
01291         break;
01292 
01293         case SUBSYSTEM_DME_PANEL_1:
01294         {
01295           // CDmePanel1
01296           SkipObject (stream);
01297           rc = TAG_READ;
01298         }
01299         break;
01300 
01301         case SUBSYSTEM_WEATHER_RADAR:
01302         {
01303           // CWeatherRadar
01304           SkipObject (stream);
01305           rc = TAG_READ;
01306         }
01307         break;
01308 
01309         case SUBSYSTEM_SWITCH_SET:
01310         {
01311           // CSwitchSet
01312           SkipObject (stream);
01313           rc = TAG_READ;
01314         }
01315         break;
01316 
01317         case SUBSYSTEM_INDICATOR_SET:
01318         {
01319           // CIndicatorSet
01320           SkipObject (stream);
01321           rc = TAG_READ;
01322         }
01323         break;
01324 
01325         case SUBSYSTEM_CONTACTOR:
01326         {
01327           // CContactor
01328           SkipObject (stream);
01329           rc = TAG_READ;
01330         }
01331         break;
01332 
01333         case SUBSYSTEM_FLASHER:
01334         {
01335           // CFlasher
01336           SkipObject (stream);
01337           rc = TAG_READ;
01338         }
01339         break;
01340 
01341         case SUBSYSTEM_FAST_SLOW_METER:
01342         {
01343           // CFastSlowMeter
01344           SkipObject (stream);
01345           rc = TAG_READ;
01346         }
01347         break;
01348 
01349         case SUBSYSTEM_CYLINDER_HEAD_TEMP_GAUGE:
01350         {
01351           // CCHTGauge
01352           SkipObject (stream);
01353           rc = TAG_READ;
01354         }
01355         break;
01356 
01357         case SUBSYSTEM_ITT_GAUGE:
01358         {
01359           // CITTGauge
01360           SkipObject (stream);
01361           rc = TAG_READ;
01362         }
01363         break;
01364 
01365         case SUBSYSTEM_MANIFOLD_PRESSURE_GAUGE:
01366         {
01367           // CManifoldPressureGauge
01368           SkipObject (stream);
01369           rc = TAG_READ;
01370         }
01371         break;
01372 
01373         case SUBSYSTEM_ACCELEROMETER:
01374         {
01375           // CAccelerometer
01376           SkipObject (stream);
01377           rc = TAG_READ;
01378         }
01379         break;
01380 
01381         case SUBSYSTEM_TCAS_PANEL:
01382         {
01383           // CTCASPanel
01384           SkipObject (stream);
01385           rc = TAG_READ;
01386         }
01387         break;
01388 
01389         case SUBSYSTEM_GEAR_LIGHT:
01390         {
01391           // CGearLignt
01392           SkipObject (stream);
01393           rc = TAG_READ;
01394         }
01395         break;
01396 
01397         case SUBSYSTEM_ENGINE_ANTI_ICE:
01398         {
01399           // CEngineAntiIce
01400           SkipObject (stream);
01401           rc = TAG_READ;
01402         }
01403         break;
01404 
01405         case SUBSYSTEM_ROTARY_IGNITION_SWITCH:
01406         {
01407           // CRotaryIgnitionSwitch
01408           SkipObject (stream);
01409           rc = TAG_READ;
01410         }
01411         break;
01412 
01413         case SUBSYSTEM_FUEL_PUMP_CONTROL:
01414         {
01415           // CFuelPumpControl
01416           SkipObject (stream);
01417           rc = TAG_READ;
01418         }
01419         break;
01420 
01421         case SUBSYSTEM_PITOT_HEAT_SOURCE_CONTROL:
01422         {
01423           // CPitotHeatSourceControl
01424           SkipObject (stream);
01425           rc = TAG_READ;
01426         }
01427         break;
01428 
01429         case SUBSYSTEM_STATIC_SOURCE_CONTROL:
01430         {
01431           // CStaticSourceControl
01432           SkipObject (stream);
01433           rc = TAG_READ;
01434         }
01435         break;
01436 
01437         case SUBSYSTEM_STALL_WARNING:
01438         {
01439           // CStallWarning
01440           SkipObject (stream);
01441           rc = TAG_READ;
01442         }
01443         break;
01444 
01445         case SUBSYSTEM_BRAKE_CONTROL:
01446         {
01447           // CBrakeControl
01448           SkipObject (stream);
01449           rc = TAG_READ;
01450         }
01451         break;
01452 
01453         case SUBSYSTEM_GEAR_WARNING:
01454         {
01455           // CGearWarning
01456           SkipObject (stream);
01457           rc = TAG_READ;
01458         }
01459         break;
01460 
01461         case SUBSYSTEM_SYNCHROPHASER:
01462         {
01463           // CSynchrophaser
01464           SkipObject (stream);
01465           rc = TAG_READ;
01466         }
01467         break;
01468 
01469         case SUBSYSTEM_SURFACE_DEICE:
01470         {
01471           // CSurfaceDeice
01472           SkipObject (stream);
01473           rc = TAG_READ;
01474         }
01475         break;
01476 
01477         case SUBSYSTEM_PROPELLER_DEICE:
01478         {
01479           // CPropellerDeice
01480           SkipObject (stream);
01481           rc = TAG_READ;
01482         }
01483         break;
01484 
01485         case SUBSYSTEM_CROSSFEED_CONTROL:
01486         {
01487           // CCrossfeedControl
01488           SkipObject (stream);
01489           rc = TAG_READ;
01490         }
01491         break;
01492 
01493         case SUBSYSTEM_OXYGEN:
01494         {
01495           // COxygen
01496           SkipObject (stream);
01497           rc = TAG_READ;
01498         }
01499         break;
01500 
01501         case SUBSYSTEM_STARTER_IGNITER:
01502         {
01503           // CStarterIgniter
01504           SkipObject (stream);
01505           rc = TAG_READ;
01506         }
01507         break;
01508 
01509         case SUBSYSTEM_IDLE_CONTROL:
01510         {
01511           // CIdleControl
01512           SkipObject (stream);
01513           rc = TAG_READ;
01514         }
01515         break;
01516 
01517         case SUBSYSTEM_ENGINE_MONITOR:
01518         {
01519           // CEngineMonitor
01520           SkipObject (stream);
01521           rc = TAG_READ;
01522         }
01523         break;
01524 
01525         case SUBSYSTEM_FIRE_SYSTEM:
01526         {
01527           // CFireSystem
01528           SkipObject (stream);
01529           rc = TAG_READ;
01530         }
01531         break;
01532 
01533         case SUBSYSTEM_FUEL_IMBALANCE:
01534         {
01535           // CFuelImbalance
01536           SkipObject (stream);
01537           rc = TAG_READ;
01538         }
01539         break;
01540 
01541         case SUBSYSTEM_COWL_FLAP:
01542         {
01543           // CCowlFlap
01544           SkipObject (stream);
01545           rc = TAG_READ;
01546         }
01547         break;
01548 
01549         case SUBSYSTEM_WIPER_CONTROL:
01550         {
01551           // CWiperControl
01552           SkipObject (stream);
01553           rc = TAG_READ;
01554         }
01555         break;
01556 
01557         case SUBSYSTEM_ELEVATOR_CONTROL:
01558         {
01559           // CElevatorControl
01560           SkipObject (stream);
01561           rc = TAG_READ;
01562         }
01563         break;
01564 
01565         case SUBSYSTEM_AILERON_CONTROL:
01566         {
01567           // CAileronControl
01568           SkipObject (stream);
01569           rc = TAG_READ;
01570         }
01571         break;
01572 
01573         case SUBSYSTEM_RUDDER_CONTROL:
01574         {
01575           // CRudderControl
01576           SkipObject (stream);
01577           rc = TAG_READ;
01578         }
01579         break;
01580 
01581         case SUBSYSTEM_ELEVATOR_TRIM_CONTROL:
01582         {
01583           // CElevatorTrimControl
01584           SkipObject (stream);
01585           rc = TAG_READ;
01586         }
01587         break;
01588 
01589         case SUBSYSTEM_AILERON_TRIM_CONTROL:
01590         {
01591           // CAileronTrimControl
01592           SkipObject (stream);
01593           rc = TAG_READ;
01594         }
01595         break;
01596 
01597         case SUBSYSTEM_RUDDER_TRIM_CONTROL:
01598         {
01599           // CRudderTrimControl
01600           SkipObject (stream);
01601           rc = TAG_READ;
01602         }
01603         break;
01604 
01605         case SUBSYSTEM_AIR_BRAKE_CONTROL:
01606         {
01607           // CAirBrakeControl
01608           SkipObject (stream);
01609           rc = TAG_READ;
01610         }
01611         break;
01612 
01613         case SUBSYSTEM_THRUST_REVERSE_CONTROL:
01614         {
01615           // CThrustReverseControl
01616           SkipObject (stream);
01617           rc = TAG_READ;
01618         }
01619         break;
01620 
01621         case SUBSYSTEM_PERFORMANCE_RESERVE:
01622         {
01623           // CPerformanceReserve
01624           SkipObject (stream);
01625           rc = TAG_READ;
01626         }
01627         break;
01628 
01629         case SUBSYSTEM_RUDDER_BIAS:
01630         {
01631           // CRudderBias
01632           SkipObject (stream);
01633           rc = TAG_READ;
01634         }
01635         break;
01636 
01637         case SUBSYSTEM_STALL_IDENT:
01638         {
01639           // CStallIdent
01640           SkipObject (stream);
01641           rc = TAG_READ;
01642         }
01643         break;
01644 
01645         case SUBSYSTEM_IGNITER_CONTROL:
01646         {
01647           // CIgniterControl
01648           SkipObject (stream);
01649           rc = TAG_READ;
01650         }
01651         break;
01652 
01653         case SUBSYSTEM_WING_DEICE:
01654         {
01655           // CWingDeice
01656           SkipObject (stream);
01657           rc = TAG_READ;
01658         }
01659         break;
01660 
01661         case SUBSYSTEM_PNEUMATIC_PUMP:
01662         {
01663           // CPneumaticPump
01664           SkipObject (stream);
01665           rc = TAG_READ;
01666         }
01667         break;
01668 */
01669         default:
01670           // Skip over unimplemented <subs> types
01671           SkipObject (stream);
01672           globals->logWarning->Write ("CElectricalSystem::Read : Skipping object %s",
01673                 tag_string);
01674           rc = TAG_READ;
01675 
01676       } // switch(type)
01677 
01678       // If a subsystem was instantiated, then load it and add it to the list
01679       if (s != NULL) {
01680         ReadFrom (s, stream);
01681         subs.push_back (s);
01682 //        subs.addEntity (s);
01683         rc = TAG_READ;
01684       }
01685 
01686       break;
01687 
01688     } // case 'subs'
01689   } // switch(tag)
01690 
01691   if (rc != TAG_READ) {
01692     // Tag was not processed by this object, it is unrecognized
01693     char s[16];
01694     TagToString (s, tag);
01695     globals->logWarning->Write ("CElectricalSystem::Read : Unrecognized tag <%s>", s);
01696   }
01697 
01698   return rc;
01699 }
01700 
01701 
01702 void CElectricalSystem::ReadFinished (void)
01703 {
01704   // Check for missing dependents
01705 }
01706 
01707 void CElectricalSystem::Write (SStream *stream)
01708 {
01709 }
01710 
01711 /*
01712 
01713   Dependent priority graph
01714 
01715   All valid subsystems are of class CDependent or some derivative, so all
01716   subsystems can be ordered into a directed graph of dependencies.  When
01717   a subsystem is timesliced, all of its dependencies must already have been
01718   timesliced.  This is accomplished efficiently by creating an ordered
01719   graph and ensuring that all dependencies are timesliced first.
01720 
01721   This can also be implemented in the Timeslice methods of the dependencies
01722   by calling each dependency's Timeslice method before evaluating them.
01723   State in the dependent subsystem determine whether it has already been
01724   evaluated on this cycle, or is in the process of being evaluated.
01725 
01726   In the default Flyhawk, there are 130 subsystems and 109 dependencies.
01727   This suggests that a list of directed edges would be more storage-efficient
01728   than an adjacency matrix.
01729 
01730 */
01731 
01732 /*
01733 void CElectricalSystem::Prepare (void)
01734 {
01735   int i;
01736 
01737   // TEMP : Determine number of subsystems and number of dependencies
01738   int nSubs = subs.getNumEntities ();
01739   int dependencies = 0;
01740   for (i=0; i < nSubs; i++) {
01741     CSubsystem *s = (CSubsystem *)subs.getEntity (i);
01742     if (!s->IsType (SUBSYSTEM_BASE)) {
01743       CDependent *d = (CDependent *)s;
01744       dependencies += d->NumDependencies ();
01745     }
01746   }
01747 
01748   // Sort subsystems in priority order for timeslicing
01749   for (i=0; i < subs.getNumEntities(); i++) {
01750     CSubsystem *s = (CSubsystem *)subs.getEntity (i);
01751 
01752     //
01753   }
01754 }
01755 */
01756 
01757 void CElectricalSystem::Timeslice (float dT)
01758 {
01759   // Intialize evaluation state for all dependents
01760   vector<CSubsystem*>::iterator i;
01761   for (i=subs.begin(); i!=subs.end(); i++) {
01762     CSubsystem *s = *i;
01763     if (!s->IsType (SUBSYSTEM_BASE)) {
01764       CDependent *d = (CDependent *)s;
01765       d->SetEvaluated (EVAL_UNKNOWN);
01766     }
01767   }
01768 
01769   // Timeslice each electrical subsystem
01770   for (i=subs.begin(); i!=subs.end(); i++) {
01771     CSubsystem *s = *i;
01772     s->TimeSlice (dT);
01773   }
01774 }
01775 
01776 
01777 void CElectricalSystem::Print (FILE *f)
01778 {
01779   fprintf (f, "Electrical System:\n\n");
01780 
01781   // Print each electrical subsystem
01782   vector<CSubsystem*>::iterator i;
01783   for (i=subs.begin(); i!=subs.end(); i++) {
01784     CSubsystem *s = *i;
01785     fprintf (f, "---------------------------------------------------------------------\n");
01786     s->Print (f);
01787     fprintf (f, "\n");
01788   }
01789 }
01790 
01791 
01792 /*
01793  * CPitotStaticSystem
01794  */
01795 
01796 CPitotStaticSystem::CPitotStaticSystem (const char* pssFilename)
01797 {
01798   SStream s;
01799   strcpy (s.filename, "World\\");
01800   strcat (s.filename, pssFilename);
01801   strcpy (s.mode, "r");
01802   if (OpenStream (&s)) {
01803     ReadFrom (this, &s);
01804     CloseStream (&s);
01805   }
01806 }
01807 
01808 CPitotStaticSystem::~CPitotStaticSystem (void)
01809 {
01810   vector<CPitotStaticPort*>::iterator i;
01811   for (i=ports.begin(); i!=ports.end(); i++) delete *i;
01812 }
01813 
01814 int CPitotStaticSystem::Read (SStream *stream, Tag tag)
01815 {
01816   int rc = TAG_IGNORED;
01817 
01818   switch (tag) {
01819   case 'iceT':
01820     // Ice condition duration
01821     ReadFloat (&iceT, stream);
01822     rc = TAG_READ;
01823     break;
01824 
01825   case 'port':
01826     // Port sub-object instance
01827     {
01828       CPitotStaticPort *port = new CPitotStaticPort;
01829       ReadFrom (port, stream);
01830       ports.push_back (port);
01831 //      ports.addEntity (port);
01832       rc = TAG_READ;
01833     }
01834     break;
01835   }
01836 
01837   if (rc != TAG_READ) {
01838     // Tag was not processed by this object, it is unrecognized
01839     char s[16];
01840     TagToString (s, tag);
01841     globals->logWarning->Write ("CPitotStaticSystem::Read : Unrecognized tag <%s>", s);
01842   }
01843 
01844   return rc;
01845 }
01846 
01847 
01848 void CPitotStaticSystem::ReadFinished (void)
01849 {
01850 
01851 }
01852 
01853 
01854 void CPitotStaticSystem::Write (SStream *stream)
01855 {
01856 
01857 }
01858 
01859 /*
01860  * CGroundSuspension
01861  */
01862 
01863 CGroundSuspension::CGroundSuspension (const char* whlFilename)
01864 {
01865   SStream s;
01866   strcpy (s.filename, "World\\");
01867   strcat (s.filename, whlFilename);
01868   strcpy (s.mode, "r");
01869   if (OpenStream (&s)) {
01870     ReadFrom (this, &s);
01871     CloseStream (&s);
01872   }
01873 }
01874 
01875 
01876 int CGroundSuspension::Read (SStream *stream, Tag tag)
01877 {
01878   int rc = TAG_IGNORED;
01879 
01880   if (rc != TAG_READ) {
01881     // Tag was not processed by this object, it is unrecognized
01882     char s[16];
01883     TagToString (s, tag);
01884     globals->logWarning->Write ("CGroundSuspension::Read : Unrecognized tag <%s>", s);
01885   }
01886 
01887   return rc;
01888 }
01889 
01890 
01891 void CGroundSuspension::ReadFinished (void)
01892 {
01893 
01894 }
01895 
01896 
01897 void CGroundSuspension::Write (SStream *stream)
01898 {
01899 
01900 }
01901 
01902 
01903 //
01904 // Loadout Unit
01905 //
01906 CLoadoutUnit::CLoadoutUnit (void)
01907 {
01908   strcpy (name, "");
01909   bPos.x = 0;   bPos.y = 0;   bPos.z = 0;
01910   load = 0;
01911   hiLm = 0;
01912   strcpy (utyp, "");
01913 }
01914 
01915 int CLoadoutUnit::Read (SStream *stream, Tag tag)
01916 {
01917   int rc = TAG_IGNORED;
01918 
01919   switch (tag) {
01920   case 'name':
01921     // Name of loadout position
01922     ReadString (name, 64, stream);
01923     rc = TAG_READ;
01924     break;
01925 
01926   case 'bPos':
01927     // Offset from default center of gravity
01928     ReadVector (&bPos, stream);
01929     rc = TAG_READ;
01930     break;
01931 
01932   case 'load':
01933     // Default load value in pounds
01934     ReadFloat (&load, stream);
01935     rc = TAG_READ;
01936     break;
01937 
01938   case 'hiLm':
01939     // Maximum load value in pounds
01940     ReadFloat (&hiLm, stream);
01941     rc = TAG_READ;
01942     break;
01943 
01944   case 'utyp':
01945     // UI type
01946     ReadString (utyp, 64, stream);
01947     rc = TAG_READ;
01948     break;
01949   }
01950 
01951   if (rc != TAG_READ) {
01952     // Tag was not processed by this object, it is unrecognized
01953     char s[16];
01954     TagToString (s, tag);
01955     globals->logWarning->Write ("CLoadoutUnit::Read : Unrecognized tag <%s>", s);
01956   }
01957 
01958   return rc;
01959 }
01960 
01961 void CLoadoutUnit::ReadFinished (void)
01962 {
01963 
01964 }
01965 
01966 
01967 void CLoadoutUnit::Write (SStream *stream)
01968 {
01969 
01970 }
01971 
01972 
01973 //
01974 // Variable Loadouts
01975 //
01976 CVariableLoadouts::CVariableLoadouts (const char* vldFilename)
01977 {
01978   SStream s;
01979   strcpy (s.filename, "World\\");
01980   strcat (s.filename, vldFilename);
01981   strcpy (s.mode, "r");
01982   if (OpenStream (&s)) {
01983     ReadFrom (this, &s);
01984     CloseStream (&s);
01985   }
01986 }
01987 
01988 CVariableLoadouts::~CVariableLoadouts(void)
01989 {
01990   vector<CLoadoutUnit*>::iterator i;
01991   for (i=unit.begin(); i!=unit.end(); i++) delete *i;
01992 }
01993 
01994 int CVariableLoadouts::Read (SStream *stream, Tag tag)
01995 {
01996   int rc = TAG_IGNORED;
01997 
01998   switch (tag) {
01999   case 'unit':
02000     {
02001       // Loadout instance
02002       CLoadoutUnit *newUnit = new CLoadoutUnit;
02003       ReadFrom (newUnit, stream);
02004       unit.push_back (newUnit);
02005 //      unit.addEntity (newUnit);
02006     }
02007     rc = TAG_READ;
02008     break;
02009   }
02010 
02011   if (rc != TAG_READ) {
02012     // Tag was not processed by this object, it is unrecognized
02013     char s[16];
02014     TagToString (s, tag);
02015     globals->logWarning->Write ("CVariableLoadouts::Read : Unrecognized tag <%s>", s);
02016   }
02017 
02018   return rc;
02019 }
02020 
02021 void CVariableLoadouts::ReadFinished (void)
02022 {
02023 
02024 }
02025 
02026 
02027 void CVariableLoadouts::Write (SStream *stream)
02028 {
02029 
02030 }
02031 
02032 
02033 //
02034 // Cockpit Manager
02035 //
02036 CCockpitManager::CCockpitManager (const char* pitFilename)
02037 {
02038   // Initialize data members
02039   pPanel = NULL;
02040 
02041   // Read cockpit manager stream
02042   SStream s;
02043   strcpy (s.filename, "World\\");
02044   strcat (s.filename, pitFilename);
02045   strcpy (s.mode, "r");
02046   if (OpenStream (&s)) {
02047     ReadFrom (this, &s);
02048     CloseStream (&s);
02049   }
02050 }
02051 
02052 CCockpitManager::~CCockpitManager (void)
02053 {
02054   map<Tag,CPanel*>::iterator i;
02055   for (i=ckpt.begin(); i!=ckpt.end(); i++) {
02056     delete i->second;
02057   }
02058 }
02059 
02060 int CCockpitManager::Read (SStream *stream, Tag tag)
02061 {
02062   int rc = TAG_IGNORED;
02063 
02064   switch (tag) {
02065   case 'ckmg':
02066     // Cockpit manager sub-object
02067     rc = TAG_READ;
02068     break;
02069 
02070   case 'bgno':
02071   case 'endo':
02072     // Ignore open and close of cockpit manager sub-object
02073     rc = TAG_READ;
02074     break;
02075 
02076   case 'ckpt':
02077     {
02078       // Another panel instance
02079       Tag panelId;
02080       ReadTag (&panelId, stream);
02081       char filename[64];
02082       ReadString (filename, 64, stream);
02083 
02084       // Check for duplicate panel tags
02085       map<Tag,CPanel*>::iterator i = ckpt.find(panelId);
02086       if (i==ckpt.end()) {
02087         // This is a unique panel tag, load it and add to the cockpit panel map
02088         char *mark3 = new char[32];
02089         strcpy (mark3, "panel start");
02090         CPanel* panel = new CPanel (panelId, filename);
02091         char *mark4 = new char[32];
02092         strcpy (mark4, "panel end");
02093         ckpt[panelId] = panel;
02094       } else {
02095         // Duplicate panel tag
02096         gtfo ("CCockpitManager : Duplicate panel tag : 0x%08X", panelId);
02097       }
02098     }
02099     rc = TAG_READ;
02100     break;
02101   }
02102 
02103   if (rc != TAG_READ) {
02104     // Tag was not processed by this object, it is unrecognized
02105     char s[16];
02106     TagToString (s, tag);
02107     globals->logWarning->Write ("CCockpitManager::Read : Unrecognized tag <%s>", s);
02108   }
02109 
02110   return rc;
02111 }
02112 
02113 
02114 void CCockpitManager::ReadFinished ()
02115 {
02116 }
02117 
02118 
02119 CPanel* CCockpitManager::GetCurrentPanel (void)
02120 {
02121   return pPanel;
02122 }
02123 
02124 
02125 void CCockpitManager::SetPanel (Tag tag)
02126 {
02127   // Deactivate current panel
02128   if (pPanel != NULL) {
02129     pPanel->Deactivate ();
02130   }
02131 
02132   // Search for the supplied tag in the panel map
02133   map<Tag,CPanel*>::iterator i = ckpt.find(tag);
02134   if (i!=ckpt.end()) pPanel = i->second;
02135 
02136   // Activate new panel
02137   if (pPanel != NULL) {
02138     pPanel->Activate ();
02139   }
02140 }
02141 
02142 
02143 Tag CCockpitManager::GetPanel (void)
02144 {
02145   Tag rc = 0;
02146 
02147   if (pPanel != NULL) {
02148     rc = pPanel->GetId ();
02149   }
02150 
02151   return rc;
02152 }
02153 
02154 
02155 void CCockpitManager::Draw (void)
02156 {
02157   if (pPanel != NULL) {
02158     // Draw active panel
02159     pPanel->Draw ();
02160   }
02161 }
02162 
02163 
02164 //
02165 // Camera Manager
02166 //
02167 CCameraManager::CCameraManager (const char* camFilename)
02168 {
02169   // Default camera is external spot, unless overridden in a Read() call
02170   defaultCamera = CAMERA_SPOT;
02171 
02172   SStream s;
02173   strcpy (s.filename, "World\\");
02174   strcat (s.filename, camFilename);
02175   strcpy (s.mode, "r");
02176   if (OpenStream (&s)) {
02177     ReadFrom (this, &s);
02178     CloseStream (&s);
02179   } else {
02180     globals->logWarning->Write ("CCameraManager : Cannot open .CAM file %s", camFilename);
02181   }
02182 }
02183 
02184 CCameraManager::~CCameraManager (void)
02185 {
02186   vector<CCamera*>::iterator i;
02187   for (i=came.begin(); i!=came.end(); i++) delete *i;
02188 }
02189 
02190 int CCameraManager::Read (SStream *stream, Tag tag)
02191 {
02192   int rc = TAG_IGNORED;
02193 
02194   switch (tag) {
02195   case 'came':
02196     // Camera definition
02197     {
02198       Tag type;
02199       ReadTag (&type, stream);
02200       switch (type) {
02201       case CAMERA_COCKPIT:
02202         // Cockpit camera
02203         {
02204           CCameraCockpit *cock = new CCameraCockpit;
02205           ReadFrom (cock, stream);
02206           came.push_back(cock);
02207 
02208           // If a cockpit camera is defined, make it the default
02209           defaultCamera = CAMERA_COCKPIT;
02210         }
02211         break;
02212 
02213       default:
02214         char s[16];
02215         TagToString (s, type);
02216         globals->logWarning->Write ("CCameraManager::Read : Unknown camera type %s", s);
02217       }
02218     }
02219     rc = TAG_READ;
02220     break;
02221   }
02222 
02223   if (rc != TAG_READ) {
02224     // Tag was not processed by this object, it is unrecognized
02225     char s[16];
02226     TagToString (s, tag);
02227     globals->logWarning->Write ("CCameraManager::Read : Unrecognized tag <%s>", s);
02228   }
02229 
02230   return rc;
02231 }
02232 
02233 void CCameraManager::ReadFinished (void)
02234 {
02235   // Add other default cameras
02236   CCameraSpot *spot = new CCameraSpot;
02237   came.push_back (spot);
02238 
02239   CCameraFlyby *flyby = new CCameraFlyby;
02240   came.push_back (flyby);
02241 
02242   CCameraObserver *observer = new CCameraObserver;
02243   came.push_back (observer);
02244 
02245   CCameraTower *tower = new CCameraTower;
02246   came.push_back (tower);
02247 
02248   CCameraOverhead *over = new CCameraOverhead;
02249   came.push_back (over);
02250 
02251   // Set default camera
02252   SelectCamera (defaultCamera);
02253 }
02254 
02255 void CCameraManager::UpdateCamera (SPosition *targetPosition, SVector *targetOrientation,
02256                                    SPosition *eyePosition, SVector *eyeOrientation,
02257                                    const float dT)
02258 {
02259   // Get updated eye position from the active camera
02260   CCamera *cam = *iActive;
02261   cam->UpdateCamera (targetPosition, targetOrientation,
02262                      eyePosition, eyeOrientation, dT);
02263 
02264   // Store target and eye positions for Print() method
02265   tgtPos = *targetPosition;
02266   tgtOrient = *targetOrientation;
02267   eyePos = *eyePosition;
02268   eyeOrient = *eyeOrientation;
02269 }
02270 
02271 inline CCamera* CCameraManager::GetActiveCamera (void)
02272 {
02273   return *iActive;
02274 }
02275 
02276 void CCameraManager::ActivateCamera (void)
02277 {
02278   if (*iActive != NULL) {
02279     // Notify user of new camera name
02280     char name[64];
02281     (*iActive)->GetCameraName (name, 64);
02282     DrawNoticeToUser (name, 5);
02283   } else {
02284     gtfo ("CCameraManager::ActivateCamera : No valid active camera");
02285   }
02286 }
02287 
02288 
02289 void CCameraManager::SelectCamera (Tag id)
02290 {
02291   // Search camera list for the given tag
02292   int count = 0;
02293   vector<CCamera*>::iterator i;
02294   for (i=came.begin(); i!=came.end(); i++, count++) {
02295     if ((*i)->GetCameraType() == id) {
02296       iActive = i;
02297       ActivateCamera ();
02298     }
02299   }
02300 }
02301 
02302 void CCameraManager::NextCamera (void)
02303 {
02304   if (iActive == came.begin()) {
02305     // Wrap around to end of camera list
02306     iActive = came.end();
02307   }
02308   iActive--;
02309 
02310   ActivateCamera ();
02311 }
02312 
02313 void CCameraManager::PrevCamera (void)
02314 {
02315   iActive++;
02316   if (iActive == came.end()) {
02317     // Wrap around to beginning of camera list
02318     iActive = came.begin();
02319   }
02320 
02321   ActivateCamera ();
02322 }
02323 
02324 void CCameraManager::Print (FILE *f)
02325 {
02326   char debug[256];
02327 
02328   fprintf (f, "Camera Manager:\n\n");
02329 
02330   // Current camera attributes
02331   CCamera* camera = GetActiveCamera();
02332   Tag tag = camera->GetCameraType ();
02333   char sTag[8];
02334   TagToString (sTag, tag);
02335   char name[80];
02336   camera->GetCameraName (name, 80);
02337   SVector offset;
02338   camera->GetCameraOffset (&offset);
02339 
02340   fprintf (f, "Current Camera : '%4s' %s\n", sTag, name);
02341   fprintf (f, "  Offset : x=%6.3f  y=%6.3f  z=%6.3f\n",
02342     offset.x, offset.y, offset.z);
02343   fprintf (f, "\n");
02344 
02345   // Eye position
02346   fprintf (f, "Eye:\n");
02347   FormatPosition (eyePos, debug);
02348   fprintf (f, "  Pos  %-40s\n", debug);
02349   SVector v = PosToScaledFlatCartesianQgt (eyePos);
02350 //  float scale = TerrainScale (eyePos);
02351 //  v.x *= scale;
02352 //  v.y *= scale;
02353   fprintf (f, "  x = %12.6f  y = %12.6f  z = %12.6f\n", v.x, v.y, v.z);
02354   fprintf (f, "\n");
02355 
02356   // Eye orientation
02357   fprintf (f, "Orientation :\n");
02358   fprintf (f, "       Heading       Pitch       Roll\n");
02359   fprintf (f, "  Rad   %6.3f       %6.3f       %6.3f\n",
02360     eyeOrient.h, eyeOrient.p, eyeOrient.r);
02361   fprintf (f, "  Deg   %6.3f       %6.3f       %6.3f\n",
02362     RadToDeg (eyeOrient.h), RadToDeg (eyeOrient.p), RadToDeg (eyeOrient.r));
02363   fprintf (f, "\n");
02364 
02365   // Target position
02366   fprintf (f, "Target:\n");
02367   FormatPosition (tgtPos, debug);
02368   fprintf (f, "  Pos  %-40s\n", debug);
02369   v = PosToScaledFlatCartesianQgt (tgtPos);
02370 //  scale = TerrainScale (eyePos);
02371 //  v.x *= scale;
02372 //  v.y *= scale;
02373   fprintf (f, "  x = %12.6f  y = %12.6f  z = %12.6f\n", v.x, v.y, v.z);
02374   fprintf (f, "\n");
02375 
02376   // Eye orientation
02377   fprintf (f, "Orientation :\n");
02378   fprintf (f, "       Heading       Pitch       Roll\n");
02379   fprintf (f, "  Rad   %6.3f       %6.3f       %6.3f\n",
02380     tgtOrient.h, tgtOrient.p, tgtOrient.r);
02381   fprintf (f, "  Deg   %6.3f       %6.3f       %6.3f\n",
02382     RadToDeg (tgtOrient.h), RadToDeg (tgtOrient.p), RadToDeg (tgtOrient.r));
02383   fprintf (f, "\n");
02384 }
02385 
02386 
02387 /*
02388  * CLevelOfDetail
02389  */
02390 
02391 CLevelOfDetail::CLevelOfDetail (const char* lodFilename)
02392 {
02393   daynight = new ssgSelector (2);
02394   daynight->setName ("day_night");
02395 
02396   day = new ssgSelector ();
02397   day->setName ("day");
02398   
02399   night = new ssgSelector ();
02400   night->setName ("night");
02401 
02402   daynight->addKid (day);
02403   daynight->addKid (night);
02404 
02405   shadowAcm = NULL;
02406 
02407   SStream s;
02408   strcpy (s.filename, "World\\");
02409   strcat (s.filename, lodFilename);
02410   strcpy (s.mode, "r");
02411   if (OpenStream (&s)) {
02412     ReadFrom (this, &s);
02413     CloseStream (&s);
02414   }
02415 }
02416 
02417 CLevelOfDetail::~CLevelOfDetail (void)
02418 {
02419 //  daynight->removeAllKids();
02420 //  delete daynight;
02421   vector<CModelACM*>::iterator i;
02422   for (i=modelAcm.begin(); i!=modelAcm.end(); i++) delete *i;
02423 //  if (modelAcm != NULL) delete modelAcm;
02424   if (shadowAcm != NULL) delete shadowAcm;
02425 }
02426 
02427 int CLevelOfDetail::Read (SStream *stream, Tag tag)
02428 {
02429   int rc = TAG_IGNORED;
02430 
02431   static bool dayTag = false;     // true when day models tag has been read
02432   static bool nightTag = false;   // true when night models tag has been read
02433   static bool dayModels = false;    // true when day models sub-object active
02434   static bool nightModels = false;  // true when night models sub-object active
02435 
02436   switch (tag) {
02437   case 'dlod':
02438     // Daytime models.  This tag introduces a sub-object containing the
02439     //   various level of detail models for the daytime exterior
02440     dayTag = true;
02441     rc = TAG_READ;
02442     break;
02443 
02444   case 'nlod':
02445     // Nighttime models.  This tag introduces a sub-object containing the
02446     //   various level of detail models for the nighttime exterior
02447     nightTag = true;
02448     rc = TAG_READ;
02449     break;
02450 
02451   case 'bgno':
02452     if (dayTag) {
02453       // We are expecting this tag to open the day models sub-object
02454       dayTag = false;
02455       dayModels = true;
02456       rc = TAG_READ;
02457     } else if (nightTag) {
02458       // We are expecting this <bgno> to open the night models sub-object
02459       nightTag = false;
02460       nightModels = true;
02461       rc = TAG_READ;
02462     }
02463     break;
02464 
02465   case 'endo':
02466     // Signals the end of either the day or night models subobject
02467     if (dayModels) {
02468       // This <endo> closes the day models sub-object
02469       dayModels = false;
02470       rc = TAG_READ;
02471     } else if (nightModels) {
02472       // This <endo> closes the night models sub-object
02473       nightModels = false;
02474       rc = TAG_READ;
02475     } else {
02476       // We were not processing either the day or night models sub-object,
02477       //   so we shouldn't have read this <endo>
02478       globals->logWarning->Write ("CLevelOfDetail::Read : Premature <endo>");
02479     }
02480     break;
02481 
02482   case 'mod2':
02483     {
02484       // Model specification
02485       char type[64];
02486       ReadString (type, 64, stream);
02487       Tag typeTag = StringToTag (type);
02488 
02489       char filename[64];
02490       ReadString (filename, 64, stream);
02491       char fullname[64];
02492       strcpy (fullname, "Models\\");
02493       strcat (fullname, filename);
02494 
02495       // Load the model, which will be either a 'comp' (complex) ACM model
02496       //   or a 'simp' (simple) SMF model
02497       switch (typeTag) {
02498       case 'comp':
02499         {
02501           CModelACM *tempAcm = new CModelACM (fullname);
02502           modelAcm.push_back (tempAcm);
02503           day->addKid (tempAcm->GetSSGEntity());
02504         }
02505         break;
02506       }
02507 
02508       // Level of detail threshold (pixels)
02509       unsigned int lod;
02510       ReadUInt (&lod, stream);
02511 
02512       rc = TAG_READ;
02513     }
02514     break;
02515 
02516   case 'shad':
02517     {
02518       // Low-detail shadow model
02519       char type[64];
02520       ReadString (type, 64, stream);
02521       Tag typeTag = StringToTag (type);
02522 
02523       char filename[64];
02524       ReadString (filename, 64, stream);
02525 
02526       // Load the model, which will be either a 'comp' (complex) ACM model
02527       //   or a 'simp' (simple) SMF model
02528       switch (typeTag) {
02529       case 'comp':
02530         shadowAcm = new CModelACM (filename);
02531         day->addKid (shadowAcm->GetSSGEntity());
02532         break;
02533       }
02534 
02535       rc = TAG_READ;
02536     }
02537     break;
02538   }
02539 
02540   if (rc != TAG_READ) {
02541     // Tag was not processed by this object, it is unrecognized
02542     char s[16];
02543     TagToString (s, tag);
02544     globals->logWarning->Write ("CLevelOfDetail::Read : Unrecognized tag <%s>", s);
02545   }
02546 
02547   return rc;
02548 }
02549 
02550 
02551 ssgEntity *CLevelOfDetail::GetSSGEntity (void)
02552 {
02553   return daynight;
02554 }
02555 
02556 
02557 /*
02558  * CRadioManager
02559  */
02560 
02561 CRadioManager::CRadioManager (const char* rdoFilename)
02562 {
02563   SStream s;
02564   strcpy (s.filename, "World\\");
02565   strcat (s.filename, rdoFilename);
02566   strcpy (s.mode, "r");
02567   if (OpenStream (&s)) {
02568     ReadFrom (this, &s);
02569     CloseStream (&s);
02570   }
02571 }
02572 
02573 
02574 // *
02575 // * The Radio Manager provides a mapping between radio subsystems and the
02576 // *   API functions GetRadio... ???
02577 // *
02578 
02579 
02580 int CRadioManager::Read (SStream *stream, Tag tag)
02581 {
02582   int rc = TAG_IGNORED;
02583 
02584   switch (tag) {
02585   case 'rdio':
02586     {
02587       char type_string[64];
02588       ReadString (type_string, 64, stream);
02589       Tag type = StringToTag (type_string);
02590 
02591 //      CSubsystem *s = NULL;
02592       switch (type) {
02593 
02594       case SUBSYSTEM_NAV_RADIO:
02595 //        s = new CNavRadio;
02596         break;
02597 
02598       case SUBSYSTEM_RNAV_RADIO:
02599 //        s = new CRnavRadio;
02600         break;
02601 
02602       case SUBSYSTEM_COMM_RADIO:
02603 //        s = new CCommRadio;
02604         break;
02605 
02606       case SUBSYSTEM_TRANSPONDER_RADIO:
02607 //        s = new CTransponderRadio;
02608         break;
02609 
02610       case SUBSYSTEM_ADF_RADIO:
02611 //        s = new CADFRadio;
02612         break;
02613 
02614       case SUBSYSTEM_KLN89_GPS_RADIO:
02615 //        s = new CBKKLN89GPSRadio;
02616         break;
02617 
02618       case SUBSYSTEM_KX155_RADIO:
02619 //        s = new CBKKX155Radio;
02620         break;
02621 
02622       case SUBSYSTEM_KT76_RADIO:
02623 //        s = new CBKKT76Radio;
02624         break;
02625 
02626       case SUBSYSTEM_KAP140_RADIO:
02627 //        s = new CBKKAP140Radio;
02628         break;
02629 
02630       case SUBSYSTEM_AUDIO_PANEL_RADIO:
02631 //        s = new CAudioPanelRadio;
02632         break;
02633 
02634       default:
02635         globals->logWarning->Write ("CRadioManager : Unknown radio type %s",
02636           type_string);
02637       }
02638 
02639       unsigned int group;
02640       ReadUInt (&group, stream);
02641       rc = TAG_READ;
02642 
02643 //      if (s != NULL) {
02644 //        s->SetGroup (group);
02645 //      }
02646     }
02647   }
02648 
02649   if (rc != TAG_READ) {
02650     // Tag was not processed by this object, it is unrecognized
02651     char s[16];
02652     TagToString (s, tag);
02653     globals->logWarning->Write ("CRadioManager::Read : Unrecognized tag <%s>", s);
02654   }
02655 
02656   return rc;
02657 }
02658 
02659 
02660 
02661 /*
02662  * CExternalLights
02663  */
02664 
02665 CExternalLights::CExternalLights (const char* eltFilename)
02666 {
02667   SStream s;
02668   strcpy (s.filename, "World\\");
02669   strcat (s.filename, eltFilename);
02670   strcpy (s.mode, "r");
02671   if (OpenStream (&s)) {
02672     ReadFrom (this, &s);
02673     CloseStream (&s);
02674   }
02675 }
02676 
02677 
02678 int CExternalLights::Read (SStream *stream, Tag tag)
02679 {
02680   int rc = TAG_IGNORED;
02681 
02682 
02683   if (rc != TAG_READ) {
02684     // Tag was not processed by this object, it is unrecognized
02685     char s[16];
02686     TagToString (s, tag);
02687     globals->logWarning->Write ("CExternalLights::Read : Unrecognized tag <%s>", s);
02688   }
02689 
02690   return rc;
02691 }
02692 
02693 
02694 void CExternalLights::ReadFinished (void)
02695 {
02696 
02697 }
02698 
02699 
02700 void CExternalLights::Write (SStream *stream)
02701 {
02702 
02703 }
02704 
02705 
02706 /*
02707  * CEngineManager
02708  */
02709 
02710 CEngineManager::CEngineManager (const char* ngnFilename)
02711 {
02712   SStream s;
02713   strcpy (s.filename, "World\\");
02714   strcat (s.filename, ngnFilename);
02715   strcpy (s.mode, "r");
02716   if (OpenStream (&s)) {
02717     ReadFrom (this, &s);
02718     CloseStream (&s);
02719   }
02720 }
02721 
02722 
02723 int CEngineManager::Read (SStream *stream, Tag tag)
02724 {
02725   int rc = TAG_IGNORED;
02726 
02727 
02728   if (rc != TAG_READ) {
02729     // Tag was not processed by this object, it is unrecognized
02730     char s[16];
02731     TagToString (s, tag);
02732     globals->logWarning->Write ("CEngineManager::Read : Unrecognized tag <%s>", s);
02733   }
02734 
02735   return rc;
02736 }
02737 
02738 
02739 void CEngineManager::ReadFinished (void)
02740 {
02741 
02742 }
02743 
02744 
02745 void CEngineManager::Write (SStream *stream)
02746 {
02747 
02748 }
02749 
02750 
02751 /*
02752  * CControlMixer
02753  */
02754 
02755 CControlMixer::CControlMixer (const char* mixFilename)
02756 {
02757   SStream s;
02758   strcpy (s.filename, "World\\");
02759   strcat (s.filename, mixFilename);
02760   strcpy (s.mode, "r");
02761   if (OpenStream (&s)) {
02762     ReadFrom (this, &s);
02763     CloseStream (&s);
02764   }
02765 }
02766 
02767 
02768 int CControlMixer::Read (SStream *stream, Tag tag)
02769 {
02770   int rc = TAG_IGNORED;
02771 
02772 
02773   if (rc != TAG_READ) {
02774     // Tag was not processed by this object, it is unrecognized
02775     char s[16];
02776     TagToString (s, tag);
02777     globals->logWarning->Write ("CControlMixer::Read : Unrecognized tag <%s>", s);
02778   }
02779 
02780   return rc;
02781 }
02782 
02783 
02784 void CControlMixer::ReadFinished (void)
02785 {
02786 
02787 }
02788 
02789 
02790 void CControlMixer::Write (SStream *stream)
02791 {
02792 
02793 }
02794 
02795 
02796 /*
02797  * CChecklists
02798  */
02799 
02800 CChecklists::CChecklists (const char* cklFilename)
02801 {
02802   SStream s;
02803   strcpy (s.filename, "World\\");
02804   strcat (s.filename, cklFilename);
02805   strcpy (s.mode, "r");
02806   if (OpenStream (&s)) {
02807     ReadFrom (this, &s);
02808     CloseStream (&s);
02809   }
02810 }
02811 
02812 
02813 int CChecklists::Read (SStream *stream, Tag tag)
02814 {
02815   int rc = TAG_IGNORED;
02816 
02817 
02818   if (rc != TAG_READ) {
02819     // Tag was not processed by this object, it is unrecognized
02820     char s[16];
02821     TagToString (s, tag);
02822     globals->logWarning->Write ("CChecklists::Read : Unrecognized tag <%s>", s);
02823   }
02824 
02825   return rc;
02826 }
02827 
02828 
02829 void CChecklists::ReadFinished (void)
02830 {
02831 
02832 }
02833 
02834 
02835 void CChecklists::Write (SStream *stream)
02836 {
02837 
02838 }
02839 
02840 
02841 /*
02842  * CFlightControlSystem
02843  */
02844 
02845 CFlightControlSystem::CFlightControlSystem (const char* fcsFilename)
02846 {
02847   SStream s;
02848   strcpy (s.filename, "World\\");
02849   strcat (s.filename, fcsFilename);
02850   strcpy (s.mode, "r");
02851   if (OpenStream (&s)) {
02852     ReadFrom (this, &s);
02853     CloseStream (&s);
02854   }
02855 }
02856 
02857 
02858 int CFlightControlSystem::Read (SStream *stream, Tag tag)
02859 {
02860   int rc = TAG_IGNORED;
02861 
02862 
02863   if (rc != TAG_READ) {
02864     // Tag was not processed by this object, it is unrecognized
02865     char s[16];
02866     TagToString (s, tag);
02867     globals->logWarning->Write ("CFlightControlSystem::Read : Unrecognized tag <%s>", s);
02868   }
02869 
02870   return rc;
02871 }
02872 
02873 
02874 void CFlightControlSystem::ReadFinished (void)
02875 {
02876 
02877 }
02878 
02879 
02880 void CFlightControlSystem::Write (SStream *stream)
02881 {
02882 
02883 }
02884 
02885 
02886 //
02887 // Slope Wind Data
02888 //
02889 CSlopeWindData::CSlopeWindData (const char* swdFilename)
02890 {
02891 
02892 }
02893 
02894 int CSlopeWindData::Read (SStream *stream, Tag tag)
02895 {
02896   int rc = TAG_IGNORED;
02897 
02898   if (rc != TAG_READ) {
02899     // Tag was not processed by this object, it is unrecognized
02900     char s[16];
02901     TagToString (s, tag);
02902     globals->logWarning->Write ("CSlopeWindData::Read : Unrecognized tag <%s>", s);
02903   }
02904 
02905   return rc;
02906 }
02907 
02908 void CSlopeWindData::ReadFinished (void)
02909 {
02910 
02911 }
02912 
02913 
02914 void CSlopeWindData::Write (SStream *stream)
02915 {
02916 
02917 }
SourceForge.net Logo Documentation generated by doxygen