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

Gauges.cpp

Go to the documentation of this file.
00001 /*
00002  * Gauges.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 
00035 #include "../Include/Gauges.h"
00036 #include "../Include/Utility.h"
00037 #include "../Include/Ui.h"
00038 #include "../Include/Globals.h"
00039 #include "../Include/Subsystems.h"
00040 
00041 
00049 static int ClickAreaFromTag (Tag tag)
00050 {
00051   int rc = 0;
00052 
00053   // Check that upper bytes are 'CA' or 'ca'
00054   unsigned long upper = (tag & 0xFFFF0000) >> 16;
00055   if ((upper == 0x4341) || (upper == 0x6361)) {
00056     unsigned long d1 = ((tag & 0x0000FF00) >> 8) - '0';
00057     unsigned long d0 =  (tag & 0x000000FF) - '0';
00058     rc = (d1 * 10) + d0;
00059   }
00060 
00061   return rc;
00062 }
00063 
00064 
00065 //
00066 // Helper function to blit a SSurface to the screen, taking into account
00067 //   OpenGL row order and DrawPixels trick
00068 //
00069 static void BlitSurface (SSurface *surface, int xOffset, int yOffset, int y_isiz)
00070 {
00071   glRasterPos2i (xOffset, -yOffset);
00072   int xMove = -xOffset + surface->xScreen;
00073   int yMove = yOffset + y_isiz - surface->yScreen - surface->ySize;
00074   glBitmap (0, 0, 0, 0, xMove, yMove, NULL);
00075 
00076   BlitTransparent (surface, 0);
00077 }
00078 
00079 
00080 //
00081 // CGaugeNeedle
00082 //
00083 CGaugeNeedle::CGaugeNeedle (void)
00084 {
00085   shar = false;
00086   sizx = sizy = 0;
00087   offx = offy = 0;
00088   mind = 0;
00089   maxd = 360;
00090   strcpy (base, "");
00091 
00092   bmap = NULL;
00093 
00094   readFinished = false;
00095 }
00096 
00097 CGaugeNeedle::~CGaugeNeedle (void)
00098 {
00099   if (bmap != NULL) {
00100     FreeBitmap (bmap);
00101     delete bmap;
00102   }
00103 }
00104 
00105 int CGaugeNeedle::Read (SStream *stream, Tag tag)
00106 {
00107   int rc = TAG_IGNORED;
00108 
00109   switch (tag) {
00110   case 'file':
00111     // Refers to a NDL stream file containing the needle specification
00112     {
00113       char file[64];
00114       ReadString (file, 64, stream);
00115       SStream *s = new SStream;
00116       strcpy (s->filename, "Data\\");
00117       strcat (s->filename, file);
00118       strcpy (s->mode, "r");
00119       if (OpenStream (s)) {
00120         ReadFrom (this, s);
00121         CloseStream (s);
00122       }
00123       delete s;
00124       rc = TAG_READ;
00125     }
00126     break;
00127 
00128   case 'shar':
00129     // This needle is shared across multiple aircraft.  For now this has no effect
00130     shar = true;
00131     rc = TAG_READ;
00132     break;
00133 
00134   case 'sizx':
00135     ReadInt (&sizx, stream);
00136     rc = TAG_READ;
00137     break;
00138 
00139   case 'sizy':
00140     ReadInt (&sizy, stream);
00141     rc = TAG_READ;
00142     break;
00143 
00144   case 'offx':
00145     ReadInt (&offx, stream);
00146     rc = TAG_READ;
00147     break;
00148 
00149   case 'offy':
00150     ReadInt (&offy, stream);
00151     rc = TAG_READ;
00152     break;
00153 
00154   case 'mind':
00155     ReadInt (&mind, stream);
00156     rc = TAG_READ;
00157     break;
00158 
00159   case 'maxd':
00160     ReadInt (&maxd, stream);
00161     rc = TAG_READ;
00162     break;
00163 
00164   case 'base':
00165     ReadString (base, 64, stream);
00166     rc = TAG_READ;
00167     break;
00168   }
00169 
00170   if (rc == TAG_IGNORED) {
00171     char s[64];
00172     TagToString (s, tag);
00173     if (globals->logWarning)
00174       globals->logWarning->Write ("CGaugeNeedle::Read : Unknown tag %s", s);
00175   }
00176 
00177   return rc;
00178 }
00179 
00180 void CGaugeNeedle::ReadFinished (void)
00181 {
00182   if (readFinished) return;
00183 
00184   if (strlen(base) > 0) {
00185     // Load bitmap
00186     bmap = new SBitmap;
00187     strcpy (bmap->bitmapName, "ART\\");
00188     strcat (bmap->bitmapName, base);
00189     strcat (bmap->bitmapName, ".PBG");
00190     LoadBitmap (bmap);
00191     nFrames = NumBitmapFrames (bmap);
00192 
00193     // <offx> and <offy> represent offsets of the center of the needle;
00194     //   adjust for the top-left corner for use in Draw() if they were specified
00195     int w, h;
00196     GetBitmapSize (bmap, &w, &h);
00197     if (offx != 0) {
00198       offx -= w / 2;
00199     }
00200 
00201     if (offy != 0) {
00202       offy -= h / 2;
00203     }
00204   }
00205 
00206   readFinished = true;
00207 }
00208 
00209 void CGaugeNeedle::Draw (SSurface *surface, float degrees, int cx, int cy)
00210 {
00211   degrees = Wrap360 (degrees);
00212 
00213   if (bmap != NULL) {
00214     // Clamp to the min/max degrees
00215     if (degrees < mind) degrees = mind;
00216     if (degrees > maxd) degrees = maxd;
00217 
00218     // Convert degrees to frame number
00219     float fFrame = nFrames * (degrees - mind) / (maxd - mind);
00220     int frame = (int)fFrame;
00221 
00222     // cx, cy indicate offset to gauge center in the surface; calculate
00223     //   offset of top-left corner of needle bitmap within gauge
00225     int w, h;
00226     GetBitmapSize (bmap, &w, &h);
00227 
00228     // Adjust by half-width and half-height, rounding up
00229     cx -= (w+1)/2;
00230     cy -= (h+1)/2;
00231 
00232     // Finally draw the animation frame on the supplied surface
00233     DrawBitmap (surface, bmap, offx + cx, offy + cy, frame);
00234   }
00235 }
00236 
00237 
00238 //
00239 // CGaugeRectangle
00240 //
00241 CGaugeRectangle::CGaugeRectangle (void)
00242 {
00243   x1 = y1 = x2 = y2 = 0;
00244 }
00245 
00246 int CGaugeRectangle::Read (SStream *stream, Tag tag)
00247 {
00248   int rc = TAG_IGNORED;
00249 
00250   switch (tag) {
00251   case 'rect':
00252     ReadInt (&x1, stream);
00253     ReadInt (&y1, stream);
00254     ReadInt (&x2, stream);
00255     ReadInt (&y2, stream);
00256     rc = TAG_READ;
00257     break;
00258   }
00259 
00260   if (rc == TAG_IGNORED) {
00261     char s[64];
00262     TagToString (s, tag);
00263     if (globals->logWarning)
00264       globals->logWarning->Write ("CGaugeRectangle::Read : Unknown tag %s", s);
00265   }
00266 
00267   return rc;
00268 }
00269 
00270 
00271 //
00272 // CGaugeClickArea
00273 //
00274 CGaugeClickArea::CGaugeClickArea (void)
00275 {
00276   strcpy (bmap, "");
00277   strcpy (curs, "");
00278   cursTag = 0;
00279   strcpy (help, "");
00280   bm = NULL;
00281 }
00282 
00283 CGaugeClickArea::~CGaugeClickArea (void)
00284 {
00285   if (bm != NULL) {
00286     FreeBitmap (bm);
00287     delete bm;
00288   }
00289 }
00290 
00291 int CGaugeClickArea::Read (SStream *stream, Tag tag)
00292 {
00293   int rc = TAG_IGNORED;
00294 
00295   switch (tag) {
00296   case 'bmap':
00297     ReadString (bmap, 64, stream);
00298     rc = TAG_READ;
00299     break;
00300 
00301   case 'curs':
00302     ReadString (curs, 64, stream);
00303     rc = TAG_READ;
00304     break;
00305 
00306   case 'help':
00307     ReadString (help, 64, stream);
00308     rc = TAG_READ;
00309     break;
00310   }
00311 
00312   if (rc == TAG_IGNORED) {
00313     rc = CGaugeRectangle::Read (stream, tag);
00314   }
00315 
00316   if (rc == TAG_IGNORED) {
00317     char s[64];
00318     TagToString (s, tag);
00319     if (globals->logWarning)
00320       globals->logWarning->Write ("CGaugeClickArea::Read : Unknown tag %s", s);
00321   }
00322 
00323   return rc;
00324 }
00325 
00326 void CGaugeClickArea::ReadFinished (void)
00327 {
00328   // Load bitmap
00329   if (strlen (bmap) > 0) {
00330     bm = new SBitmap;
00331     strcpy (bm->bitmapName, "ART\\");
00332     strcat (bm->bitmapName, bmap);
00333     LoadBitmap (bm);
00334   }
00335 
00336   // Bind cursor to be used when mousing over this gauge
00337   cursTag = 0;
00338   if (strlen (curs) > 0) {
00339     cursTag = globals->cursormgr->BindCursor (curs);
00340   }
00341 }
00342 
00343 bool CGaugeClickArea::IsHit (int x, int y)
00344 {
00345   return ((x >= x1) && (x <= x2) && (y >= y1) && (y <= y2));
00346 }
00347 
00348 ECursorResult CGaugeClickArea::MouseMoved (int x, int y)
00349 {
00350   ECursorResult rc = CURSOR_NOT_CHANGED;
00351 
00352   // Check that the position is within click area bounds
00353   if ((cursTag != 0) && IsHit (x, y)) {
00354     globals->cursormgr->SetCursor (cursTag);
00355     rc = CURSOR_WAS_CHANGED;
00356   }
00357 
00358   return rc;
00359 }
00360 
00361 void CGaugeClickArea::Draw (SSurface *surface, int frame)
00362 {
00363   if ((surface != NULL) && (bm != NULL)) {
00364 //    int x = x1;
00365 //    int y = surface->ySize - y2;
00366     DrawBitmap (surface, bm, x1, y1, frame);  // ***
00367   }
00368 }
00369 
00370 
00371 //
00372 // CGaugeKnob
00373 //
00374 CGaugeKnob::CGaugeKnob (void)
00375 {
00376   strcpy (bmap, "");
00377   surf = NULL;
00378   bmKnob = NULL;
00379 }
00380 
00381 CGaugeKnob::~CGaugeKnob (void)
00382 {
00383   if (bmKnob != NULL) {
00384     FreeBitmap (bmKnob);
00385     delete bmKnob;
00386     FreeSurface (surf);
00387   }
00388 }
00389 
00390 int CGaugeKnob::Read (SStream *stream, Tag tag)
00391 {
00392   int rc = TAG_IGNORED;
00393 
00394   switch (tag) {
00395   case 'bmap':
00396     ReadString (bmap, 64, stream);
00397     rc = TAG_READ;
00398     break;
00399   }
00400 
00401   if (rc == TAG_IGNORED) {
00402     rc = CGaugeClickArea::Read (stream, tag);
00403   }
00404 
00405   if (rc == TAG_IGNORED) {
00406     char s[64];
00407     TagToString (s, tag);
00408     globals->logWarning->Write ("CGaugeClickArea::Read : Unknown tag %s", s);
00409   }
00410 
00411   return rc;
00412 }
00413 
00414 void CGaugeKnob::ReadFinished (void)
00415 {
00416   CGaugeClickArea::ReadFinished();
00417 
00418   // Check if knob bitmap has been specified
00419   if (strlen(bmap) > 0) {
00420     // Load bitmap image
00421     bmKnob = new SBitmap;
00422     strcpy (bmKnob->bitmapName, "ART\\");
00423     strcat (bmKnob->bitmapName, bmap);
00424     LoadBitmap (bmKnob);
00425 
00426     // Create surface to draw knob on
00427     surf = CreateSurface ((x2 - x1 + 1), (y2 - y1 + 1));
00428   }
00429 }
00430 
00431 void CGaugeKnob::SetOffset (int offset_x, int offset_y)
00432 {
00433   this->offset_x = offset_x;
00434   this->offset_y = offset_y;
00435 }
00436 
00437 void CGaugeKnob::Draw (float rotation)
00438 {
00439   if ((bmKnob != NULL) && (surf != NULL)) {
00440     // Clamp rotation to range 0.0..1.0
00441     while (rotation < 0.0f) rotation += 1.0f;
00442     while (rotation >= 1.0f) rotation -= 1.0f;
00443 
00444     // Convert rotation amount to frame number
00445     float fFrame = NumBitmapFrames (bmKnob) * rotation;
00446     int frame = (int)fFrame;
00447 
00448     // Draw the knob animation frame
00449     EraseSurface (surf);
00450     surf->xScreen = offset_x + x1;
00451     surf->yScreen = offset_y + y1;
00452     DrawBitmap (surf, bmKnob, 0, 0, frame);
00453     Blit (surf);
00454   }
00455 }
00456 
00457 //  *** Memory leak cleanup complete to here
00458 
00459 //
00460 // CGaugeAnnunciator
00461 //
00462 CGaugeAnnunciator::CGaugeAnnunciator (void)
00463 {
00464 }
00465 
00466 int CGaugeAnnunciator::Read (SStream *stream, Tag tag)
00467 {
00468   int rc = TAG_IGNORED;
00469 
00470   if (rc == TAG_IGNORED) {
00471     rc = CGaugeClickArea::Read (stream, tag);
00472   }
00473 
00474   if (rc == TAG_IGNORED) {
00475     char s[64];
00476     TagToString (s, tag);
00477     globals->logWarning->Write ("CGaugeAnnunciator::Read : Unknown tag %s", s);
00478   }
00479 
00480   return rc;
00481 }
00482 
00483 
00484 //
00485 // CGauge
00486 //
00487 int CGauge::sfx_source = 0;
00488 
00489 CGauge::CGauge (void)
00490 {
00491   type = GAUGE_BASE;
00492   unid = 0;
00493   x = y = w = h = 0;
00494   cx = cy = 0;
00495   memset (&mesg, 0, sizeof(SMessage));
00496   gmin = gmax = 0.0f;
00497   lite = 0;
00498   strcpy (mask, "");
00499   fore = false;
00500   strcpy (curs, "");
00501   strcpy (help, "");
00502   strcpy (dtyp, "");
00503   strcpy (dfmt, "");
00504   nomc = false;
00505   igno = false;
00506   surf = NULL;
00507 }
00508 
00509 int CGauge::Read (SStream *stream, Tag tag)
00510 {
00511   int rc = TAG_IGNORED;
00512 
00513   switch (tag) {
00514   case 'unid':
00515     ReadTag (&unid, stream);
00516     TagToString (unid_s, unid);
00517     rc = TAG_READ;
00518     break;
00519 
00520   case 'size':
00521     ReadInt (&x, stream);
00522     ReadInt (&y, stream);
00523     ReadInt (&w, stream);
00524     ReadInt (&h, stream);
00525     rc = TAG_READ;
00526     break;
00527 
00528   case 'cntr':
00529     ReadInt (&cx, stream);
00530     ReadInt (&cy, stream);
00531     rc = TAG_READ;
00532     break;
00533 
00534   case 'mesg':
00535     ReadMessage (&mesg, stream);
00536     rc = TAG_READ;
00537     break;
00538 
00539   case 'gmin':
00540     ReadFloat (&gmin, stream);
00541     rc = TAG_READ;
00542     break;
00543 
00544   case 'gmax':
00545     ReadFloat (&gmax, stream);
00546     rc = TAG_READ;
00547     break;
00548 
00549   case 'gtbl':
00550 //    SkipObject (stream);
00551     ReadFrom (&gtbl, stream);
00552     rc = TAG_READ;
00553     break;
00554 
00555   case 'lite':
00556     ReadTag (&lite, stream);
00557     rc = TAG_READ;
00558     break;
00559 
00560   case 'mask':
00561     ReadString (mask, 64, stream);
00562     rc = TAG_READ;
00563     break;
00564 
00565   case 'fore':
00566     fore = true;
00567     rc = TAG_READ;
00568     break;
00569 
00570   case 'curs':
00571   case 'crsr':
00572     ReadString (curs, 64, stream);
00573     rc = TAG_READ;
00574     break;
00575 
00576   case 'help':
00577     ReadString (help, 64, stream);
00578     rc = TAG_READ;
00579     break;
00580 
00581   case 'dtyp':
00582     ReadString (dtyp, 64, stream);
00583     rc = TAG_READ;
00584     break;
00585 
00586   case 'dfmt':
00587     ReadString (dfmt, 64, stream);
00588     rc = TAG_READ;
00589     break;
00590 
00591   case 'nomc':
00592     nomc = true;
00593     rc = TAG_READ;
00594     break;
00595 
00596   case 'igno':
00597     nomc = true;
00598     rc = TAG_READ;
00599     break;
00600 
00601   case 'conn':
00602     // DEPRECATED
00603     {
00604       Tag tag;
00605       ReadTag (&tag, stream);
00606       mesg.group = (unsigned int) tag;
00607     }
00608     rc = TAG_READ;
00609     break;
00610 
00611   case 'user':
00612     // DEPRECATED
00613     {
00614       char user[64];
00615       ReadString (user, 64, stream);
00617     }
00618     rc = TAG_READ;
00619     break;
00620 
00621   case 'unit':
00622     // DEPRECATED
00623     ReadUInt (&mesg.user.u.unit, stream);
00624     rc = TAG_READ;
00625     break;
00626 
00627   case 'dtag':
00628     // DEPRECATED
00629     ReadUInt (&mesg.user.u.datatag, stream);
00630     rc = TAG_READ;
00631     break;
00632   }
00633 
00634   if (rc == TAG_IGNORED) {
00635     char s[64];
00636     TagToString (s, tag);
00637     globals->logWarning->Write ("CGauge::Read : Unknown tag %s", s);
00638   }
00639 
00640   return rc;
00641 }
00642 
00643 
00644 void CGauge::ReadFinished (void)
00645 {
00646   // Create drawing surface for the gauge
00647   if ((w > 0) && (h > 0)) {
00648     surf = CreateSurface (w, h);
00649     surf->xScreen = x;
00650     surf->yScreen = y;
00651   }
00652 
00653   // Bind cursor to be used when mousing over this gauge
00654   cursTag = 0;
00655   if (strlen (curs) > 0) {
00656     cursTag = globals->cursormgr->BindCursor (curs);
00657   }
00658 }
00659 
00660 
00661 void CGauge::GetSize (int* x, int* y, int*w, int* h)
00662 {
00663   *x = this->x;
00664   *y = this->y;
00665   *w = this->w;
00666   *h = this->h;
00667 }
00668 
00669 
00670 SSurface *CGauge::GetSurface (void)
00671 {
00672   return surf;
00673 }
00674 
00675 
00676 //
00677 // Update the gauge's indication value
00678 //
00679 void CGauge::Update (void)
00680 {
00681   // Send the 'mesg' message to the supplier subsystem
00682   SendMessage (&mesg);
00683 
00684   // All gauge values resolve to floating point values
00685   value = 0;
00686   switch (mesg.dataType) {
00687   case TYPE_INT:
00688     value = (float)mesg.intData;
00689     break;
00690 
00691   case TYPE_INTPTR:
00692     if (mesg.intPtrData) {
00693       value = (float)*(mesg.intPtrData);
00694     }
00695     break;
00696 
00697   case TYPE_REAL:
00698     value = mesg.realData;
00699     break;
00700 
00701   case TYPE_REALPTR:
00702     if (mesg.realPtrData) {
00703       value = *(mesg.realPtrData);
00704     }
00705     break;
00706 
00707   case TYPE_NONE:
00708   case TYPE_VOID:
00709   case TYPE_CHAR:
00710   case TYPE_CHARPTR:
00711     // These are not handled by the CGauge base class.  Derived classes
00712     //   must implement their own Update() methods to handle returned
00713     //   strings and pointers.
00714     break;
00715   }
00716 
00717   // Clamp to gauge minimum and maximum values
00718   if (value < gmin) value = gmin;
00719   if (value > gmax) value = gmax;
00720 
00721   // Apply gauge translation table if appropriate
00722   value = gtbl.Lookup (value);
00723 }
00724 
00725 
00726 EClickResult CGauge::MouseClick (int x, int y, int buttons)
00727 {
00728   EClickResult rc = MOUSE_TRACKING_OFF;
00729 
00730   // Temporary debug
00731 //  char debug[80];
00732 //  sprintf (debug, "'%4s': Click at %d, %d", unid_s, x, y);
00733 //  DrawNoticeToUser (debug, 1);
00734 
00735   return rc;
00736 }
00737 
00738 
00739 EClickResult CGauge::TrackClick (int x, int y, int buttons)
00740 {
00741   // Default return code is for tracking to be ON.  This allows a gauge
00742   //   to handle just MouseClick and StopClick events by preserving
00743   //   the click result as TRACKING_ON when CPanel calls this default method
00744   return MOUSE_TRACKING_ON;
00745 }
00746 
00747 
00748 EClickResult CGauge::StopClick (int x, int y, int buttons)
00749 {
00750   EClickResult rc = MOUSE_TRACKING_OFF;
00751 
00752   // Temporary debug
00753 //  char debug[80];
00754 //  sprintf (debug, "'%4s': Stop at %d, %d", unid_s, x, y);
00755 //  DrawNoticeToUser (debug, 1);
00756 
00757   return rc;
00758 }
00759 
00760 ECursorResult CGauge::MouseMoved (int x, int y)
00761 {
00762   ECursorResult rc = CURSOR_NOT_CHANGED;
00763 
00764   // Update cursor if necessary
00765   if (cursTag != 0) {
00766     // Change to this gauge's cursor
00767     globals->cursormgr->SetCursor (cursTag);
00768     rc = CURSOR_WAS_CHANGED;
00769   }
00770 
00771 // Temporary debug
00772 //  char debug[80];
00773 //  sprintf (debug, "'%4s':  Move to %d, %d", unid_s, x, y);
00774 //  DrawNoticeToUser (debug, 1);
00775 
00776   return rc;
00777 }
00778 
00779 void CGauge::ClearSurface (void)
00780 {
00781   EraseSurface (surf);
00782 }
00783 
00784 void CGauge::Draw (void)
00785 {
00786   ClearSurface ();
00787 }
00788 
00789 void CGauge::Blit (int xOffset, int yOffset, int y_isiz)
00790 {
00791   BlitSurface (surf, xOffset, yOffset, y_isiz);
00792 }
00793 
00794 
00795 //
00796 // CBitmapGauge
00797 //
00798 CBitmapGauge::CBitmapGauge (void)
00799 {
00800   strcpy (bmap.art, "");
00801   bmap.x = bmap.y = 0;
00802 
00803   strcpy (over.art, "");
00804   over.x = over.y = 0;
00805 
00806   bmUnderlay = NULL;
00807   bmOverlay = NULL;
00808 }
00809 
00810 
00811 CBitmapGauge::~CBitmapGauge()
00812 {
00813   if (bmUnderlay != NULL) {
00814     FreeBitmap (bmUnderlay);
00815     delete bmUnderlay;
00816   }
00817 
00818   if (bmOverlay != NULL) {
00819     FreeBitmap (bmOverlay);
00820     delete bmOverlay;
00821   }
00822 }
00823 
00824 
00825 int CBitmapGauge::Read (SStream *stream, Tag tag)
00826 {
00827   int rc = TAG_IGNORED;
00828 
00829   switch (tag) {
00830   case 'bmap':
00831     ReadString (bmap.art, 64, stream);
00832     ReadInt (&bmap.x, stream);
00833     ReadInt (&bmap.y, stream);
00834     rc = TAG_READ;
00835     break;
00836 
00837   case 'over':
00838     ReadString (over.art, 64, stream);
00839     ReadInt (&over.x, stream);
00840     ReadInt (&over.y, stream);
00841     rc = TAG_READ;
00842     break;
00843   }
00844 
00845   if (rc == TAG_IGNORED) {
00846     rc = CGauge::Read (stream, tag);
00847   }
00848 
00849   if (rc == TAG_IGNORED) {
00850     char s[64];
00851     TagToString (s, tag);
00852     globals->logWarning->Write ("CBitmapGauge::Read : Unknown tag %s", s);
00853   }
00854 
00855   return rc;
00856 }
00857 
00858 
00859 void CBitmapGauge::ReadFinished (void)
00860 {
00861   CGauge::ReadFinished ();
00862 
00863   char *mark1 = new char[32];
00864   strcpy (mark1, "bmg start");
00865 
00866   // Load underlay and overlay bitmaps when required
00867   if (strlen (bmap.art) > 0) {
00868     bmUnderlay = new SBitmap;
00869     strcpy (bmUnderlay->bitmapName, "ART\\");
00870     strcat (bmUnderlay->bitmapName, bmap.art);
00871     LoadBitmap (bmUnderlay);
00872   }
00873 
00874   if (strlen (over.art) > 0) {
00875     bmOverlay = new SBitmap;
00876     strcpy (bmOverlay->bitmapName, "ART\\");
00877     strcat (bmOverlay->bitmapName, over.art);
00878     LoadBitmap (bmOverlay);
00879   }
00880   char *mark2 = new char[32];
00881   strcpy (mark2, "bmg end");
00882 }
00883 
00884 
00885 void CBitmapGauge::DrawUnderlay (void)
00886 {
00887   // Draw underlay bitmap
00888   if (bmUnderlay != NULL) {
00889     DrawBitmap (surf, bmUnderlay, bmap.x, bmap.y, 0);
00890   }
00891 }
00892 
00893 void CBitmapGauge::DrawOverlay (void)
00894 {
00895   // Draw overlay bitmap
00896   if (bmOverlay != NULL) {
00897     DrawBitmap (surf, bmOverlay, over.x, over.y, 0);
00898   }
00899 }
00900 
00901 void CBitmapGauge::Draw (void)
00902 {
00903   ClearSurface ();
00904   DrawUnderlay ();
00905   DrawOverlay ();
00906 }
00907 
00908 
00909 //
00910 // CNeedleGauge
00911 //
00912 CNeedleGauge::CNeedleGauge (void)
00913 {
00914   radi = 0;
00915   sang = 0.0f;
00916   dunt = 1.0f;
00917   rang_min = 0.0f;
00918   rang_max = 0.0f;
00919   noff_x = noff_y = 0;
00920   noac = false;
00921 }
00922 
00923 
00924 int CNeedleGauge::Read (SStream *stream, Tag tag)
00925 {
00926   int rc = TAG_IGNORED;
00927 
00928   switch (tag) {
00929   case 'radi':
00930     ReadInt (&radi, stream);
00931     rc = TAG_READ;
00932     break;
00933 
00934   case 'sang':
00935     ReadFloat (&sang, stream);
00936     rc = TAG_READ;
00937     break;
00938 
00939   case 'dunt':
00940     ReadFloat (&dunt, stream);
00941     rc = TAG_READ;
00942     break;
00943 
00944   case 'rang':
00945     ReadFloat (&rang_min, stream);
00946     ReadFloat (&rang_max, stream);
00947     rc = TAG_READ;
00948     break;
00949 
00950   case 'noff':
00951     ReadInt (&noff_x, stream);
00952     ReadInt (&noff_y, stream);
00953     rc = TAG_READ;
00954     break;
00955 
00956   case 'noac':
00957     noac = true;
00958     rc = TAG_READ;
00959     break;
00960 
00961   case 'nedl':
00962     ReadTag (&nedl.tag, stream);
00963     ReadFrom (&nedl, stream);
00964     rc = TAG_READ;
00965     break;
00966   }
00967 
00968   if (rc == TAG_IGNORED) {
00969     rc = CBitmapGauge::Read (stream, tag);
00970   }
00971 
00972   if (rc == TAG_IGNORED) {
00973     char s[64];
00974     TagToString (s, tag);
00975     globals->logWarning->Write ("CNeedleGauge::Read : Unknown tag %s", s);
00976   }
00977 
00978   return rc;
00979 }
00980 
00981 void CNeedleGauge::Draw (void)
00982 {
00983   ClearSurface ();
00984   DrawUnderlay ();
00985 
00986   // Get indication value, this updates the 'value' field
00987   mesg.id = MSG_GETDATA;
00988   CGauge::Update ();
00989 
00990   // Determine animation frame corresponding to gauge angle
00991   float degrees = value + sang;
00992 
00993   // Draw needle into gauge surface
00994   nedl.Draw (surf, degrees, cx, cy);
00995 
00996   DrawOverlay ();
00997 }
00998 
00999 
01000 
01001 //
01002 // CTwoNeedleGauge
01003 //
01004 CTwoNeedleGauge::CTwoNeedleGauge (void)
01005 {
01006 }
01007 
01008 
01009 int CTwoNeedleGauge::Read (SStream *stream, Tag tag)
01010 {
01011   int rc = TAG_IGNORED;
01012 
01013   switch (tag) {
01014   case 'ndl1':
01015     ReadFrom (&ndl1, stream);
01016     rc = TAG_READ;
01017     break;
01018 
01019   case 'ndl2':
01020     ReadFrom (&ndl2, stream);
01021     rc = TAG_READ;
01022     break;
01023   }
01024 
01025   if (rc == TAG_IGNORED) {
01026     rc = CBitmapGauge::Read (stream, tag);
01027   }
01028 
01029   if (rc == TAG_IGNORED) {
01030     char s[64];
01031     TagToString (s, tag);
01032     globals->logWarning->Write ("CTwoNeedleGauge::Read : Unknown tag %s", s);
01033   }
01034 
01035   return rc;
01036 }
01037 
01038 
01039 //
01040 // CThreeNeedleGauge
01041 //
01042 CThreeNeedleGauge::CThreeNeedleGauge (void)
01043 {
01044 }
01045 
01046 
01047 int CThreeNeedleGauge::Read (SStream *stream, Tag tag)
01048 {
01049   int rc = TAG_IGNORED;
01050 
01051   switch (tag) {
01052   case 'ndl1':
01053     ReadFrom (&ndl1, stream);
01054     rc = TAG_READ;
01055     break;
01056 
01057   case 'ndl2':
01058     ReadFrom (&ndl2, stream);
01059     rc = TAG_READ;
01060     break;
01061 
01062   case 'ndl3':
01063     ReadFrom (&ndl3, stream);
01064     rc = TAG_READ;
01065     break;
01066   }
01067 
01068   if (rc == TAG_IGNORED) {
01069     rc = CBitmapGauge::Read (stream, tag);
01070   }
01071 
01072   if (rc == TAG_IGNORED) {
01073     char s[64];
01074     TagToString (s, tag);
01075     globals->logWarning->Write ("CThreeNeedleGauge::Read : Unknown tag %s", s);
01076   }
01077 
01078   return rc;
01079 }
01080 
01081 
01082 //
01083 // CDigitalNeedleGauge
01084 //
01085 CDigitalNeedleGauge::CDigitalNeedleGauge (void)
01086 {
01087   strcpy (nbak.art, "");
01088   nbak.x = nbak.y = 0;
01089   memset (&powr, 0, sizeof(SMessage));
01090 }
01091 
01092 int CDigitalNeedleGauge::Read (SStream *stream, Tag tag)
01093 {
01094   int rc = TAG_IGNORED;
01095 
01096   switch (tag) {
01097   case 'nbak':
01098     ReadString (nbak.art, 64, stream);
01099     ReadInt (&nbak.x, stream);
01100     ReadInt (&nbak.y, stream);
01101     rc = TAG_READ;
01102     break;
01103 
01104   case 'powr':
01105     ReadMessage (&powr, stream);
01106     rc = TAG_READ;
01107     break;
01108   }
01109 
01110   if (rc == TAG_IGNORED) {
01111     rc = CNeedleGauge::Read (stream, tag);
01112   }
01113 
01114   if (rc == TAG_IGNORED) {
01115     char s[64];
01116     TagToString (s, tag);
01117     globals->logWarning->Write ("CDigitalNeedleGauge::Read : Unknown tag %s", s);
01118   }
01119 
01120   return rc;
01121 }
01122 
01123 
01124 //
01125 // CAltimeterGauge
01126 //
01127 CAltimeterGauge::CAltimeterGauge (void)
01128 {
01129   // Initialize members
01130   psiz_x = psiz_y = 0;
01131   strcpy (csrl_csr, "");
01132   strcpy (csrr_csr, "");
01133   csrl_tag = csrr_tag = 0;
01134   kpxy_x = kpxy_y = 0;
01135   memset (&kmsg, 0, sizeof(SMessage));
01136   ndl1 = ndl2 = ndl3 = NULL;
01137 }
01138 
01139 CAltimeterGauge::~CAltimeterGauge (void)
01140 {
01141   if (ndl1 != NULL) delete ndl1;
01142   if (ndl2 != NULL) delete ndl2;
01143   if (ndl3 != NULL) delete ndl3;
01144 }
01145 
01146 int CAltimeterGauge::Read (SStream *stream, Tag tag)
01147 {
01148   int rc = TAG_IGNORED;
01149 
01150   switch (tag) {
01151   case 'psiz':
01152     ReadInt (&psiz_x, stream);
01153     ReadInt (&psiz_y, stream);
01154     rc = TAG_READ;
01155     break;
01156 
01157   case 'ndl1':
01158     ndl1 = new CNeedleGauge;
01159     ReadFrom (ndl1, stream);
01160     rc = TAG_READ;
01161     break;
01162 
01163   case 'ndl2':
01164     ndl2 = new CNeedleGauge;
01165     ReadFrom (ndl2, stream);
01166     rc = TAG_READ;
01167     break;
01168 
01169   case 'ndl3':
01170     ndl3 = new CNeedleGauge;
01171     ReadFrom (ndl3, stream);
01172     rc = TAG_READ;
01173     break;
01174 
01175   case 'csrl':
01176     ReadString (csrl_csr, 64, stream);
01177     rc = TAG_READ;
01178     break;
01179 
01180   case 'csrr':
01181     ReadString (csrr_csr, 64, stream);
01182     rc = TAG_READ;
01183     break;
01184 
01185   case 'koll':
01186     ReadFrom (&koll, stream);
01187     rc = TAG_READ;
01188     break;
01189 
01190   case 'kpxy':
01191     ReadInt (&kpxy_x, stream);
01192     ReadInt (&kpxy_y, stream);
01193     rc = TAG_READ;
01194     break;
01195 
01196   case 'knob':
01197     ReadFrom (&knob, stream);
01198     break;
01199 
01200   case 'kmsg':
01201     ReadMessage (&kmsg, stream);
01202     rc = TAG_READ;
01203     break;
01204   }
01205 
01206   if (rc == TAG_IGNORED) {
01207     rc = CBitmapGauge::Read (stream, tag);
01208   }
01209 
01210   if (rc == TAG_IGNORED) {
01211     char s[64];
01212     TagToString (s, tag);
01213     globals->logWarning->Write ("CAltimeterGauge::Read : Unknown tag %s", s);
01214   }
01215 
01216   return rc;
01217 }
01218 
01219 ECursorResult CAltimeterGauge::MouseMoved (int x, int y)
01220 {
01221   ECursorResult rc = CURSOR_NOT_CHANGED;
01222 
01223   // Send updated mouse position to all click areas
01224   if (rc == CURSOR_NOT_CHANGED) rc = koll.MouseMoved (x, y);
01225   if (rc == CURSOR_NOT_CHANGED) rc = knob.MouseMoved (x, y);
01226 
01227   // Call parent method if cursor not changed
01228   if (rc == CURSOR_NOT_CHANGED) {
01229     rc = CBitmapGauge::MouseMoved (x, y);
01230   }
01231 
01232   return rc;
01233 }
01234 
01235 
01236 //
01237 // CRollingAltimeterGauge
01238 //
01239 CRollingAltimeterGauge::CRollingAltimeterGauge (void)
01240 {
01241   // Initialize members
01242   psiz_x = psiz_y = 0;
01243   strcpy (zdig_art, "");
01244   strcpy (ndig_art, "");
01245   digx[0] = digx[1] = digx[2] = digx[3] = 0;
01246   digy = 0;
01247   dsiz_x = dsiz_y = 0;
01248   memset (&kmsg, 0, sizeof(SMessage));
01249 }
01250 
01251 int CRollingAltimeterGauge::Read (SStream *stream, Tag tag)
01252 {
01253   int rc = TAG_IGNORED;
01254 
01255   switch (tag) {
01256   case 'psiz':
01257     ReadInt (&psiz_x, stream);
01258     ReadInt (&psiz_y, stream);
01259     rc = TAG_READ;
01260     break;
01261 
01262   case 'ndl1':
01263     ReadFrom (&ndl1, stream);
01264     rc = TAG_READ;
01265     break;
01266 
01267   case 'zdig':
01268     ReadString (zdig_art, 64, stream);
01269     rc = TAG_READ;
01270     break;
01271 
01272   case 'ndig':
01273     ReadString (ndig_art, 64, stream);
01274     rc = TAG_READ;
01275     break;
01276 
01277   case 'tdig':
01278     ReadString (tdig_art, 64, stream);
01279     rc = TAG_READ;
01280     break;
01281 
01282   case 'digx':
01283     ReadInt (&digx[0], stream);
01284     ReadInt (&digx[1], stream);
01285     ReadInt (&digx[2], stream);
01286     ReadInt (&digx[3], stream);
01287     rc = TAG_READ;
01288     break;
01289 
01290   case 'digy':
01291     ReadInt (&digy, stream);
01292     rc = TAG_READ;
01293     break;
01294 
01295   case 'dsiz':
01296     ReadInt (&dsiz_x, stream);
01297     ReadInt (&dsiz_y, stream);
01298     rc = TAG_READ;
01299     break;
01300 
01301   case 'koll':
01302     ReadFrom (&koll, stream);
01303     rc = TAG_READ;
01304     break;
01305 
01306   case 'knob':
01307     ReadFrom (&knob, stream);
01308     rc = TAG_READ;
01309     break;
01310 
01311   case 'kmsg':
01312     ReadMessage (&kmsg, stream);
01313     rc = TAG_READ;
01314     break;
01315   }
01316 
01317   if (rc == TAG_IGNORED) {
01318     rc = CBitmapGauge::Read (stream, tag);
01319   }
01320 
01321   if (rc == TAG_IGNORED) {
01322     char s[64];
01323     TagToString (s, tag);
01324     globals->logWarning->Write ("CRollingAltimeterGauge::Read : Unknown tag %s", s);
01325   }
01326 
01327   return rc;
01328 }
01329 
01330 ECursorResult CRollingAltimeterGauge::MouseMoved (int x, int y)
01331 {
01332   ECursorResult rc = CURSOR_NOT_CHANGED;
01333 
01334   // Send updated mouse position to all click areas
01335   if (rc == CURSOR_NOT_CHANGED) rc = koll.MouseMoved (x, y);
01336   if (rc == CURSOR_NOT_CHANGED) rc = knob.MouseMoved (x, y);
01337 
01338   // Call parent method if cursor not changed
01339   if (rc == CURSOR_NOT_CHANGED) {
01340     rc = CBitmapGauge::MouseMoved (x, y);
01341   }
01342 
01343   return rc;
01344 }
01345 
01346 
01347 
01348 //
01349 // CHorizonGauge
01350 //
01351 CHorizonGauge::CHorizonGauge (void)
01352 {
01353   hoff = 0;
01354   pixd = 0;
01355   moff = 0;
01356   strcpy (flag_art, "");
01357 }
01358 
01359 int CHorizonGauge::Read (SStream *stream, Tag tag)
01360 {
01361   int rc = TAG_IGNORED;
01362 
01363   switch (tag) {
01364   case 'foot':
01365     ReadString (foot.art, 64, stream);
01366     ReadInt (&foot.x, stream);
01367     ReadInt (&foot.y, stream);
01368     rc = TAG_READ;
01369     break;
01370 
01371   case 'horz':
01372     ReadString (horz.art, 64, stream);
01373     ReadInt (&horz.x, stream);
01374     ReadInt (&horz.y, stream);
01375     rc = TAG_READ;
01376     break;
01377 
01378   case 'hoff':
01379     ReadInt (&hoff, stream);
01380     rc = TAG_READ;
01381     break;
01382 
01383   case 'irim':
01384     ReadString (irim.art, 64, stream);
01385     ReadInt (&irim.x, stream);
01386     ReadInt (&irim.y, stream);
01387     rc = TAG_READ;
01388     break;
01389 
01390   case 'orim':
01391     ReadString (orim.art, 64, stream);
01392     ReadInt (&orim.x, stream);
01393     ReadInt (&orim.y, stream);
01394     rc = TAG_READ;
01395     break;
01396 
01397   case 'fron':
01398     ReadString (fron.art, 64, stream);
01399     ReadInt (&fron.x, stream);
01400     ReadInt (&fron.y, stream);
01401     rc = TAG_READ;
01402     break;
01403 
01404   case 'pixd':
01405     ReadFloat (&pixd, stream);
01406     rc = TAG_READ;
01407     break;
01408 
01409   case 'moff':
01410     ReadInt (&moff, stream);
01411     rc = TAG_READ;
01412     break;
01413 
01414   case 'knob':
01415     ReadFrom (&knob, stream);
01416     rc = TAG_READ;
01417     break;
01418 
01419   case 'flag':
01420     ReadString (flag_art, 64, stream);
01421     rc = TAG_READ;
01422     break;
01423 
01424   case 'pich':
01425     ReadMessage (&pich, stream);
01426     rc = TAG_READ;
01427     break;
01428 
01429   case 'roll':
01430     ReadMessage (&roll, stream);
01431     rc = TAG_READ;
01432     break;
01433   }
01434 
01435   if (rc == TAG_IGNORED) {
01436     rc = CBitmapGauge::Read (stream, tag);
01437   }
01438 
01439   if (rc == TAG_IGNORED) {
01440     char s[64];
01441     TagToString (s, tag);
01442     globals->logWarning->Write ("CHorizonGauge::Read : Unknown tag %s", s);
01443   }
01444 
01445   return rc;
01446 }
01447 
01448 ECursorResult CHorizonGauge::MouseMoved (int x, int y)
01449 {
01450   ECursorResult rc = CURSOR_NOT_CHANGED;
01451 
01452   // Send updated mouse position to all click areas
01453   if (rc == CURSOR_NOT_CHANGED) rc = knob.MouseMoved (x, y);
01454 
01455   // Call parent method if cursor not changed
01456   if (rc == CURSOR_NOT_CHANGED) {
01457     rc = CBitmapGauge::MouseMoved (x, y);
01458   }
01459 
01460   return rc;
01461 }
01462 
01463 
01464 //
01465 // CFDHorizonGauge
01466 //
01467 CFDHorizonGauge::CFDHorizonGauge (void)
01468 {
01469   strcpy (bars.art, "");
01470   bars.x = bars.y = 0;
01471 }
01472 
01473 
01474 int CFDHorizonGauge::Read (SStream *stream, Tag tag)
01475 {
01476   int rc = TAG_IGNORED;
01477 
01478   switch (tag) {
01479   case 'bars':
01480     ReadString (bars.art, 64, stream);
01481     ReadInt (&bars.x, stream);
01482     ReadInt (&bars.y, stream);
01483     rc = TAG_READ;
01484     break;
01485   }
01486 
01487   if (rc == TAG_IGNORED) {
01488     rc = CHorizonGauge::Read (stream, tag);
01489   }
01490 
01491   if (rc == TAG_IGNORED) {
01492     char s[64];
01493     TagToString (s, tag);
01494     globals->logWarning->Write ("CFDHorizonGauge::Read : Unknown tag %s", s);
01495   }
01496 
01497   return rc;
01498 }
01499 
01500 
01501 
01502 //
01503 // CHorizontalBallGauge
01504 //
01505 CHorizontalBallGauge::CHorizontalBallGauge (void)
01506 {
01507 }
01508 
01509 int CHorizontalBallGauge::Read (SStream *stream, Tag tag)
01510 {
01511   int rc = TAG_IGNORED;
01512 
01513   if (rc == TAG_IGNORED) {
01514     rc = CBitmapGauge::Read (stream, tag);
01515   }
01516 
01517   if (rc == TAG_IGNORED) {
01518     char s[64];
01519     TagToString (s, tag);
01520     globals->logWarning->Write ("CHorizontalBallGauge::Read : Unknown tag %s", s);
01521   }
01522 
01523   return rc;
01524 }
01525 
01526 
01527 //
01528 // CAirspeedGauge
01529 //
01530 CAirspeedGauge::CAirspeedGauge (void)
01531 {
01532 }
01533 
01534 int CAirspeedGauge::Read (SStream *stream, Tag tag)
01535 {
01536   int rc = TAG_IGNORED;
01537 
01538   switch (tag) {
01539   case 'knob':
01540     ReadFrom (&knob, stream);
01541     rc = TAG_READ;
01542     break;
01543 
01544   case 'mmo_':
01545     ReadFrom (&mmo_, stream);
01546     rc = TAG_READ;
01547     break;
01548   }
01549 
01550   if (rc == TAG_IGNORED) {
01551     rc = CNeedleGauge::Read (stream, tag);
01552   }
01553 
01554   if (rc == TAG_IGNORED) {
01555     char s[64];
01556     TagToString (s, tag);
01557     globals->logWarning->Write ("CAirspeedGauge::Read : Unknown tag %s", s);
01558   }
01559 
01560   return rc;
01561 }
01562 
01563 ECursorResult CAirspeedGauge::MouseMoved (int x, int y)
01564 {
01565   ECursorResult rc = CURSOR_NOT_CHANGED;
01566 
01567   // Send updated mouse position to all click areas
01568   if (rc == CURSOR_NOT_CHANGED) rc = knob.MouseMoved (x, y);
01569 
01570   // Call parent method if cursor not changed
01571   if (rc == CURSOR_NOT_CHANGED) {
01572     rc = CBitmapGauge::MouseMoved (x, y);
01573   }
01574 
01575   return rc;
01576 }
01577 
01578 
01579 //
01580 // CVerticalSpeedGauge
01581 //
01582 CVerticalSpeedGauge::CVerticalSpeedGauge (void)
01583 {
01584   strcpy (vsbg.art, "");
01585   vsbg.x = vsbg.y = 0;
01586   memset (&vmsg, 0, sizeof(SMessage));
01587   bmBug = NULL;
01588 }
01589 
01590 CVerticalSpeedGauge::~CVerticalSpeedGauge (void)
01591 {
01592   if (bmBug != NULL) {
01593     FreeBitmap (bmBug);
01594     delete bmBug;
01595   }
01596 }
01597 
01598 int CVerticalSpeedGauge::Read (SStream *stream, Tag tag)
01599 {
01600   int rc = TAG_IGNORED;
01601 
01602   switch (tag) {
01603   case 'vsbg':
01604     ReadString (vsbg.art, 64, stream);
01605     ReadInt (&vsbg.x, stream);
01606     ReadInt (&vsbg.y, stream);
01607     rc = TAG_READ;
01608     break;
01609 
01610   case 'vskb':
01611     ReadFrom (&vskb, stream);
01612     rc = TAG_READ;
01613     break;
01614 
01615   case 'vmsg':
01616     ReadMessage (&vmsg, stream);
01617     rc = TAG_READ;
01618     break;
01619   }
01620 
01621   if (rc == TAG_IGNORED) {
01622     rc = CNeedleGauge::Read (stream, tag);
01623   }
01624 
01625   if (rc == TAG_IGNORED) {
01626     char s[64];
01627     TagToString (s, tag);
01628     globals->logWarning->Write ("CVerticalSpeedGauge::Read : Unknown tag %s", s);
01629   }
01630 
01631   return rc;
01632 }
01633 
01634 void CVerticalSpeedGauge::ReadFinished (void)
01635 {
01636   if (strlen (vsbg.art) > 0) {
01637     strcpy (bmBug->bitmapName, "ART\\");
01638     strcat (bmBug->bitmapName, vsbg.art);
01639     LoadBitmap (bmBug);
01640   }
01641 
01642   CNeedleGauge::ReadFinished ();
01643 }
01644 
01645 ECursorResult CVerticalSpeedGauge::MouseMoved (int x, int y)
01646 {
01647   ECursorResult rc = CURSOR_NOT_CHANGED;
01648 
01649   // Send updated mouse position to all click areas
01650   if (rc == CURSOR_NOT_CHANGED) rc = vskb.MouseMoved (x, y);
01651 
01652   // Call parent method if cursor not changed
01653   if (rc == CURSOR_NOT_CHANGED) {
01654     rc = CBitmapGauge::MouseMoved (x, y);
01655   }
01656 
01657   return rc;
01658 }
01659 
01660 void CVerticalSpeedGauge::Draw (void)
01661 {
01662   // Draw vertical speed needle
01663   CNeedleGauge::Draw ();
01664 
01665   if (bmBug != NULL) {
01666     // Get vertical speed bug value
01667     vmsg.id = MSG_GETDATA;
01668     vmsg.dataType = TYPE_REAL;
01669     SendMessage (&vmsg);
01670     int frame = 0;
01671     if (vmsg.result == MSG_PROCESSED) {
01673     }
01674 
01675     DrawBitmap (surf, bmBug, vsbg.x, vsbg.y, frame);
01676   }
01677 }
01678 
01679 
01680 //
01681 // CDirectionalGyroGauge
01682 //
01683 CDirectionalGyroGauge::CDirectionalGyroGauge (void)
01684 {
01685   strcpy (apbg.art, "");
01686   apbg.x = apbg.y = 0;
01687 
01688   strcpy (apkb.art, "");
01689   apkb.x1 = apkb.y1 = apkb.x2 = apkb.y2 = 0;
01690 
01691   strcpy (knob.art, "");
01692   knob.x1 = knob.y1 = knob.x2 = knob.y2 = 0;
01693 }
01694 
01695 int CDirectionalGyroGauge::Read (SStream *stream, Tag tag)
01696 {
01697   int rc = TAG_IGNORED;
01698 
01699   switch (tag) {
01700   case 'apbg':
01701     ReadString (apbg.art, 64, stream);
01702     ReadInt (&apbg.x, stream);
01703     ReadInt (&apbg.y, stream);
01704     rc = TAG_READ;
01705     break;
01706 
01707   case 'apkb':
01708     ReadString (apkb.art, 64, stream);
01709     ReadInt (&apkb.x1, stream);
01710     ReadInt (&apkb.y1, stream);
01711     ReadInt (&apkb.x2, stream);
01712     ReadInt (&apkb.y2, stream);
01713     rc = TAG_READ;
01714     break;
01715 
01716   case 'knob':
01717     ReadString (knob.art, 64, stream);
01718     ReadInt (&knob.x1, stream);
01719     ReadInt (&knob.y1, stream);
01720     ReadInt (&knob.x2, stream);
01721     ReadInt (&knob.y2, stream);
01722     rc = TAG_READ;
01723     break;
01724 
01725   case 'bias':
01726     ReadTag (&bias, stream);
01727     rc = TAG_READ;
01728     break;
01729   }
01730 
01731   if (rc == TAG_IGNORED) {
01732     rc = CNeedleGauge::Read (stream, tag);
01733   }
01734 
01735   if (rc == TAG_IGNORED) {
01736     char s[64];
01737     TagToString (s, tag);
01738     globals->logWarning->Write ("CDirectionalGyroGauge::Read : Unknown tag %s", s);
01739   }
01740 
01741   return rc;
01742 }
01743 
01744 
01745 //
01746 // CVacuumGauge
01747 //
01748 CVacuumGauge::CVacuumGauge (void)
01749 {
01750 }
01751 
01752 int CVacuumGauge::Read (SStream *stream, Tag tag)
01753 {
01754   int rc = TAG_IGNORED;
01755 
01756   if (rc == TAG_IGNORED) {
01757     rc = CNeedleGauge::Read (stream, tag);
01758   }
01759 
01760   if (rc == TAG_IGNORED) {
01761     char s[64];
01762     TagToString (s, tag);
01763     globals->logWarning->Write ("CVacuumGauge::Read : Unknown tag %s", s);
01764   }
01765 
01766   return rc;
01767 }
01768 
01769 //
01770 // CSuctionGauge
01771 //
01772 CSuctionGauge::CSuctionGauge (void)
01773 {
01774 }
01775 
01776 int CSuctionGauge::Read (SStream *stream, Tag tag)
01777 {
01778   int rc = TAG_IGNORED;
01779 
01780   if (rc == TAG_IGNORED) {
01781     rc = CNeedleGauge::Read (stream, tag);
01782   }
01783 
01784   if (rc == TAG_IGNORED) {
01785     char s[64];
01786     TagToString (s, tag);
01787     globals->logWarning->Write ("CSuctionGauge::Read : Unknown tag %s", s);
01788   }
01789 
01790   return rc;
01791 }
01792 
01793 
01794 
01795 //
01796 // CFuelGauge
01797 //
01798 CFuelGauge::CFuelGauge (void)
01799 {
01800 }
01801 
01802 int CFuelGauge::Read (SStream *stream, Tag tag)
01803 {
01804   int rc = TAG_IGNORED;
01805 
01806   if (rc == TAG_IGNORED) {
01807     rc = CNeedleGauge::Read (stream, tag);
01808   }
01809 
01810   if (rc == TAG_IGNORED) {
01811     char s[64];
01812     TagToString (s, tag);
01813     globals->logWarning->Write ("CFuelGauge::Read : Unknown tag %s", s);
01814   }
01815 
01816   return rc;
01817 }
01818 
01819 
01820 //
01821 // CFuelFlowGauge
01822 //
01823 CFuelFlowGauge::CFuelFlowGauge (void)
01824 {
01825 }
01826 
01827 int CFuelFlowGauge::Read (SStream *stream, Tag tag)
01828 {
01829   int rc = TAG_IGNORED;
01830 
01831   if (rc == TAG_IGNORED) {
01832     rc = CNeedleGauge::Read (stream, tag);
01833   }
01834 
01835   if (rc == TAG_IGNORED) {
01836     char s[64];
01837     TagToString (s, tag);
01838     globals->logWarning->Write ("CFuelFlowGauge::Read : Unknown tag %s", s);
01839   }
01840 
01841   return rc;
01842 }
01843 
01844 
01845 
01846 //
01847 // COilPressureGauge
01848 //
01849 COilPressureGauge::COilPressureGauge (void)
01850 {
01851 }
01852 
01853 int COilPressureGauge::Read (SStream *stream, Tag tag)
01854 {
01855   int rc = TAG_IGNORED;
01856 
01857   if (rc == TAG_IGNORED) {
01858     rc = CNeedleGauge::Read (stream, tag);
01859   }
01860 
01861   if (rc == TAG_IGNORED) {
01862     char s[64];
01863     TagToString (s, tag);
01864     globals->logWarning->Write ("COilPressureGauge::Read : Unknown tag %s", s);
01865   }
01866 
01867   return rc;
01868 }
01869 
01870 
01871 //
01872 // COilTemperatureGauge
01873 //
01874 COilTemperatureGauge::COilTemperatureGauge (void)
01875 {
01876 }
01877 
01878 int COilTemperatureGauge::Read (SStream *stream, Tag tag)
01879 {
01880   int rc = TAG_IGNORED;
01881 
01882   if (rc == TAG_IGNORED) {
01883     rc = CNeedleGauge::Read (stream, tag);
01884   }
01885 
01886   if (rc == TAG_IGNORED) {
01887     char s[64];
01888     TagToString (s, tag);
01889     globals->logWarning->Write ("COilTemperatureGauge::Read : Unknown tag %s", s);
01890   }
01891 
01892   return rc;
01893 }
01894 
01895 
01896 //
01897 // CTachometerGauge
01898 //
01899 CTachometerGauge::CTachometerGauge (void)
01900 {
01901   hobb = false;
01902 }
01903 
01904 int CTachometerGauge::Read (SStream *stream, Tag tag)
01905 {
01906   int rc = TAG_IGNORED;
01907 
01908   switch (tag) {
01909   case 'hobb':
01911     SkipObject (stream);
01912     rc = TAG_READ;
01913     break;
01914   }
01915 
01916   if (rc == TAG_IGNORED) {
01917     rc = CNeedleGauge::Read (stream, tag);
01918   }
01919 
01920   if (rc == TAG_IGNORED) {
01921     char s[64];
01922     TagToString (s, tag);
01923     globals->logWarning->Write ("CTachometerGauge::Read : Unknown tag %s", s);
01924   }
01925 
01926   return rc;
01927 }
01928 
01929 
01930 //
01931 // CDualTachometerGauge
01932 //
01933 CDualTachometerGauge::CDualTachometerGauge (void)
01934 {
01935 }
01936 
01937 int CDualTachometerGauge::Read (SStream *stream, Tag tag)
01938 {
01939   int rc = TAG_IGNORED;
01940 
01941   if (rc == TAG_IGNORED) {
01942     rc = CTwoNeedleGauge::Read (stream, tag);
01943   }
01944 
01945   if (rc == TAG_IGNORED) {
01946     char s[64];
01947     TagToString (s, tag);
01948     globals->logWarning->Write ("CDualTachometerGauge::Read : Unknown tag %s", s);
01949   }
01950 
01951   return rc;
01952 }
01953 
01954 
01955 //
01956 // CN1TachometerGauge
01957 //
01958 CN1TachometerGauge::CN1TachometerGauge (void)
01959 {
01960 }
01961 
01962 int CN1TachometerGauge::Read (SStream *stream, Tag tag)
01963 {
01964   int rc = TAG_IGNORED;
01965 
01966   switch (tag) {
01967   case 'knob':
01968     ReadFrom (&knob, stream);
01969     rc = TAG_READ;
01970     break;
01971   }
01972 
01973   if (rc == TAG_IGNORED) {
01974     rc = CTwoNeedleGauge::Read (stream, tag);
01975   }
01976 
01977   if (rc == TAG_IGNORED) {
01978     char s[64];
01979     TagToString (s, tag);
01980     globals->logWarning->Write ("CN1TachometerGauge::Read : Unknown tag %s", s);
01981   }
01982 
01983   return rc;
01984 }
01985 
01986 ECursorResult CN1TachometerGauge::MouseMoved (int x, int y)
01987 {
01988   ECursorResult rc = CURSOR_NOT_CHANGED;
01989 
01990   // Send updated mouse position to all click areas
01991   if (rc == CURSOR_NOT_CHANGED) rc = knob.MouseMoved (x, y);
01992 
01993   // Call parent method if cursor not changed
01994   if (rc == CURSOR_NOT_CHANGED) {
01995     rc = CBitmapGauge::MouseMoved (x, y);
01996   }
01997 
01998   return rc;
01999 }
02000 
02001 
02002 //
02003 // CExhaustGasTemperatureGauge
02004 //
02005 CExhaustGasTemperatureGauge::CExhaustGasTemperatureGauge (void)
02006 {
02007   egtr = 0.0f;
02008   strcpy (egtn_art, "");
02009 }
02010 
02011 int CExhaustGasTemperatureGauge::Read (SStream *stream, Tag tag)
02012 {
02013   int rc = TAG_IGNORED;
02014 
02015   switch (tag) {
02016   case 'egtr':
02017     ReadFloat (&egtr, stream);
02018     rc = TAG_READ;
02019     break;
02020 
02021   case 'egtn':
02022     ReadString (egtn_art, 64, stream);
02023     rc = TAG_READ;
02024     break;
02025   }
02026 
02027   if (rc == TAG_IGNORED) {
02028     rc = CNeedleGauge::Read (stream, tag);
02029   }
02030 
02031   if (rc == TAG_IGNORED) {
02032     char s[64];
02033     TagToString (s, tag);
02034     globals->logWarning->Write ("CExhaustGasTemperatureGauge::Read : Unknown tag %s", s);
02035   }
02036 
02037   return rc;
02038 }
02039 
02040 
02041 //
02042 // CBasicCompassGauge
02043 //
02044 CBasicCompassGauge::CBasicCompassGauge (void)
02045 {
02046   strcpy (comp_art, "");
02047   wind = 0;
02048   orgx = 0;
02049   nton = 0;
02050 }
02051 
02052 int CBasicCompassGauge::Read (SStream *stream, Tag tag)
02053 {
02054   int rc = TAG_IGNORED;
02055 
02056   switch (tag) {
02057   case 'comp':
02058     ReadString (comp_art, 64, stream);
02059     rc = TAG_READ;
02060     break;
02061 
02062   case 'wind':
02063     ReadInt (&wind, stream);
02064     rc = TAG_READ;
02065     break;
02066 
02067   case 'orgx':
02068     ReadInt (&orgx, stream);
02069     rc = TAG_READ;
02070     break;
02071 
02072   case 'nton':
02073     ReadInt (&nton, stream);
02074     rc = TAG_READ;
02075     break;
02076   }
02077 
02078   if (rc == TAG_IGNORED) {
02079     rc = CBitmapGauge::Read (stream, tag);
02080   }
02081 
02082   if (rc == TAG_IGNORED) {
02083     char s[64];
02084     TagToString (s, tag);
02085     globals->logWarning->Write ("CBasicCompassGauge::Read : Unknown tag %s", s);
02086   }
02087 
02088   return rc;
02089 }
02090 
02091 
02092 //
02093 // CAnalogClockGauge
02094 //
02095 CAnalogClockGauge::CAnalogClockGauge (void)
02096 {
02097 }
02098 
02099 
02100 int CAnalogClockGauge::Read (SStream *stream, Tag tag)
02101 {
02102   int rc = TAG_IGNORED;
02103 
02104   if (rc == TAG_IGNORED) {
02105     rc = CTwoNeedleGauge::Read (stream, tag);
02106   }
02107 
02108   if (rc == TAG_IGNORED) {
02109     char s[64];
02110     TagToString (s, tag);
02111     globals->logWarning->Write ("CAnalogClockGauge::Read : Unknown tag %s", s);
02112   }
02113 
02114   return rc;
02115 }
02116 
02117 
02118 //
02119 // CAmmeterGauge
02120 //
02121 CAmmeterGauge::CAmmeterGauge (void)
02122 {
02123 }
02124 
02125 int CAmmeterGauge::Read (SStream *stream, Tag tag)
02126 {
02127   int rc = TAG_IGNORED;
02128 
02129   if (rc == TAG_IGNORED) {
02130     rc = CNeedleGauge::Read (stream, tag);
02131   }
02132 
02133   if (rc == TAG_IGNORED) {
02134     char s[64];
02135     TagToString (s, tag);
02136     globals->logWarning->Write ("CAmmeterGauge::Read : Unknown tag %s", s);
02137   }
02138 
02139   return rc;
02140 }
02141 
02142 
02143 //
02144 // CFlyhawkDigitalClockGauge
02145 //
02146 CFlyhawkDigitalClockGauge::CFlyhawkDigitalClockGauge (void)
02147 {
02148   oatd_x1 = oatd_y1 = oatd_x2 = oatd_y2 = 0;
02149   clkd_x1 = clkd_y1 = clkd_x2 = clkd_y2 = 0;
02150   ft13 = false;
02151   noco = false;
02152   cgap = 0;
02153   frgb_r = frgb_g = frgb_b = 240;
02154 }
02155 
02156 int CFlyhawkDigitalClockGauge::Read (SStream *stream, Tag tag)
02157 {
02158   int rc = TAG_IGNORED;
02159 
02160   switch (tag) {
02161   case 'oatd':
02162     ReadInt (&oatd_x1, stream);
02163     ReadInt (&oatd_y1, stream);
02164     ReadInt (&oatd_x2, stream);
02165     ReadInt (&oatd_y2, stream);
02166     rc = TAG_READ;
02167     break;
02168 
02169   case 'clkd':
02170     ReadInt (&clkd_x1, stream);
02171     ReadInt (&clkd_y1, stream);
02172     ReadInt (&clkd_x2, stream);
02173     ReadInt (&clkd_y2, stream);
02174     rc = TAG_READ;
02175     break;
02176 
02177   case 'bupp':
02178     ReadFrom (&bupp, stream);
02179     rc = TAG_READ;
02180     break;
02181 
02182   case 'bcon':
02183     ReadFrom (&bcon, stream);
02184     rc = TAG_READ;
02185     break;
02186 
02187   case 'bsel':
02188     ReadFrom (&bsel, stream);
02189     rc = TAG_READ;
02190     break;
02191 
02192   case 'bbot':
02193     ReadFrom (&bbot, stream);
02194     rc = TAG_READ;
02195     break;
02196 
02197   case 'ft13':
02198     {
02199       int i;
02200       ReadInt (&i, stream);
02201       ft13 = (i != 0);
02202     }
02203     rc = TAG_READ;
02204     break;
02205 
02206   case 'noco':
02207     {
02208       int i;
02209       ReadInt (&i, stream);
02210       noco = (i != 0);
02211     }
02212     rc = TAG_READ;
02213     break;
02214 
02215   case 'cgap':
02216     ReadInt (&cgap, stream);
02217     rc = TAG_READ;
02218     break;
02219 
02220   case 'frgb':
02221     ReadInt (&frgb_r, stream);
02222     ReadInt (&frgb_g, stream);
02223     ReadInt (&frgb_b, stream);
02224     rc = TAG_READ;
02225     break;
02226   }
02227 
02228   if (rc == TAG_IGNORED) {
02229     rc = CBitmapGauge::Read (stream, tag);
02230   }
02231 
02232   if (rc == TAG_IGNORED) {
02233     char s[64];
02234     TagToString (s, tag);
02235     globals->logWarning->Write ("CFlyhawkDigitalClockGauge::Read : Unknown tag %s", s);
02236   }
02237 
02238   return rc;
02239 }
02240 
02241 ECursorResult CFlyhawkDigitalClockGauge::MouseMoved (int x, int y)
02242 {
02243   ECursorResult rc = CURSOR_NOT_CHANGED;
02244 
02245   // Send updated mouse position to all click areas
02246   if (rc == CURSOR_NOT_CHANGED) rc = bupp.MouseMoved (x, y);
02247   if (rc == CURSOR_NOT_CHANGED) rc = bsel.MouseMoved (x, y);
02248   if (rc == CURSOR_NOT_CHANGED) rc = bcon.MouseMoved (x, y);
02249   if (rc == CURSOR_NOT_CHANGED) rc = bbot.MouseMoved (x, y);
02250 
02251   // Call parent method if cursor not changed
02252   if (rc == CURSOR_NOT_CHANGED) {
02253     rc = CBitmapGauge::MouseMoved (x, y);
02254   }
02255 
02256   return rc;
02257 }
02258 
02259 
02260 //
02261 // CBasicDigitalClockGauge
02262 //
02263 CBasicDigitalClockGauge::CBasicDigitalClockGauge (void)
02264 {
02265   tick_x = tick_y = 0;
02266   tkut = tklt = tkft = tket = 0;
02267 }
02268 
02269 int CBasicDigitalClockGauge::Read (SStream *stream, Tag tag)
02270 {
02271   int rc = TAG_IGNORED;
02272 
02273   switch (tag) {
02274   case 'tick':
02275     ReadInt (&tick_x, stream);
02276     ReadInt (&tick_y, stream);
02277     rc = TAG_READ;
02278     break;
02279 
02280   case 'tkut':
02281     ReadInt (&tkut, stream);
02282     rc = TAG_READ;
02283     break;
02284 
02285   case 'tklt':
02286     ReadInt (&tklt, stream);
02287     rc = TAG_READ;
02288     break;
02289 
02290   case 'tkft':
02291     ReadInt (&tkft, stream);
02292     rc = TAG_READ;
02293     break;
02294 
02295   case 'tket':
02296     ReadInt (&tket, stream);
02297     rc = TAG_READ;
02298     break;
02299   }
02300 
02301   if (rc == TAG_IGNORED) {
02302     rc = CFlyhawkDigitalClockGauge::Read (stream, tag);
02303   }
02304 
02305   if (rc == TAG_IGNORED) {
02306     char s[64];
02307     TagToString (s, tag);
02308     globals->logWarning->Write ("CBasicDigitalClockGauge::Read : Unknown tag %s", s);
02309   }
02310 
02311   return rc;
02312 }
02313 
02314 
02315 //
02316 // CBasicADFGauge
02317 //
02318 CBasicADFGauge::CBasicADFGauge (void)
02319 {
02320   comp_tag = 0;
02321 
02322   comp = NULL;
02323   knob = NULL;
02324   hdng = NULL;
02325 
02326   compass = 0;
02327 }
02328 
02329 CBasicADFGauge::~CBasicADFGauge (void)
02330 {
02331   if (comp != NULL) delete comp;
02332   if (knob != NULL) delete knob;
02333   if (hdng != NULL) delete hdng;
02334 }
02335 
02336 int CBasicADFGauge::Read (SStream *stream, Tag tag)
02337 {
02338   int rc = TAG_IGNORED;
02339 
02340   switch (tag) {
02341   case 'comp':
02342     ReadTag (&comp_tag, stream);
02343     comp = new CGaugeNeedle;
02344     ReadFrom (comp, stream);
02345     rc = TAG_READ;
02346     break;
02347 
02348   case 'knob':
02349     knob = new CGaugeKnob;
02350     ReadFrom (knob, stream);
02351     rc = TAG_READ;
02352     break;
02353 
02354   case 'hdng':
02355     hdng = new CGaugeNeedle;
02356     ReadFrom (hdng, stream);
02357     rc = TAG_READ;
02358     break;
02359   }
02360 
02361   if (rc == TAG_IGNORED) {
02362     rc = CNeedleGauge::Read (stream, tag);
02363   }
02364 
02365   if (rc == TAG_IGNORED) {
02366     char s[64];
02367     TagToString (s, tag);
02368     globals->logWarning->Write ("CBasicADFGaugeGauge::Read : Unknown tag %s", s);
02369   }
02370 
02371   return rc;
02372 }
02373 
02374 void CBasicADFGauge::ReadFinished (void)
02375 {
02376   CNeedleGauge::ReadFinished ();
02377 
02378   if (knob != NULL) knob->SetOffset (x, y);
02379 }
02380 
02381 ECursorResult CBasicADFGauge::MouseMoved (int x, int y)
02382 {
02383   ECursorResult rc = CURSOR_NOT_CHANGED;
02384 
02385   // Send updated mouse position to all click areas
02386   if (knob != NULL) {
02387     if (rc == CURSOR_NOT_CHANGED) rc = knob->MouseMoved (x, y);
02388   }
02389 
02390   // Call parent method if cursor not changed
02391   if (rc == CURSOR_NOT_CHANGED) {
02392     rc = CNeedleGauge::MouseMoved (x, y);
02393   }
02394 
02395   return rc;
02396 }
02397 
02398 EClickResult CBasicADFGauge::MouseClick (int x, int y, int buttons)
02399 {
02400   EClickResult rc = MOUSE_TRACKING_OFF;
02401 
02402   // Only handle left/right mouse clicks
02403   if ((buttons & (MOUSE_BUTTON_LEFT | MOUSE_BUTTON_RIGHT)) == 0) {
02404     return rc;
02405   }
02406 
02407   if (knob != NULL) {
02408     if (knob->IsHit(x, y)) {
02409       // Increment/Decrement compass card setting
02411       if (buttons & MOUSE_BUTTON_LEFT) {
02412         compass = Wrap360 (compass - 1.0f);
02413       } else {
02414         compass = Wrap360 (compass + 1.0f);
02415       }
02416     }
02417   }
02418 
02419   return rc;
02420 }
02421 
02422 void CBasicADFGauge::Draw (void)
02423 {
02424   ClearSurface ();
02425   DrawUnderlay ();
02426 
02427   // Get navaid pointer from ADF radio
02428   mesg.id = MSG_GETDATA;
02429   mesg.user.u.datatag = 'navd';
02430   SendMessage (&mesg);
02431   float navd = mesg.realData;
02432 
02433   // Draw compass card
02434   if (comp != NULL) comp->Draw (surf, compass, cx, cy);
02435 
02436   // Draw default needle, ADF direction finder
02437   nedl.Draw (surf, navd, cx, cy);
02438 
02439   // Draw heading pointer (not used in any default aircraft?)
02440   if (hdng != NULL) hdng->Draw (surf, navd, cx, cy);
02441 
02442   // Draw knob surface, one knob rotation per 30 degrees?
02443   float degPerRev = 30.0f;
02444   if (knob != NULL) knob->Draw (fmodf(compass, degPerRev) / degPerRev);
02445 
02446   DrawOverlay ();
02447 }
02448 
02449 void CBasicADFGauge::Blit (int xOffset, int yOffset, int y_isiz)
02450 {
02451   BlitSurface (surf, xOffset, yOffset, y_isiz);
02452   BlitSurface (knob->surf, xOffset, yOffset, y_isiz);
02453 }
02454 
02455 
02456 //
02457 // CDigitalReadoutGauge
02458 //
02459 CDigitalReadoutGauge::CDigitalReadoutGauge (void)
02460 {
02461   maxd = 0;
02462   strcpy (wdig_art, "");
02463   strcpy (fdig_art, "");
02464   digY = 0;
02465   num_digX = 0;
02466   digX = NULL;
02467   whol = false;
02468   padz = false;
02469 }
02470 
02471 int CDigitalReadoutGauge::Read (SStream *stream, Tag tag)
02472 {
02473   int rc = TAG_IGNORED;
02474 
02475   switch (tag) {
02476   case 'maxd':
02477     ReadInt (&maxd, stream);
02478     rc = TAG_READ;
02479     break;
02480 
02481   case 'wdig':
02482     ReadString (wdig_art, 64, stream);
02483     rc = TAG_READ;
02484     break;
02485 
02486   case 'fdig':
02487     ReadString (fdig_art, 64, stream);
02488     rc = TAG_READ;
02489     break;
02490 
02491   case 'digY':
02492     ReadInt (&digY, stream);
02493     rc = TAG_READ;
02494     break;
02495 
02496   case 'digX':
02497     {
02498       ReadInt (&num_digX, stream);
02499       digX = new int[num_digX];
02500       for (int i=0; i<num_digX; i++) {
02501         ReadInt (&digX[i], stream);
02502       }
02503     }
02504     rc = TAG_READ;
02505     break;
02506 
02507   case 'whol':
02508     {
02509       int i;
02510       ReadInt (&i, stream);
02511       whol = (i != 0);
02512     }
02513     rc = TAG_READ;
02514     break;
02515 
02516   case 'padz':
02517     {
02518       int i;
02519       ReadInt (&i, stream);
02520       padz = (i != 0);
02521     }
02522     rc = TAG_READ;
02523     break;
02524   }
02525 
02526   if (rc == TAG_IGNORED) {
02527     rc = CGauge::Read (stream, tag);
02528   }
02529 
02530   if (rc == TAG_IGNORED) {
02531     char s[64];
02532     TagToString (s, tag);
02533     globals->logWarning->Write ("CDigitalReadoutGauge::Read : Unknown tag %s", s);
02534   }
02535 
02536   return rc;
02537 }
02538 
02539 
02540 //
02541 // CDigitsReadoutGauge
02542 //
02543 CDigitsReadoutGauge::CDigitsReadoutGauge (void)
02544 {
02545   frgb_r = frgb_g = frgb_b = 240;
02546   strcpy (just, "");
02547 }
02548 
02549 int CDigitsReadoutGauge::Read (SStream *stream, Tag tag)
02550 {
02551   int rc = TAG_IGNORED;
02552 
02553   switch (tag) {
02554   case 'frgb':
02555     ReadInt (&frgb_r, stream);
02556     ReadInt (&frgb_g, stream);
02557     ReadInt (&frgb_b, stream);
02558     rc = TAG_READ;
02559     break;
02560 
02561   case 'just':
02562     ReadString (just, 64, stream);
02563     rc = TAG_READ;
02564     break;
02565   }
02566 
02567   if (rc == TAG_IGNORED) {
02568     rc = CGauge::Read (stream, tag);
02569   }
02570 
02571   if (rc == TAG_IGNORED) {
02572     char s[64];
02573     TagToString (s, tag);
02574     globals->logWarning->Write ("CDigitsReadoutGauge::Read : Unknown tag %s", s);
02575   }
02576 
02577   return rc;
02578 }
02579 
02580 
02581 //
02582 // CCabinPressureRateKnobGauge
02583 //
02584 CCabinPressureRateKnobGauge::CCabinPressureRateKnobGauge (void)
02585 {
02586   ofxy_x = ofxy_y = 0;
02587   alti_min = alti_max = 0;
02588   rate_min = rate_max = 0;
02589   strcpy (onsf, "");
02590   strcpy (ofsf, "");
02591 }
02592 
02593 
02594 int CCabinPressureRateKnobGauge::Read (SStream *stream, Tag tag)
02595 {
02596   int rc = TAG_IGNORED;
02597 
02598   switch (tag) {
02599   case 'ofxy':
02600     ReadInt (&ofxy_x, stream);
02601     ReadInt (&ofxy_y, stream);
02602     rc = TAG_READ;
02603     break;
02604 
02605   case 'alti':
02606     ReadFloat (&alti_min, stream);
02607     ReadFloat (&alti_max, stream);
02608     rc = TAG_READ;
02609     break;
02610 
02611   case 'rate':
02612     ReadFloat (&rate_min, stream);
02613     ReadFloat (&rate_max, stream);
02614     rc = TAG_READ;
02615     break;
02616 
02617   case 'cabn':
02618     ReadFrom (&cabn, stream);
02619     rc = TAG_READ;
02620     break;
02621 
02622   case 'knob':
02623     ReadFrom (&knob, stream);
02624     rc = TAG_READ;
02625     break;
02626 
02627   case 'onsf':
02628     ReadString (onsf, 64, stream);
02629     rc = TAG_READ;
02630     break;
02631 
02632   case 'ofsf':
02633     ReadString (ofsf, 64, stream);
02634     rc = TAG_READ;
02635     break;
02636   }
02637 
02638   if (rc == TAG_IGNORED) {
02639     rc = CBitmapGauge::Read (stream, tag);
02640   }
02641 
02642   if (rc == TAG_IGNORED) {
02643     char s[64];
02644     TagToString (s, tag);
02645     globals->logWarning->Write ("CCabinPressureRateKnobGauge::Read : Unknown tag %s", s);
02646   }
02647 
02648   return rc;
02649 }
02650 
02651 ECursorResult CCabinPressureRateKnobGauge::MouseMoved (int x, int y)
02652 {
02653   ECursorResult rc = CURSOR_NOT_CHANGED;
02654 
02655   // Send updated mouse position to all click areas
02656   if (rc == CURSOR_NOT_CHANGED) rc = cabn.MouseMoved (x, y);
02657   if (rc == CURSOR_NOT_CHANGED) rc = knob.MouseMoved (x, y);
02658 
02659   // Call parent method if cursor not changed
02660   if (rc == CURSOR_NOT_CHANGED) {
02661     rc = CBitmapGauge::MouseMoved (x, y);
02662   }
02663 
02664   return rc;
02665 }
02666 
02667 
02668 //
02669 // CCabinPressureGauge
02670 //
02671 CCabinPressureGauge::CCabinPressureGauge (void)
02672 {
02673 }
02674 
02675 int CCabinPressureGauge::Read (SStream *stream, Tag tag)
02676 {
02677   int rc = TAG_IGNORED;
02678 
02679   switch (tag) {
02680   case 'alti':
02681     ReadFrom (&alti, stream);
02682     rc = TAG_READ;
02683     break;
02684 
02685   case 'diff':
02686     ReadFrom (&diff, stream);
02687     rc = TAG_READ;
02688     break;
02689 
02690   case 'rate':
02691     ReadFrom (&rate, stream);
02692     rc = TAG_READ;
02693     break;
02694   }
02695 
02696   if (rc == TAG_IGNORED) {
02697     rc = CNeedleGauge::Read (stream, tag);
02698   }
02699 
02700   if (rc == TAG_IGNORED) {
02701     char s[64];
02702     TagToString (s, tag);
02703     globals->logWarning->Write ("CCabinPressureGauge::Read : Unknown tag %s", s);
02704   }
02705 
02706   return rc;
02707 }
02708 
02709 
02710 //
02711 // CBrakePressureGauge
02712 //
02713 CBrakePressureGauge::CBrakePressureGauge (void)
02714 {
02715 }
02716 
02717 int CBrakePressureGauge::Read (SStream *stream, Tag tag)
02718 {
02719   int rc = TAG_IGNORED;
02720 
02721   switch (tag) {
02722   case 'left':
02723     ReadFrom (&left, stream);
02724     rc = TAG_READ;
02725     break;
02726 
02727   case 'rght':
02728     ReadFrom (&rght, stream);
02729     rc = TAG_READ;
02730     break;
02731   }
02732 
02733   if (rc == TAG_IGNORED) {
02734     rc = CTwoNeedleGauge::Read (stream, tag);
02735   }
02736 
02737   if (rc == TAG_IGNORED) {
02738     char s[64];
02739     TagToString (s, tag);
02740     globals->logWarning->Write ("CBrakePressureGauge::Read : Unknown tag %s", s);
02741   }
02742 
02743   return rc;
02744 }
02745 
02746 ECursorResult CBrakePressureGauge::MouseMoved (int x, int y)
02747 {
02748   ECursorResult rc = CURSOR_NOT_CHANGED;
02749 
02750   // Send updated mouse position to all click areas
02751   if (rc == CURSOR_NOT_CHANGED) rc = left.MouseMoved (x, y);
02752   if (rc == CURSOR_NOT_CHANGED) rc = rght.MouseMoved (x, y);
02753 
02754   // Call parent method if cursor not changed
02755   if (rc == CURSOR_NOT_CHANGED) {
02756     rc = CBitmapGauge::MouseMoved (x, y);
02757   }
02758 
02759   return rc;
02760 }
02761 
02762 
02763 //
02764 // CAOANeedleGauge
02765 //
02766 CAOANeedleGauge::CAOANeedleGauge (void)
02767 {
02768 }
02769 
02770 int CAOANeedleGauge::Read (SStream *stream, Tag tag)
02771 {
02772   int rc = TAG_IGNORED;
02773 
02774   switch (tag) {
02775   case 'knob':
02776     ReadFrom (&knob, stream);
02777     rc = TAG_READ;
02778     break;
02779   }
02780 
02781   if (rc == TAG_IGNORED) {
02782     rc = CTwoNeedleGauge::Read (stream, tag);
02783   }
02784 
02785   if (rc == TAG_IGNORED) {
02786     char s[64];
02787     TagToString (s, tag);
02788     globals->logWarning->Write ("CAOANeedleGauge::Read : Unknown tag %s", s);
02789   }
02790 
02791   return rc;
02792 }
02793 
02794 ECursorResult CAOANeedleGauge::MouseMoved (int x, int y)
02795 {
02796   ECursorResult rc = CURSOR_NOT_CHANGED;
02797 
02798   // Send updated mouse position to all click areas
02799   if (rc == CURSOR_NOT_CHANGED) rc = knob.MouseMoved (x, y);
02800 
02801   // Call parent method if cursor not changed
02802   if (rc == CURSOR_NOT_CHANGED) {
02803     rc = CBitmapGauge::MouseMoved (x, y);
02804   }
02805 
02806   return rc;
02807 }
02808 
02809 
02810 //
02811 // CTurnCoordinatorGauge
02812 //
02813 CTurnCoordinatorGauge::CTurnCoordinatorGauge (void)
02814 {
02815   strcpy (plan_art, "");
02816   poff_x = poff_y = 0;
02817   strcpy (ball_art, "");
02818   boff_x = boff_y = 0;
02819   pcon = bcon = 0;
02820   Ltrn = Rtrn = 0;
02821 }
02822 
02823 int CTurnCoordinatorGauge::Read (SStream *stream, Tag tag)
02824 {
02825   int rc = TAG_IGNORED;
02826 
02827   switch (tag) {
02828   case 'plan':
02829     ReadString (plan_art, 64, stream);
02830     rc = TAG_READ;
02831     break;
02832 
02833   case 'poff':
02834     ReadInt (&poff_x, stream);
02835     ReadInt (&poff_y, stream);
02836     rc = TAG_READ;
02837     break;
02838 
02839   case 'ball':
02840     ReadString (ball_art, 64, stream);
02841     rc = TAG_READ;
02842     break;
02843 
02844   case 'boff':
02845     ReadInt (&boff_x, stream);
02846     ReadInt (&boff_y, stream);
02847     rc = TAG_READ;
02848     break;
02849 
02850   case 'pcon':
02851     ReadTag (&pcon, stream);
02852     rc = TAG_READ;
02853     break;
02854 
02855   case 'bcon':
02856     ReadTag (&bcon, stream);
02857     rc = TAG_READ;
02858     break;
02859 
02860   case 'Ltrn':
02861     ReadInt (&Ltrn, stream);
02862     rc = TAG_READ;
02863     break;
02864 
02865   case 'Rtrn':
02866     ReadInt (&Rtrn, stream);
02867     rc = TAG_READ;
02868     break;
02869   }
02870 
02871   if (rc == TAG_IGNORED) {
02872     rc = CBitmapGauge::Read (stream, tag);
02873   }
02874 
02875   if (rc == TAG_IGNORED) {
02876     char s[64];
02877     TagToString (s, tag);
02878     globals->logWarning->Write ("CTurnCoordinatorGauge::Read : Unknown tag %s", s);
02879   }
02880 
02881   return rc;
02882 }
02883 
02884 //
02885 // CHSIGauge
02886 //
02887 CHSIGauge::CHSIGauge (void)
02888 {
02889   rang_min = 0;
02890   rang_max = 360;
02891   memset (&obsm, 0, sizeof(SMessage));
02892   memset (&bugm, 0, sizeof(SMessage));
02893   memset (&fcs, 0, sizeof(SMessage));
02894   radi_tag = 0;
02895   radi_unit = 0;
02896   gsdf = 0;
02897 }
02898 
02899 int CHSIGauge::Read (SStream *stream, Tag tag)
02900 {
02901   int rc = TAG_IGNORED;
02902 
02903   switch (tag) {
02904   case 'comp':
02905     ReadString (comp.art, 64, stream);
02906     ReadInt (&comp.x, stream);
02907     ReadInt (&comp.y, stream);
02908     rc = TAG_READ;
02909     break;
02910 
02911   case 'cour':
02912     ReadString (cour.art, 64, stream);
02913     ReadInt (&cour.x, stream);
02914     ReadInt (&cour.y, stream);
02915     rc = TAG_READ;
02916     break;
02917 
02918   case 'devi':
02919     ReadString (devi.art, 64, stream);
02920     ReadInt (&devi.x, stream);
02921     ReadInt (&devi.y, stream);
02922     rc = TAG_READ;
02923     break;
02924 
02925   case 'devb':
02926     ReadString (devb.art, 64, stream);
02927     ReadInt (&devb.x, stream);
02928     ReadInt (&devb.y, stream);
02929     rc = TAG_READ;
02930     break;
02931 
02932   case 'apbg':
02933     ReadString (apbg.art, 64, stream);
02934     ReadInt (&apbg.x, stream);
02935     ReadInt (&apbg.y, stream);
02936     rc = TAG_READ;
02937     break;
02938 
02939   case 'to__':
02940     ReadString (to.art, 64, stream);
02941     ReadInt (&to.x, stream);
02942     ReadInt (&to.y, stream);
02943     rc = TAG_READ;
02944     break;
02945 
02946   case 'from':
02947     ReadString (from.art, 64, stream);
02948     ReadInt (&from.x, stream);
02949     ReadInt (&from.y, stream);
02950     rc = TAG_READ;
02951     break;
02952 
02953   case 'glid':
02954     ReadString (glid.art, 64, stream);
02955     ReadInt (&glid.x, stream);
02956     ReadInt (&glid.y, stream);
02957     rc = TAG_READ;
02958     break;
02959 
02960   case 'knob':
02961     ReadFrom (&knob, stream);
02962     rc = TAG_READ;
02963     break;
02964 
02965   case 'apkb':
02966     ReadFrom (&apkb, stream);
02967     rc = TAG_READ;
02968     break;
02969 
02970   case 'obsm':
02971     ReadMessage (&obsm, stream);
02972     rc = TAG_READ;
02973     break;
02974 
02975   case 'bugm':
02976     ReadMessage (&bugm, stream);
02977     rc = TAG_READ;
02978     break;
02979 
02980   case 'fcs_':
02981     ReadMessage (&fcs, stream);
02982     rc = TAG_READ;
02983     break;
02984 
02985   case 'rang':
02986     ReadFloat (&rang_min, stream);
02987     ReadFloat (&rang_max, stream);
02988     rc = TAG_READ;
02989     break;
02990 
02991   case 'radi':
02992     ReadTag (&radi_tag, stream);
02993     ReadInt (&radi_unit, stream);
02994     rc = TAG_READ;
02995     break;
02996 
02997   case 'gsdf':
02998     ReadFloat (&gsdf, stream);
02999     rc = TAG_READ;
03000     break;
03001   }
03002 
03003   if (rc == TAG_IGNORED) {
03004     rc = CBitmapGauge::Read (stream, tag);
03005   }
03006 
03007   if (rc == TAG_IGNORED) {
03008     char s[64];
03009     TagToString (s, tag);
03010     globals->logWarning->Write ("CHSIGauge::Read : Unknown tag %s", s);
03011   }
03012 
03013   return rc;
03014 }
03015 
03016 ECursorResult CHSIGauge::MouseMoved (int x, int y)
03017 {
03018   ECursorResult rc = CURSOR_NOT_CHANGED;
03019 
03020   // Send updated mouse position to all click areas
03021   if (rc == CURSOR_NOT_CHANGED) rc = knob.MouseMoved (x, y);
03022   if (rc == CURSOR_NOT_CHANGED) rc = apkb.MouseMoved (x, y);
03023 
03024   // Call parent method if cursor not changed
03025   if (rc == CURSOR_NOT_CHANGED) {
03026     rc = CBitmapGauge::MouseMoved (x, y);
03027   }
03028 
03029   return rc;
03030 }
03031 
03032 
03033 //
03034 // CFlyhawkELTGauge
03035 //
03036 CFlyhawkELTGauge::CFlyhawkELTGauge (void)
03037 {
03038   strcpy (ulit_art, "");
03039   strcpy (lit_art, "");
03040   strcpy (csru_csr, "");
03041   strcpy (csrd_csr, "");
03042   strcpy (sfxu_wav, "");
03043   strcpy (sfxd_wav, "");
03044 }
03045 
03046 int CFlyhawkELTGauge::Read (SStream *stream, Tag tag)
03047 {
03048   int rc = TAG_IGNORED;
03049 
03050   switch (tag) {
03051   case 'ulit':
03052     ReadString (ulit_art, 64, stream);
03053     rc = TAG_READ;
03054     break;
03055 
03056   case 'lit ':
03057     ReadString (lit_art, 64, stream);
03058     rc = TAG_READ;
03059     break;
03060 
03061   case 'csru':
03062     ReadString (csru_csr, 64, stream);
03063     rc = TAG_READ;
03064     break;
03065 
03066   case 'csrd':
03067     ReadString (csrd_csr, 64, stream);
03068     rc = TAG_READ;
03069     break;
03070 
03071   case 'sfxu':
03072     ReadString (sfxu_wav, 64, stream);
03073     rc = TAG_READ;
03074     break;
03075 
03076   case 'sfxd':
03077     ReadString (sfxd_wav, 64, stream);
03078     rc = TAG_READ;
03079     break;
03080   }
03081   
03082   if (rc == TAG_IGNORED) {
03083     rc = CBitmapGauge::Read (stream, tag);
03084   }
03085 
03086   if (rc == TAG_IGNORED) {
03087     char s[64];
03088     TagToString (s, tag);
03089     globals->logWarning->Write ("CFlyhawkELTGauge::Read : Unknown tag %s", s);
03090   }
03091 
03092   return rc;
03093 }
03094 
03095 
03096 
03097 //
03098 // CSlipIndicatorGauge
03099 //
03100 CSlipIndicatorGauge::CSlipIndicatorGauge (void)
03101 {
03102   strcpy (ball_art, "");
03103 }
03104 
03105 
03106 int CSlipIndicatorGauge::Read (SStream *stream, Tag tag)
03107 {
03108   int rc = TAG_IGNORED;
03109 
03110   switch (tag) {
03111   case 'ball':
03112     ReadString (ball_art, 64, stream);
03113     rc = TAG_READ;
03114     break;
03115   }
03116 
03117   if (rc == TAG_IGNORED) {
03118     rc = CBitmapGauge::Read (stream, tag);
03119   }
03120 
03121   if (rc == TAG_IGNORED) {
03122     char s[64];
03123     TagToString (s, tag);
03124     globals->logWarning->Write ("CHSIGauge::Read : Unknown tag %s", s);
03125   }
03126 
03127   return rc;
03128 }
03129 
03130 
03131 
03132 //
03133 // CHobbsMeterGauge
03134 //
03135 CHobbsMeterGauge::CHobbsMeterGauge (void)
03136 {
03137   strcpy (blak_art, "");
03138   strcpy (whit_art, "");
03139 }
03140 
03141 
03142 int CHobbsMeterGauge::Read (SStream *stream, Tag tag)
03143 {
03144   int rc = TAG_IGNORED;
03145 
03146   switch (tag) {
03147   case 'blak':
03148     ReadString (blak_art, 64, stream);
03149     rc = TAG_READ;
03150     break;
03151 
03152   case 'whit':
03153     ReadString (whit_art, 64, stream);
03154     rc = TAG_READ;
03155     break;
03156   }
03157 
03158   if (rc == TAG_IGNORED) {
03159     rc = CGauge::Read (stream, tag);
03160   }
03161 
03162   if (rc == TAG_IGNORED) {
03163     char s[64];
03164     TagToString (s, tag);
03165     globals->logWarning->Write ("CHobbsMeterGauge::Read : Unknown tag %s", s);
03166   }
03167 
03168   return rc;
03169 }
03170 
03171 
03172 //
03173 // CNavigationGauge
03174 //
03175 CNavigationGauge::CNavigationGauge (void)
03176 {
03177   // Subsystem message
03178   radi_tag = 0;
03179   radi_unit = 0;
03180   // Compass card needle
03181   comp_tag = 0;
03182   // Localizer needle
03183   strcpy (lndl.art, "");
03184   lndl.x = lndl.y = 0;
03185   // Glideslope needle
03186   strcpy (gndl.art, "");
03187   gndl.x = gndl.y = 0;
03188 
03189   // OBS
03190   strcpy (obs.art, "");
03191   obs.x1 = obs.y1 = obs.x2 = obs.y2 = 0;
03192 
03193   obsSetting = 0;
03194   obsKnobClick = false;
03195 
03196   // To/From flags
03197   strcpy (wtab_art, "");
03198   strcpy (ttab_art, "");
03199   strcpy (ftab_art, "");
03200   ntpl_x = ntpl_y = 0;
03201   gspl_x = gspl_y = 0;
03202   memset (&fcs, 0, sizeof(SMessage));
03203 
03204   // Initialize surfaces
03205   surfObsKnob = NULL;
03206 
03207   // Initialize bitmaps
03208   bmObsKnob = NULL;
03209   nObsKnobFrames = 0;
03210   bmLocalizer = NULL;
03211   bmGlideslope = NULL;
03212   bmWarnTab = NULL;
03213   bmFromTab = NULL;
03214   bmToTab = NULL;
03215 }
03216 
03217 CNavigationGauge::~CNavigationGauge (void)
03218 {
03219   if (bmObsKnob != NULL) {
03220     FreeBitmap (bmObsKnob);
03221     delete bmObsKnob;
03222   }
03223   if (bmLocalizer != NULL) {
03224     FreeBitmap (bmLocalizer);
03225     delete bmLocalizer;
03226   }
03227   if (bmGlideslope != NULL) {
03228     FreeBitmap (bmGlideslope);
03229     delete bmGlideslope;
03230   }
03231   if (bmWarnTab != NULL) {
03232     FreeBitmap (bmWarnTab);
03233     delete bmWarnTab;
03234   }
03235   if (bmFromTab != NULL) {
03236     FreeBitmap (bmFromTab);
03237     delete bmFromTab;
03238   }
03239   if (bmToTab != NULL) {
03240     FreeBitmap (bmToTab);
03241     delete bmToTab;
03242   }
03243 }
03244 
03245 int CNavigationGauge::Read (SStream *stream, Tag tag)
03246 {
03247   int rc = TAG_IGNORED;
03248 
03249   switch (tag) {
03250   case 'comp':
03251     ReadTag (&comp_tag, stream);
03252     ReadFrom (&comp_ndl, stream);
03253     rc = TAG_READ;
03254     break;
03255 
03256   case 'lndl':
03257     ReadString (lndl.art, 64, stream);
03258     ReadInt (&lndl.x, stream);
03259     ReadInt (&lndl.y, stream);
03260     rc = TAG_READ;
03261     break;
03262 
03263   case 'gndl':
03264     ReadString (gndl.art, 64, stream);
03265     ReadInt (&gndl.x, stream);
03266     ReadInt (&gndl.y, stream);
03267     rc = TAG_READ;
03268     break;
03269 
03270   case 'obs_':
03271     ReadString (obs.art, 64, stream);
03272     ReadInt (&obs.x1, stream);
03273     ReadInt (&obs.y1, stream);
03274     ReadInt (&obs.x2, stream);
03275     ReadInt (&obs.y2, stream);
03276     rc = TAG_READ;
03277     break;
03278 
03279   case 'wtab':
03280     ReadString (wtab_art, 64, stream);
03281     rc = TAG_READ;
03282     break;
03283 
03284   case 'ttab':
03285     ReadString (ttab_art, 64, stream);
03286     rc = TAG_READ;
03287     break;
03288 
03289   case 'ftab':
03290     ReadString (ftab_art, 64, stream);
03291     rc = TAG_READ;
03292     break;
03293 
03294   case 'ntpl':
03295     ReadInt (&ntpl_x, stream);
03296     ReadInt (&ntpl_y, stream);
03297     rc = TAG_READ;
03298     break;
03299 
03300   case 'gspl':
03301     ReadInt (&gspl_x, stream);
03302     ReadInt (&gspl_y, stream);
03303     rc = TAG_READ;
03304     break;
03305 
03306   case 'radi':
03307     ReadTag (&radi_tag, stream);
03308     ReadInt (&radi_unit, stream);
03309     rc = TAG_READ;
03310     break;
03311 
03312   case 'fcs_':
03313     ReadMessage (&fcs, stream);
03314     rc = TAG_READ;
03315     break;
03316   }
03317 
03318   if (rc == TAG_IGNORED) {
03319     rc = CBitmapGauge::Read (stream, tag);
03320   }
03321 
03322   if (rc == TAG_IGNORED) {
03323     char s[64];
03324     TagToString (s, tag);
03325     globals->logWarning->Write ("CNavigationGauge::Read : Unknown tag %s", s);
03326   }
03327 
03328   return rc;
03329 }
03330 
03331 void CNavigationGauge::ReadFinished ()
03332 {
03333   CBitmapGauge::ReadFinished ();
03334 
03335   // Initialize message attributes
03336   mesg.group = radi_tag;
03337   mesg.user.u.unit = radi_unit;
03338 
03339   if (strlen (obs.art) > 0) {
03340     // Create surface for OBS knob
03341     surfObsKnob = CreateSurface ((obs.x2 - obs.x1) + 1, (obs.y2 - obs.y1) + 1);
03342     surfObsKnob->xScreen = obs.x1 + x;
03343     surfObsKnob->yScreen = obs.y1 + y;
03344 
03345     // Load OBS knob bitmap
03346     bmObsKnob = new SBitmap;
03347     strcpy (bmObsKnob->bitmapName, "ART\\");
03348     strcat (bmObsKnob->bitmapName, obs.art);
03349     LoadBitmap (bmObsKnob);
03350     nObsKnobFrames = NumBitmapFrames (bmObsKnob);
03351   }
03352 
03353   if (strlen (lndl.art) > 0) {
03354     // Load localizer needle bitmap
03355     bmLocalizer = new SBitmap;
03356     strcpy (bmLocalizer->bitmapName, "ART\\");
03357     strcat (bmLocalizer->bitmapName, lndl.art);
03358     LoadBitmap (bmLocalizer);
03359     nLocalizerFrames = NumBitmapFrames (bmLocalizer);
03360     localizerFramesPerDeg = (float)nLocalizerFrames / 20.0f;
03361   }
03362 
03363   if (strlen(gndl.art) > 0) {
03364     // Load glideslope needle bitmap
03365     bmGlideslope = new SBitmap;
03366     strcpy (bmGlideslope->bitmapName, "ART\\");
03367     strcat (bmGlideslope->bitmapName, gndl.art);
03368     LoadBitmap (bmGlideslope);
03369     nGlideslopeFrames = NumBitmapFrames (bmGlideslope);
03370     glideslopeFramesPerDeg = (float)nGlideslopeFrames / 20.0f;
03371   }
03372 
03373   if (strlen(wtab_art) > 0) {
03374     // Load WARN flag bitmap
03375     bmWarnTab = new SBitmap;
03376     strcpy (bmWarnTab->bitmapName, "ART\\");
03377     strcat (bmWarnTab->bitmapName, wtab_art);
03378     LoadBitmap (bmWarnTab);
03379   }
03380 
03381   if (strlen(ttab_art) > 0) {
03382     // Load TO flag bitmap
03383     bmToTab = new SBitmap;
03384     strcpy (bmToTab->bitmapName, "ART\\");
03385     strcat (bmToTab->bitmapName, ttab_art);
03386     LoadBitmap (bmToTab);
03387   }
03388 
03389   if (strlen(ftab_art) > 0) {
03390     // Load FROM flag bitmap
03391     bmFromTab = new SBitmap;
03392     strcpy (bmFromTab->bitmapName, "ART\\");
03393     strcat (bmFromTab->bitmapName, ftab_art);
03394     LoadBitmap (bmFromTab);
03395   }
03396 }
03397 
03398 EClickResult CNavigationGauge::MouseClick (int x, int y, int buttons)
03399 {
03400   EClickResult rc = MOUSE_TRACKING_OFF;
03401 
03402   // Only handle left/right mouse clicks
03403   if ((buttons & (MOUSE_BUTTON_LEFT | MOUSE_BUTTON_RIGHT)) == 0) {
03404     return rc;
03405   }
03406 
03407   // Check for hit on OBS knob
03408   if ((x >= obs.x1) && (x <= obs.x2) &&
03409       (y >= obs.y1) && (y <= obs.y2))
03410   {
03411     // Initialize OBS knob hold-down values
03412     obsKnobClick = true;
03413     obsKnobTickRate = 0.5f;
03414     obsKnobTickRateTimer = globals->timemgr->GetElapsedSimTime();
03415     obsKnobLastTick = 0;
03416 
03417     if (buttons & MOUSE_BUTTON_LEFT) {
03418       // Set OBS decrement rate to -1 deg per tick
03419       obsRate = -1;
03420     } else {
03421       // Set OBS decrement rate to +1 deg per tick
03422       obsRate = +1;
03423     }
03424     rc = MOUSE_TRACKING_ON;
03425   }
03426 
03427   return rc;
03428 }
03429 
03430 EClickResult CNavigationGauge::StopClick (int x, int y, int buttons)
03431 {
03432   EClickResult rc = MOUSE_TRACKING_OFF;
03433 
03434   // Release OBS knob click if it is set
03435   if (obsKnobClick) obsKnobClick = false;
03436 
03437   return rc;
03438 }
03439 
03440 void CNavigationGauge::Draw (void)
03441 {
03442   ClearSurface ();
03443   DrawUnderlay ();
03444 
03445   // Check for OBS increment
03446   if (obsKnobClick) {
03447     float simElapsed = globals->timemgr->GetElapsedSimTime();
03448     // Check for tick rate increase
03449     if ((simElapsed - obsKnobTickRateTimer) >= 2.0f) {
03450       // Double the rate, up to a reasonable maximum
03451       obsKnobTickRateTimer += 2.0f;
03452       if (obsKnobTickRate > 0.05f) {
03453         obsKnobTickRate /= 2;
03454       }
03455     }
03456 
03457     // Check for OBS update
03458     if ((simElapsed - obsKnobLastTick) >= obsKnobTickRate) {
03459       obsKnobLastTick = simElapsed;
03460       obsSetting = Wrap360 (obsSetting + (float)obsRate);
03461     }
03462   }
03463 
03464   // Get navaid pointer from radio subsystem
03465   bool navdTuned = false;
03466   float navd = 0;
03467   mesg.id = MSG_GETDATA;
03468   mesg.user.u.datatag = 'navd';
03469   SendMessage (&mesg);
03470   if (mesg.dataType == TYPE_REAL) {
03471     navdTuned = true;
03472     navd = mesg.realData;
03473   }
03474 
03475   // Draw compass card
03476   comp_ndl.Draw (surf, obsSetting, cx, cy);
03477 
03478   // Draw localizer flags
03479   if (navdTuned) {
03480     float diff = fabs(navd - obsSetting);
03481     static const float deadZone = 7.0f;    // Degrees of dead zone around 90-deg offset
03482     if (diff > (90.0f + deadZone)) {
03483       // Display FR flag
03484       DrawBitmap (surf, bmFromTab, ntpl_x, ntpl_y, 0);
03485     } else if (diff < (90.0f - deadZone)) {
03486       // Display TO flag
03487       DrawBitmap (surf, bmToTab, ntpl_x, ntpl_y, 0);
03488     } else {
03489       // Display WARN flag
03490       DrawBitmap (surf, bmWarnTab, ntpl_x, ntpl_y, 0);
03491     }
03492   } else {
03493     // No navaid tuned...display WARN flag
03494     DrawBitmap (surf, bmWarnTab, ntpl_x, ntpl_y, 0);
03495   }
03496 
03497   // Draw localizer needle
03498   if (bmLocalizer) {
03499     int frame = nLocalizerFrames / 2;
03500     if (navdTuned) {
03501       float diff = navd - obsSetting;
03502       frame += (int)(diff * localizerFramesPerDeg);
03503       if (frame < 0) frame = 0;
03504       if (frame >= nLocalizerFrames) frame = nLocalizerFrames - 1;
03505 
03506       char debug[80];
03507       sprintf (debug, "navd=%f  obs=%f   diff=%f  frame=%d",
03508         navd, obsSetting, diff, frame);
03509       DrawNoticeToUser (debug, 1);
03510     }
03511     DrawBitmap (surf, bmLocalizer, lndl.x, lndl.y, frame);
03512   }
03513 
03514   // Draw glideslope needle
03515   if (bmGlideslope) {
03516     int frame = nGlideslopeFrames / 2;
03517     DrawBitmap (surf, bmGlideslope, gndl.x, gndl.y, frame);
03518   }
03519 
03520   // Draw OBS knob, one rotation per 30 degrees
03521   float degPerRev = 30.0f;
03522   float obsRotation = fmodf(obsSetting, degPerRev) / degPerRev;
03523   int obsFrame = (int)((float)nObsKnobFrames * obsRotation);
03524   if ((surfObsKnob != NULL) && (bmObsKnob != NULL)) {
03525     EraseSurface (surfObsKnob);
03526     DrawBitmap (surfObsKnob, bmObsKnob, 0, 0, obsFrame);
03527   }
03528 
03529   DrawOverlay ();
03530 }
03531 
03532 void CNavigationGauge::Blit (int xOffset, int yOffset, int y_isiz)
03533 {
03534   BlitSurface (surf, xOffset, yOffset, y_isiz);
03535   BlitSurface (surfObsKnob, xOffset, yOffset, y_isiz);
03536 }
03537 
03538 
03539 //
03540 // CBKKX155ComPresets
03541 //
03542 
03543 CBKKX155ComPresets::CBKKX155ComPresets (void)
03544 {
03545   for (int i=0; i<32; i++) {
03546     freq[i] = 118.000;
03547   }
03548 }
03549 
03550 void CBKKX155ComPresets::Load (const char *txtFilename)
03551 {
03552 }
03553 
03554 int CBKKX155ComPresets::Read (SStream *stream, Tag tag)
03555 {
03556   int rc = 0;
03557   return rc;
03558 }
03559 
03560 float CBKKX155ComPresets::GetFreq (int i)
03561 {
03562   float rc = 0;
03563 
03564   if ((i >= 1) && (i <= 32)) rc = freq[i-1];
03565 
03566   return rc;
03567 }
03568 
03569 void CBKKX155ComPresets::SetFreq (int i, float f)
03570 {
03571   if ((i >= 1) && (i <= 32)) freq[i-1] = f;
03572 }
03573 
03574 
03575 //
03576 // CBKNavComKX155Gauge
03577 //
03578 CBKNavComKX155Gauge::CBKNavComKX155Gauge (void)
03579 {
03580   radi_tag = 0;
03581   radi_unit = 0;
03582 
03583   comChannel = 1;
03584   comProgramFlash = true;
03585   comProgramTimer = 0;
03586   comProgramFreq = false;
03587 }
03588 
03589 int CBKNavComKX155Gauge::Read (SStream *stream, Tag tag)
03590 {
03591   int rc = TAG_IGNORED;
03592 
03593   switch (tag) {
03594   case 'radi':
03595     ReadTag (&radi_tag, stream);
03596     ReadInt (&radi_unit, stream);
03597     rc = TAG_READ;
03598     break;
03599 
03600   case 'ca01':
03601     ReadFrom (&ca01, stream);
03602     rc = TAG_READ;
03603     break;
03604 
03605   case 'ca02':
03606     ReadFrom (&ca02, stream);
03607     rc = TAG_READ;
03608     break;
03609 
03610   case 'ca03':
03611     ReadFrom (&ca03, stream);
03612     rc = TAG_READ;
03613     break;
03614 
03615   case 'ca04':
03616     ReadFrom (&ca04, stream);
03617     rc = TAG_READ;
03618     break;
03619 
03620   case 'ca05':
03621     ReadFrom (&ca05, stream);
03622     rc = TAG_READ;
03623     break;
03624 
03625   case 'ca06':
03626     ReadFrom (&ca06, stream);
03627     rc = TAG_READ;
03628     break;
03629 
03630   case 'ca07':
03631     ReadFrom (&ca07, stream);
03632     rc = TAG_READ;
03633     break;
03634 
03635   case 'ca08':
03636     ReadFrom (&ca08, stream);
03637     rc = TAG_READ;
03638     break;
03639 
03640   case 'ca09':
03641     ReadFrom (&ca09, stream);
03642     rc = TAG_READ;
03643     break;
03644 
03645   case 'ca10':
03646     ReadFrom (&ca10, stream);
03647     rc = TAG_READ;
03648     break;
03649 
03650   case 'ca11':
03651     ReadFrom (&ca11, stream);
03652     rc = TAG_READ;
03653     break;
03654 
03655   case 'ca12':
03656     ReadFrom (&ca12, stream);
03657     rc = TAG_READ;
03658     break;
03659 
03660   case 'ca13':
03661     ReadFrom (&ca13, stream);
03662     rc = TAG_READ;
03663     break;
03664 
03665   case 'ca14':
03666     ReadFrom (&ca14, stream);
03667     rc = TAG_READ;
03668     break;
03669 
03670   case 'ca15':
03671     ReadFrom (&ca15, stream);
03672     rc = TAG_READ;
03673     break;
03674 
03675   case 'ca16':
03676     ReadFrom (&ca16, stream);
03677     rc = TAG_READ;
03678     break;
03679 
03680   case 'ca17':
03681     ReadFrom (&ca17, stream);
03682     rc = TAG_READ;
03683     break;
03684 
03685   case 'ca18':
03686     ReadFrom (&ca18, stream);
03687     rc = TAG_READ;
03688     break;
03689 
03690   case 'ca19':
03691     ReadFrom (&ca19, stream);
03692     rc = TAG_READ;
03693     break;
03694 
03695   case 'ca20':
03696     ReadFrom (&ca20, stream);
03697     rc = TAG_READ;
03698     break;
03699 
03700   case 'ca21':
03701     ReadFrom (&ca21, stream);
03702     rc = TAG_READ;
03703     break;
03704   }
03705 
03706   if (rc == TAG_IGNORED) {
03707     rc = CBitmapGauge::Read (stream, tag);
03708   }
03709 
03710   if (rc == TAG_IGNORED) {
03711     char s[64];
03712     TagToString (s, tag);
03713     globals->logWarning->Write ("CBKNavComKX155Gauge::Read : Unknown tag %s", s);
03714   }
03715 
03716   return rc;
03717 }
03718 
03719 void CBKNavComKX155Gauge::ReadFinished (void)
03720 {
03721   CBitmapGauge::ReadFinished ();
03722 
03723   // Initialize messaging parameters
03724   mesg.group = radi_tag;
03725   mesg.user.u.unit = radi_unit;
03726 
03727   // Get fonts from global defaults
03728   digi9 = &(globals->fonts.ftdigi9);
03729   
03731 }
03732 
03733 ECursorResult CBKNavComKX155Gauge::MouseMoved (int x, int y)
03734 {
03735   ECursorResult rc = CURSOR_NOT_CHANGED;
03736 
03737   // Send updated mouse position to all click areas
03738   rc = ca01.MouseMoved (x, y);
03739   if (rc == CURSOR_NOT_CHANGED) rc = ca02.MouseMoved (x, y);
03740   if (rc == CURSOR_NOT_CHANGED) rc = ca03.MouseMoved (x, y);
03741   if (rc == CURSOR_NOT_CHANGED) rc = ca04.MouseMoved (x, y);
03742   if (rc == CURSOR_NOT_CHANGED) rc = ca05.MouseMoved (x, y);
03743   if (rc == CURSOR_NOT_CHANGED) rc = ca06.MouseMoved (x, y);
03744   if (rc == CURSOR_NOT_CHANGED) rc = ca07.MouseMoved (x, y);
03745   if (rc == CURSOR_NOT_CHANGED) rc = ca08.MouseMoved (x, y);
03746   if (rc == CURSOR_NOT_CHANGED) rc = ca09.MouseMoved (x, y);
03747   if (rc == CURSOR_NOT_CHANGED) rc = ca10.MouseMoved (x, y);
03748   if (rc == CURSOR_NOT_CHANGED) rc = ca11.MouseMoved (x, y);
03749   if (rc == CURSOR_NOT_CHANGED) rc = ca12.MouseMoved (x, y);
03750   if (rc == CURSOR_NOT_CHANGED) rc = ca13.MouseMoved (x, y);
03751   if (rc == CURSOR_NOT_CHANGED) rc = ca14.MouseMoved (x, y);
03752   if (rc == CURSOR_NOT_CHANGED) rc = ca15.MouseMoved (x, y);
03753   if (rc == CURSOR_NOT_CHANGED) rc = ca16.MouseMoved (x, y);
03754   if (rc == CURSOR_NOT_CHANGED) rc = ca17.MouseMoved (x, y);
03755   if (rc == CURSOR_NOT_CHANGED) rc = ca18.MouseMoved (x, y);
03756   if (rc == CURSOR_NOT_CHANGED) rc = ca19.MouseMoved (x, y);
03757   if (rc == CURSOR_NOT_CHANGED) rc = ca20.MouseMoved (x, y);
03758   if (rc == CURSOR_NOT_CHANGED) rc = ca21.MouseMoved (x, y);
03759 
03760   // Call parent method if cursor not changed
03761   if (rc == CURSOR_NOT_CHANGED) {
03762     rc = CBitmapGauge::MouseMoved (x, y);
03763   }
03764 
03765   return rc;
03766 }
03767 
03768 void CBKNavComKX155Gauge::IncComChannel (void)
03769 {
03770   comChannel++;
03771   if (comChannel > 32) comChannel -= 32;
03772 }
03773 
03774 void CBKNavComKX155Gauge::DecComChannel (void)
03775 {
03776   comChannel--;
03777   if (comChannel < 1) comChannel += 32;
03778 }
03779 
03780 EClickResult CBKNavComKX155Gauge::MouseClick (int x, int y, int buttons)
03781 {
03782   EClickResult rc = MOUSE_TRACKING_OFF;
03783 
03784   // Only handle left/right mouse clicks
03785   if ((buttons & (MOUSE_BUTTON_LEFT | MOUSE_BUTTON_RIGHT)) == 0) {
03786     return rc;
03787   }
03788 
03789   // For direct frequency edit click areas, the left mouse button decrements
03790   //   the value and the right mouse button increments
03791   bool increment = (buttons & MOUSE_BUTTON_RIGHT) != 0;
03792   
03793   if (ca01.IsHit (x, y)) {
03794     // COM Active Whole MHz
03795     mesg.id = MSG_SETDATA;
03796     mesg.user.u.datatag = increment ? 'caw+' : 'caw-';
03797     SendMessage (&mesg);
03798   } else if (ca02.IsHit (x, y)) {
03799     // COM Active Fract MHz
03800     mesg.id = MSG_SETDATA;
03801     mesg.user.u.datatag = increment ? 'caf+' : 'caf-';
03802     SendMessage (&mesg);
03803   } else if (ca03.IsHit (x, y)) {
03804     // COM Standby Whole MHz
03805     mesg.id = MSG_SETDATA;
03806     mesg.user.u.datatag = increment ? 'csw+' : 'csw-';
03807     SendMessage (&mesg);
03808   } else if (ca04.IsHit (x, y)) {
03809     // COM Standby Fract MHz
03810     mesg.id = MSG_SETDATA;
03811     mesg.user.u.datatag = increment ? 'csf+' : 'csf-';
03812     SendMessage (&mesg);
03813   } else if (ca05.IsHit (x, y)) {
03814     // NAV Active Whole MHz
03815     mesg.id = MSG_SETDATA;
03816     mesg.user.u.datatag = increment ? 'naw+' : 'naw-';
03817     SendMessage (&mesg);
03818   } else if (ca06.IsHit (x, y)) {
03819     // NAV Active Fract MHz
03820     mesg.id = MSG_SETDATA;
03821     mesg.user.u.datatag = increment ? 'naf+' : 'naf-';
03822     SendMessage (&mesg);
03823   } else if (ca07.IsHit (x, y)) {
03824     // NAV Standby Whole MHz
03825     mesg.id = MSG_SETDATA;
03826     mesg.user.u.datatag = increment ? 'nsw+' : 'nsw-';
03827     SendMessage (&mesg);
03828   } else if (ca08.IsHit (x, y)) {
03829     // NAV Standby Fract MHz
03830     mesg.id = MSG_SETDATA;
03831     mesg.user.u.datatag = increment ? 'nsf+' : 'nsf-';
03832     SendMessage (&mesg);
03833   } else if (ca09.IsHit (x, y)) {
03834     // COM Tune knob
03835     // Get COM mode
03836     mesg.id = MSG_GETDATA;
03837     mesg.user.u.datatag = 'cmod';
03838     SendMessage (&mesg);
03839     EBKKX155ComMode comMode = (EBKKX155ComMode) mesg.intData;
03840 
03841     switch (comMode) {
03842     case COM_MODE_NORMAL:
03843       // Increment/decrement standby frequency
03844       mesg.id = MSG_SETDATA;
03845       mesg.user.u.datatag = increment ? 'csf+' : 'csw+';
03846       SendMessage (&mesg);
03847       break;
03848     case COM_MODE_SELECT:
03849       // Increment/decrement channel
03850       if (increment) {
03851         IncComChannel();
03852       } else {
03853         DecComChannel();
03854       }
03855       break;
03856     case COM_MODE_PROGRAM:
03857       if (comProgramFreq) {
03858         // Increment/decrement channel frequency
03859       } else {
03860         // Increment/decrement channel
03861         if (increment) {
03862           IncComChannel();
03863         } else {
03864           DecComChannel();
03865         }
03866       }
03867       break;
03868     }
03869   } else if (ca10.IsHit (x, y)) {
03870     // NAV Tune knob
03871     mesg.id = MSG_SETDATA;
03872     mesg.user.u.datatag = increment ? 'nsf+' : 'nsw+';
03873     SendMessage (&mesg);
03874   } else if (ca11.IsHit (x, y)) {
03875     // COM channel button
03876     mesg.id = MSG_SETDATA;
03877     mesg.user.u.datatag = 'cmod';
03878     SendMessage (&mesg);
03879   } else if (ca12.IsHit (x, y)) {
03880     // NAV mode button
03881     mesg.id = MSG_SETDATA;
03882     mesg.user.u.datatag = 'nmod';
03883     SendMessage (&mesg);
03884   } else if (ca13.IsHit (x, y)) {
03885     // COM Transfer
03886     // Get COM mode
03887     mesg.id = MSG_GETDATA;
03888     mesg.user.u.datatag = 'cmod';
03889     SendMessage (&mesg);
03890     EBKKX155ComMode comMode = (EBKKX155ComMode) mesg.intData;
03891 
03892     switch (comMode) {
03893     case COM_MODE_NORMAL:
03894       {
03895         // COM Transfer, first get current active and standby freqs
03896         mesg.id = MSG_GETDATA;
03897         mesg.user.u.datatag = 'comA';
03898         SendMessage (&mesg);
03899         float comA = mesg.realData;
03900         mesg.user.u.datatag = 'comS';
03901         SendMessage (&mesg);
03902         float comS = mesg.realData;
03903 
03904         // Flip frequencies and set
03905         mesg.id = MSG_SETDATA;
03906         mesg.user.u.datatag = 'comA';
03907         mesg.realData = comS;
03908         SendMessage (&mesg);
03909 
03910         mesg.user.u.datatag = 'comS';
03911         mesg.realData = comA;
03912         SendMessage (&mesg);
03913       }
03914       break;
03915     case COM_MODE_SELECT:
03916       {
03917         // Swap active to standby, and set active to selected channel
03918         mesg.id = MSG_GETDATA;
03919         mesg.user.u.datatag = 'comA';
03920         SendMessage (&mesg);
03921         float comA = mesg.realData;
03922 
03923         mesg.id = MSG_SETDATA;
03924         mesg.user.u.datatag = 'comA';
03925         mesg.realData = presets.GetFreq(comChannel);
03926         SendMessage (&mesg);
03927 
03928         mesg.id = MSG_SETDATA;
03929         mesg.user.u.datatag = 'comS';
03930         mesg.realData = comA;
03931         SendMessage (&mesg);
03932 
03933         // Send COM channel mode button press to reset mode
03934         mesg.user.u.datatag = 'cmod';
03935         SendMessage (&mesg);
03936       }
03937       break;
03938     case COM_MODE_PROGRAM:
03939       {
03940         // Toggle channel/frequency programming
03941         comProgramFreq = !comProgramFreq;
03942       }
03943       break;
03944     }
03945   } else if (ca14.IsHit (x, y)) {
03946     // NAV Transfer, first get current active and standby freqs
03947     mesg.id = MSG_GETDATA;
03948     mesg.user.u.datatag = 'navA';
03949     SendMessage (&mesg);
03950     float navA = mesg.realData;
03951     mesg.user.u.datatag = 'navS';
03952     SendMessage (&mesg);
03953     float navS = mesg.realData;
03954 
03955     // Flip frequencies and set
03956     mesg.id = MSG_GETDATA;
03957     mesg.user.u.datatag = 'navA';
03958     mesg.realData = navS;
03959     SendMessage (&mesg);
03960 
03961     mesg.user.u.datatag = 'navS';
03962     mesg.realData = navA;
03963     SendMessage (&mesg);
03964   }
03965 
03966   return rc;
03967 }
03968 
03969 
03970 static void ConvertFreq (float f, int *whole, int *fract)
03971 {
03972   *whole = (int)floorf(f);
03973   *fract = (int)floorf((fmodf(f, 1.0f) * 1000 + 0.5));
03974 }
03975 
03976 
03977 void CBKNavComKX155Gauge::Draw (void)
03978 {
03979   ClearSurface ();
03980   DrawUnderlay ();
03981 
03982   // Get activity status of subsystem
03983   mesg.id = MSG_GETDATA;
03984   mesg.user.u.datatag = 'actv';
03985   SendMessage (&mesg);
03986   bool active = (mesg.intData != 0);
03987   int frame = active ? 1 : 0;
03988 
03989   // Draw button images
03990   // ca11 = COM Channel   SKYHBT02.PBG
03991   // ca12 = NAV Mode      SKYHBT02.PBG
03992   // ca13 = COM Transfer, SKYHBT01.PBG
03993   // ca14 = NAV Transfer, SKYHBT01.PBG
03994   ca11.Draw (surf, frame);
03995   ca12.Draw (surf, frame);
03996   ca13.Draw (surf, frame);
03997   ca14.Draw (surf, frame);
03998 
03999   // Draw active/standby frequencies in the appropriate click areas
04000   // ca01 = COM Active MHz
04001   // ca02 = COM Active KHz
04002   // ca03 = COM Standby MHz
04003   // ca04 = COM Standby KHz
04004   // ca05 = NAV Active MHz
04005   // ca06 = NAV Active KHz
04006   // ca07 = NAV Standby MHz
04007   // ca08 = NAV Standby KHz
04008 
04009   if (active) {
04010     unsigned int amber = MakeRGB (215, 90, 0);
04011     char s[8];
04012     int whole, fract;
04013 
04014     // Get COM mode
04015     mesg.user.u.datatag = 'cmod';
04016     SendMessage (&mesg);
04017     EBKKX155ComMode comMode = (EBKKX155ComMode)mesg.intData;
04018 
04019     // Display COM Active region
04020     switch (comMode) {
04021     case COM_MODE_NORMAL:
04022       // Active COM frequency
04023       mesg.user.u.datatag = 'comA';
04024       SendMessage (&mesg);
04025       ConvertFreq (mesg.realData, &whole, &fract);
04026       sprintf (s, "%3d.", whole);
04027       DrawText (surf, digi9, ca01.x1, ca01.y1, amber, s);
04028       sprintf (s, "%02d", fract/10);
04029       DrawText (surf, digi9, ca02.x1, ca02.y1, amber, s);
04030       break;
04031     case COM_MODE_SELECT:
04032       sprintf (s, "%02d", comChannel);
04033       DrawTextR (surf, digi9, ca02.x2, ca02.y1, amber, s);
04034       break;
04035     case COM_MODE_PROGRAM:
04036       // Current channel number
04038       sprintf (s, "%02d", comChannel);
04039       DrawTextR (surf, digi9, ca02.x2, ca02.y1, amber, s);
04040       break;
04041     }
04042 
04043     // Display COM Standby region
04044     switch (comMode) {
04045     case COM_MODE_NORMAL:
04046       // Standby COM frequency
04047       mesg.user.u.datatag = 'comS';
04048       SendMessage (&mesg);
04049       ConvertFreq (mesg.realData, &whole, &fract);
04050       sprintf (s, "%3d.", whole);
04051       DrawText (surf, digi9, ca03.x1, ca03.y1, amber, s);
04052       sprintf (s, "%02d", fract/10);
04053       DrawText (surf, digi9, ca04.x1, ca04.y1, amber, s);
04054       break;
04055     case COM_MODE_SELECT:
04056       // Current preset channel frequency
04057       ConvertFreq (presets.GetFreq(comChannel), &whole, &fract);
04058       sprintf (s, "%3d.", whole);
04059       DrawText (surf, digi9, ca03.x1, ca03.y1, amber, s);
04060       sprintf (s, "%02d", fract/10);
04061       DrawText (surf, digi9, ca04.x1, ca04.y1, amber, s);
04062       break;
04063     case COM_MODE_PROGRAM:
04064       // Current preset channel frequency (flashing)
04065       ConvertFreq (presets.GetFreq(comChannel), &whole, &fract);
04066       sprintf (s, "%3d.", whole);
04067       DrawText (surf, digi9, ca03.x1, ca03.y1, amber, s);
04068       sprintf (s, "%02d", fract/10);
04069       DrawText (surf, digi9, ca04.x1, ca04.y1, amber, s);
04070       break;
04071     }
04072 
04073     // Display NAV Active region
04074     mesg.user.u.datatag = 'navA';
04075     SendMessage (&mesg);
04076     float navActive = mesg.realData;
04077     int navActiveWhole, navActiveFract;
04078     ConvertFreq (navActive, &navActiveWhole, &navActiveFract);
04079     sprintf (s, "%3d.", navActiveWhole);
04080     DrawText (surf, digi9, ca05.x1, ca05.y1, amber, s);
04081     sprintf (s, "%02d", navActiveFract/10);
04082     DrawText (surf, digi9, ca06.x1, ca06.y1, amber, s);
04083 
04084     // Display NAV Standby region
04085     mesg.user.u.datatag = 'navS';
04086     SendMessage (&mesg);
04087     float navStby = mesg.realData;
04088     int navStbyWhole, navStbyFract;
04089     ConvertFreq (navStby, &navStbyWhole, &navStbyFract);
04090     sprintf (s, "%3d.", navStbyWhole);
04091     DrawText (surf, digi9, ca07.x1, ca07.y1, amber, s);
04092     sprintf (s, "%02d", navStbyFract/10);
04093     DrawText (surf, digi9, ca08.x1, ca08.y1, amber, s);
04094   }
04095 
04096   DrawOverlay ();
04097 }
04098 
04099 
04100 //
04101 // CBKXPDRKT76Gauge
04102 //
04103 CBKXPDRKT76Gauge::CBKXPDRKT76Gauge (void)
04104 {
04105   radi_tag = 0;
04106   radi_unit = 0;
04107 
04108   nClickAreas = 16;
04109   caClicked = 0;
04110 }
04111 
04112 int CBKXPDRKT76Gauge::Read (SStream *stream, Tag tag)
04113 {
04114   int rc = TAG_IGNORED;
04115 
04116   // Check for click area tags
04117   int ica = ClickAreaFromTag (tag);
04118   if ((ica >= 1) && (ica <= nClickAreas)) {
04119     // Valid click area
04120     ReadFrom (&ca[ica], stream);
04121     rc = TAG_READ;
04122   }
04123 
04124   switch (tag) {
04125   case 'radi':
04126     ReadTag (&radi_tag, stream);
04127     ReadInt (&radi_unit, stream);
04128     rc = TAG_READ;
04129     break;
04130   }
04131 
04132   if (rc == TAG_IGNORED) {
04133     rc = CBitmapGauge::Read (stream, tag);
04134   }
04135 
04136   if (rc == TAG_IGNORED) {
04137     char s[64];
04138     TagToString (s, tag);
04139     globals->logWarning->Write ("CBKXPDRKT76Gauge::Read : Unknown tag %s", s);
04140   }
04141 
04142   return rc;
04143 }
04144 
04145 void CBKXPDRKT76Gauge::ReadFinished (void)
04146 {
04147   CBitmapGauge::ReadFinished ();
04148 
04149   // Initialize messaging parameters
04150   mesg.group = radi_tag;
04151   mesg.user.u.unit = radi_unit;
04152 }
04153 
04154 ECursorResult CBKXPDRKT76Gauge::MouseMoved (int x, int y)
04155 {
04156   ECursorResult rc = CURSOR_NOT_CHANGED;
04157 
04158   // Send updated mouse position to all click areas
04159   for (int i=1; i<=nClickAreas && (rc == CURSOR_NOT_CHANGED); i++) {
04160     rc = ca[i].MouseMoved (x, y);
04161   }
04162 
04163   // Call parent method if cursor not changed
04164   if (rc == CURSOR_NOT_CHANGED) {
04165     rc = CBitmapGauge::MouseMoved (x, y);
04166   }
04167 
04168   return rc;
04169 }
04170 
04171 EClickResult CBKXPDRKT76Gauge::MouseClick (int x, int y, int buttons)
04172 {
04173   EClickResult rc = MOUSE_TRACKING_OFF;
04174 
04175   // Only handle left/right mouse clicks
04176   if ((buttons & (MOUSE_BUTTON_LEFT | MOUSE_BUTTON_RIGHT)) == 0) {
04177     return rc;
04178   }
04179 
04180   // For direct frequency edit click areas, the left mouse button decrements
04181   //   the value and the right mouse button increments
04182   bool increment = (buttons & MOUSE_BUTTON_RIGHT) != 0;
04183 
04184   caClicked = 0;
04185   for (int i=1; (i<=nClickAreas) && (caClicked==0); i++) {
04186     if (ca[i].IsHit(x, y)) {
04187       caClicked = i;
04188       rc = MOUSE_TRACKING_ON;
04189       break;
04190     }
04191   }
04192 
04193   switch (caClicked) {
04194   case 1:
04195     // Active digit 1
04196     mesg.id = MSG_SETDATA;
04197     mesg.user.u.datatag = increment ? 'i11+' : 'i11-';
04198     SendMessage (&mesg);
04199     break;
04200   case 2:
04201     // Active digit 2
04202     mesg.id = MSG_SETDATA;
04203     mesg.user.u.datatag = increment ? 'i12+' : 'i12-';
04204     SendMessage (&mesg);
04205     break;
04206   case 3:
04207     // Active digit 3
04208     mesg.id = MSG_SETDATA;
04209     mesg.user.u.datatag = increment ? 'i13+' : 'i13-';
04210     SendMessage (&mesg);
04211     break;
04212   case 4:
04213     // Active digit 4
04214     mesg.id = MSG_SETDATA;
04215     mesg.user.u.datatag = increment ? 'i14+' : 'i14-';
04216     SendMessage (&mesg);
04217     break;
04218   }
04219 
04220   return rc;
04221 }
04222 
04223 EClickResult CBKXPDRKT76Gauge::StopClick (int x, int y, int buttons)
04224 {
04225   EClickResult rc = MOUSE_TRACKING_OFF;
04226 
04227   // Find click area that mouse is in
04228   int caStop = 0;
04229   for (int i=1; (i<=nClickAreas) && (caStop==0); i++) {
04230     if (ca[i].IsHit(x, y)) caStop = i;
04231   }
04232 
04233   // Check that the release occurred in the same areas that was clicked
04234   if (caStop == caClicked) {
04235     switch (caClicked) {
04236     case 5:
04237       // IDT button
04238       mesg.id = MSG_SETDATA;
04239       mesg.user.u.datatag = 'idt_';
04240       SendMessage (&mesg);
04241       break;
04242     case 6:
04243       // Zero button
04244       mesg.id = MSG_SETDATA;
04245       mesg.user.u.datatag = '___0';
04246       SendMessage (&mesg);
04247       break;
04248     case 7:
04249       // One button
04250       mesg.id = MSG_SETDATA;
04251       mesg.user.u.datatag = '___1';
04252       SendMessage (&mesg);
04253       break;
04254     case 8:
04255       // Two button
04256       mesg.id = MSG_SETDATA;
04257       mesg.user.u.datatag = '___2';
04258       SendMessage (&mesg);
04259       break;
04260     case 9:
04261       // Three button
04262       mesg.id = MSG_SETDATA;
04263       mesg.user.u.datatag = '___3';
04264       SendMessage (&mesg);
04265       break;
04266     case 10:
04267       // Four button
04268       mesg.id = MSG_SETDATA;
04269       mesg.user.u.datatag = '___4';
04270       SendMessage (&mesg);
04271       break;
04272     case 11:
04273       // Five Button
04274       mesg.id = MSG_SETDATA;
04275       mesg.user.u.datatag = '___5';
04276       SendMessage (&mesg);
04277       break;
04278     case 12:
04279       // Six Button
04280       mesg.id = MSG_SETDATA;
04281       mesg.user.u.datatag = '___6';
04282       SendMessage (&mesg);
04283       break;
04284     case 13:
04285       // Seven Button
04286       mesg.id = MSG_SETDATA;
04287       mesg.user.u.datatag = '___7';
04288       SendMessage (&mesg);
04289       break;
04290     case 14:
04291       // CLR Button
04292       mesg.id = MSG_SETDATA;
04293       mesg.user.u.datatag = 'clr_';
04294       SendMessage (&mesg);
04295       break;
04296     case 15:
04297       // VFR Button
04298       mesg.id = MSG_SETDATA;
04299       mesg.user.u.datatag = 'vfr_';
04300       SendMessage (&mesg);
04301       break;
04302     }
04303   }
04304 
04305   caClicked = 0;
04306 
04307   return rc;
04308 }
04309 
04310 void CBKXPDRKT76Gauge::Draw (void)
04311 {
04312   ClearSurface ();
04313   DrawUnderlay ();
04314 
04315   // Get activity status of subsystem
04316   mesg.id = MSG_GETDATA;
04317   mesg.user.u.datatag = 'actv';
04318   SendMessage (&mesg);
04319   bool active = (mesg.intData != 0);
04320   int frame = active ? 1 : 0;
04321 
04322   // Draw button images
04323   // ca05 = Ident button
04324   // ca06..ca13 = Zero..Seven
04325   // ca14 = Clear button
04326   // ca15 = VFR button
04327   ca[5].Draw (surf, frame);
04328   ca[6].Draw (surf, frame);
04329   ca[7].Draw (surf, frame);
04330   ca[8].Draw (surf, frame);
04331   ca[9].Draw (surf, frame);
04332   ca[10].Draw (surf, frame);
04333   ca[11].Draw (surf, frame);
04334   ca[12].Draw (surf, frame);
04335   ca[13].Draw (surf, frame);
04336   ca[14].Draw (surf, frame);
04337   ca[15].Draw (surf, frame);
04338 
04339   // Get switch mode and draw knob
04340   mesg.user.u.datatag = 'smod';
04341   SendMessage (&mesg);
04342   ca[16].Draw (surf, mesg.intData);
04343 
04344   if (active) {
04345     // Initialize font display information
04346     SFont *fttiny7 = &globals->fonts.fttiny7;
04347     SFont *ftdigi9 = &globals->fonts.ftdigi9;
04348     unsigned int amber = MakeRGB (215, 90, 0);
04349     int x, y;
04350 
04351     // Initialize display strings and flags
04352     bool fl = false;
04353     bool alt = false;
04354     bool on = false;
04355     bool reply = false;
04356     bool sby = false;
04357     char left[8];
04358     char right[8];
04359 
04360     // Get transponder code
04361     mesg.user.u.datatag = 'tune';
04362     SendMessage (&mesg);
04363     char sCode[8];
04364     if (mesg.dataType == TYPE_INT) {
04365       sprintf (sCode, "%04d", mesg.intData);
04366     } else if (mesg.dataType == TYPE_CHARPTR) {
04367       strcpy (sCode, mesg.charPtrData);
04368     }
04369 
04370     // Get operating mode
04371     mesg.user.u.datatag = 'mode';
04372     SendMessage (&mesg);
04373     ETransponderMode mode = (ETransponderMode)mesg.intData;
04374     switch (mode) {
04375     case XPDR_OFF:
04376       strcpy (left, "");
04377       strcpy (right, "");
04378       break;
04379 
04380     case XPDR_STARTUPA1:
04381       strcpy (left, "AA1");
04382       strcpy (right, "1234");
04383       break;
04384 
04385     case XPDR_STARTUPA2:
04386       strcpy (left, "AA2");
04387       strcpy (right, "5678");
04388       break;
04389 
04390     case XPDR_STANDBY:
04391       strcpy (left, "");
04392       strcpy (right, sCode);
04393       break;
04394 
04395     case XPDR_TEST:
04396       strcpy (left, "-888");
04397       strcpy (right, "8888");
04398       break;
04399       
04400     case XPDR_ON:
04401       strcpy (left, "");
04402       strcpy (right, sCode);
04403       break;
04404 
04405     case XPDR_ALT:
04406       mesg.user.u.datatag = 'alti';
04407       SendMessage (&mesg);
04408       sprintf (left, "%4d", mesg.intData);
04409       strcpy (right, sCode);
04410       break;
04411     }
04412 
04413     // Get FL flag
04414     mesg.user.u.datatag = 'fl__';
04415     SendMessage (&mesg);
04416     fl = (mesg.intData != 0);
04417 
04418     // Get ALT flag
04419     mesg.user.u.datatag = 'alt_';
04420     SendMessage (&mesg);
04421     alt = (mesg.intData != 0);
04422 
04423     // Get ON flag
04424     mesg.user.u.datatag = 'on__';
04425     SendMessage (&mesg);
04426     on = (mesg.intData != 0);
04427 
04428     // Get reply flag
04429     mesg.user.u.datatag = 'rply';
04430     SendMessage (&mesg);
04431     reply = (mesg.intData != 0);
04432 
04433     // Get standby flag
04434     mesg.user.u.datatag = 'sby_';
04435     SendMessage (&mesg);
04436     sby = (mesg.intData != 0);
04437 
04438     // Display appropriate data and flags
04439     // Left display area and flag locations are not specified by click area objects
04440     //   in the gauge specification use hard-coded values that fit the normal gauge
04441 
04444     if (fl) {
04445       // Display FL flag
04446       x = 40;
04447       y = 14;
04448       DrawText (surf, fttiny7, x, y, amber, "FL");
04449     }
04450 
04451     if (alt) {
04452       // Display ALT flag
04453       x = 80;
04454       y = 6;
04455       DrawText (surf, fttiny7, x, y, amber, "ALT");
04456     }
04457 
04458     if (on) {
04459       // Display ON flag
04460       x = 80;
04461       y = 14;
04462       DrawText (surf, fttiny7, x, y, amber, "ON");
04463     }
04464 
04465     if (reply) {
04466       // Display Reply flag
04467       x = 100;
04468       y = 6;
04469       DrawText (surf, fttiny7, x, y, amber, "R");
04470     }
04471 
04472     if (sby) {
04473       // Display Standby flag
04474       x = 100;
04475       y = 14;
04476       DrawText (surf, fttiny7, x, y, amber, "SBY");
04477     }
04478 
04479     // Display left string
04480     x = 50;
04481     y = 8;
04482     DrawText (surf, ftdigi9, x, y, amber, left);
04483 
04484     // Display right string
04485     x = ca[1].x1;
04486     y = ca[1].y1;
04487     DrawText (surf, ftdigi9, x, y, amber, right);
04488   }
04489 }
04490 
04491 
04492 //
04493 // CBKADFKR87Gauge
04494 //
04495 CBKADFKR87Gauge::CBKADFKR87Gauge (void)
04496 {
04497   radi_tag = 0;
04498   radi_unit = 0;
04499 
04500   nClickAreas = 15;
04501   caClicked = 0;
04502 }
04503 
04504 int CBKADFKR87Gauge::Read (SStream *stream, Tag tag)
04505 {
04506   int rc = TAG_IGNORED;
04507 
04508   // Check for click area tags
04509   int ica = ClickAreaFromTag (tag);
04510   if ((ica >= 1) && (ica <= nClickAreas)) {
04511     // Valid click area
04512     ReadFrom (&ca[ica], stream);
04513     rc = TAG_READ;
04514   }
04515 
04516   // Check for non-click area tags
04517   switch (tag) {
04518   case 'radi':
04519     ReadTag (&radi_tag, stream);
04520     ReadInt (&radi_unit, stream);
04521     rc = TAG_READ;
04522     break;
04523   }
04524 
04525   if (rc == TAG_IGNORED) {
04526     rc = CBitmapGauge::Read (stream, tag);
04527   }
04528 
04529   if (rc == TAG_IGNORED) {
04530     char s[64];
04531     TagToString (s, tag);
04532     globals->logWarning->Write ("CBKADFKR87Gauge::Read : Unknown tag %s", s);
04533   }
04534 
04535   return rc;
04536 }
04537 
04538 void CBKADFKR87Gauge::ReadFinished (void)
04539 {
04540   CBitmapGauge::ReadFinished ();
04541 
04542   // Initialize messaging parameters
04543   mesg.group = radi_tag;
04544   mesg.user.u.unit = radi_unit;
04545 }
04546 
04547 ECursorResult CBKADFKR87Gauge::MouseMoved (int x, int y)
04548 {
04549   ECursorResult rc = CURSOR_NOT_CHANGED;
04550 
04551   // Send updated mouse position to all click areas
04552   for (int i=1; i<=nClickAreas && (rc == CURSOR_NOT_CHANGED); i++) {
04553     rc = ca[i].MouseMoved (x, y);
04554   }
04555 
04556   // Call parent method if cursor not changed
04557   if (rc == CURSOR_NOT_CHANGED) {
04558     rc = CBitmapGauge::MouseMoved (x, y);
04559   }
04560 
04561   return rc;
04562 }
04563 
04564 EClickResult CBKADFKR87Gauge::MouseClick (int x, int y, int buttons)
04565 {
04566   EClickResult rc = MOUSE_TRACKING_OFF;
04567 
04568   // Only handle left/right mouse clicks
04569   if ((buttons & (MOUSE_BUTTON_LEFT | MOUSE_BUTTON_RIGHT)) == 0) {
04570     return rc;
04571   }
04572 
04573   // For direct frequency edit click areas, the left mouse button decrements
04574   //   the value and the right mouse button increments
04575   bool increment = (buttons & MOUSE_BUTTON_RIGHT) != 0;
04576 
04577   caClicked = 0;
04578   for (int i=1; (i<=nClickAreas) && (caClicked==0); i++) {
04579     if (ca[i].IsHit(x, y)) {
04580       caClicked = i;
04581       rc = MOUSE_TRACKING_ON;
04582       break;
04583     }
04584   }
04585 
04586   // Handle areas that are activated on mouse click
04587   switch (caClicked) {
04588   case 1:
04589     // Active digit 1
04590     mesg.id = MSG_SETDATA;
04591     mesg.user.u.datatag = increment ? 'ad1+' : 'ad1-';
04592     SendMessage (&mesg);
04593     break;
04594   case 2:
04595     // Active digit 2
04596     mesg.id = MSG_SETDATA;
04597     mesg.user.u.datatag = increment ? 'ad2+' : 'ad2-';
04598     SendMessage (&mesg);
04599     break;
04600   case 3:
04601     // Active digit 3
04602     mesg.id = MSG_SETDATA;
04603     mesg.user.u.datatag = increment ? 'ad3+' : 'ad3-';
04604     SendMessage (&mesg);
04605     break;
04606   case 4:
04607     // Active digit 4
04608     mesg.id = MSG_SETDATA;
04609     mesg.user.u.datatag = increment ? 'ad4+' : 'ad4-';
04610     SendMessage (&mesg);
04611     break;
04612   case 5:
04613     // Standby digit 1
04614     mesg.id = MSG_SETDATA;
04615     mesg.user.u.datatag = increment ? 'sd1+' : 'sd1-';
04616     SendMessage (&mesg);
04617   case 6:
04618     // Standby digit 2
04619     mesg.id = MSG_SETDATA;
04620     mesg.user.u.datatag = increment ? 'sd2+' : 'sd2-';
04621     SendMessage (&mesg);
04622     break;
04623   case 7:
04624     // Standby digit 3
04625     mesg.id = MSG_SETDATA;
04626     mesg.user.u.datatag = increment ? 'sd3+' : 'sd3-';
04627     SendMessage (&mesg);
04628     break;
04629   case 8:
04630     // Standby digit 4
04631     mesg.id = MSG_SETDATA;
04632     mesg.user.u.datatag = increment ? 'sd4+' : 'sd4-';
04633     SendMessage (&mesg);
04634   }
04635 
04636   return rc;
04637 }
04638 
04639 EClickResult CBKADFKR87Gauge::StopClick (int x, int y, int buttons)
04640 {
04641   EClickResult rc = MOUSE_TRACKING_OFF;
04642 
04643   // Find click area that mouse is in
04644   int caStop = 0;
04645   for (int i=1; (i<=nClickAreas) && (caStop==0); i++) {
04646     if (ca[i].IsHit(x, y)) caStop = i;
04647   }
04648 
04649   // Check that the release occurred in the same areas that was clicked
04650   if (caStop == caClicked) {
04651     switch (caClicked) {
04652     case 11:
04653       // ADF Button
04654       mesg.id = MSG_SETDATA;
04655       mesg.user.u.datatag = 'adf_';
04656       SendMessage (&mesg);
04657       break;
04658     case 12:
04659       // BFO Button
04660       mesg.id = MSG_SETDATA;
04661       mesg.user.u.datatag = 'bfo_';
04662       SendMessage (&mesg);
04663       break;
04664     case 13:
04665       // FRQ Button
04666       mesg.id = MSG_SETDATA;
04667       mesg.user.u.datatag = 'freq';
04668       SendMessage (&mesg);
04669       break;
04670     case 14:
04671       // FLT Button
04672       mesg.id = MSG_SETDATA;
04673       mesg.user.u.datatag = 'flt_';
04674       SendMessage (&mesg);
04675       break;
04676     case 15:
04677       // SET Button
04678       mesg.id = MSG_SETDATA;
04679       mesg.user.u.datatag = 'rset';
04680       SendMessage (&mesg);
04681       break;
04682     }
04683   }
04684 
04685   caClicked = 0;
04686 
04687   return rc;
04688 }
04689 
04690 void CBKADFKR87Gauge::Draw (void)
04691 {
04692   ClearSurface ();
04693   DrawUnderlay ();
04694 
04695   // Get activity status of subsystem
04696   mesg.id = MSG_GETDATA;
04697   mesg.user.u.datatag = 'actv';
04698   SendMessage (&mesg);
04699   bool active = (mesg.intData != 0);
04700   int frame = active ? 1 : 0;
04701 
04702   // Draw button images
04703   // ca11 = ADF button
04704   // ca12 = BFO button
04705   // ca13 = FRQ button
04706   // ca14 = FLT button
04707   // ca15 = SET button
04708   ca[11].Draw (surf, frame);
04709   ca[12].Draw (surf, frame);
04710   ca[13].Draw (surf, frame);
04711   ca[14].Draw (surf, frame);
04712   ca[15].Draw (surf, frame);
04713 
04714   if (active) {
04715     // Initialize font display information
04716     SFont *fttiny7 = &globals->fonts.fttiny7;
04717     SFont *ftdigi9 = &globals->fonts.ftdigi9;
04718     unsigned int amber = MakeRGB (215, 90, 0);
04719     int x, y;
04720 
04721     // Get mode flags
04722     mesg.id = MSG_GETDATA;
04723     mesg.user.u.datatag = 'iADF';
04724     SendMessage (&mesg);
04725     bool adf = (mesg.intData != 0);
04726 
04727     mesg.user.u.datatag = 'iBFO';
04728     SendMessage (&mesg);
04729     bool bfo = (mesg.intData != 0);
04730     
04731     mesg.user.u.datatag = 'iFRQ';
04732     SendMessage (&mesg);
04733     bool frq = (mesg.intData != 0);
04734 
04735     mesg.user.u.datatag = 'iFLT';
04736     SendMessage (&mesg);
04737     bool flt = (mesg.intData != 0);
04738 
04739     mesg.user.u.datatag = 'iET_';
04740     SendMessage (&mesg);
04741     bool et = (mesg.intData != 0);
04742 
04743     // Char buffers for active and standby display areas
04744     char sActive[8];
04745     char sStandby[8];
04746 
04747     // Get active frequency
04748     mesg.id = MSG_GETDATA;
04749     mesg.user.u.datatag = 'tune';
04750     SendMessage (&mesg);
04751     int freqActive = (int)(floorf (mesg.realData + 0.5));
04752     sprintf (sActive, "%04d", freqActive);
04753 
04754     // Get standby frequency/timer mode
04755     mesg.user.u.datatag = 'stby';
04756     SendMessage (&mesg);
04757     int freqStandby = (int)(floorf (mesg.realData + 0.5));
04758     sprintf (sStandby, "%04d", freqStandby);
04759 
04760     // Left-hand display is always the active tuned frequency
04761     if (adf) {
04762       // Display ADF tag
04763       x = ca[1].x1 / 2;
04764       y = ca[1].y2 + 3 - TextHeight (fttiny7, "ADF");
04765       DrawTextC (surf, fttiny7, x, y, amber, "ADF");
04766     } else {
04767       // Display ANT tag
04768       x = ca[1].x1 / 2;
04769       y = ca[1].y1 - 3;
04770       DrawTextC (surf, fttiny7, x, y, amber, "ANT");
04771     }
04772 
04773     if (bfo) {
04774       // Display BFO tag
04775       x = ca[4].x2 + 5;
04776       y = ca[5].y1 - 3;
04777       DrawText (surf, fttiny7, x, y, amber, "BFO");
04778     }
04779 
04780     // ca01 = Active digit 1
04781     DrawChar (surf, ftdigi9, ca[1].x1, ca[1].y1, amber, sActive[0]);
04782     // ca02 = Active digit 2
04783     DrawChar (surf, ftdigi9, ca[2].x1, ca[2].y1, amber, sActive[1]);
04784     // ca03 = Active digit 3
04785     DrawChar (surf, ftdigi9, ca[3].x1, ca[3].y1, amber, sActive[2]);
04786     // ca04 = Active digit 4
04787     DrawChar (surf, ftdigi9, ca[4].x1, ca[4].y1, amber, sActive[3]);
04788 
04789     // Right-hand display is either standby frequency or one of the timers
04790     if (frq) {
04791       // Display FRQ tag
04792       x = ca[5].x1 - 5;
04793       y = ca[5].y2 + 3 - TextHeight (fttiny7, "FRQ");
04794       DrawTextR (surf, fttiny7, x, y, amber, "FRQ");
04795 
04796       // ca05 = Standby digit 1
04797       DrawChar (surf, ftdigi9, ca[5].x1, ca[5].y1, amber, sStandby[0]);
04798       // ca06 = Standby digit 2
04799       DrawChar (surf, ftdigi9, ca[6].x1, ca[6].y1, amber, sStandby[1]);
04800       // ca07 = Standby digit 3
04801       DrawChar (surf, ftdigi9, ca[7].x1, ca[7].y1, amber, sStandby[2]);
04802       // ca08 = Standby digit 4
04803       DrawChar (surf, ftdigi9, ca[8].x1, ca[8].y1, amber, sStandby[3]);
04804     } else if (flt) {
04805       // Get flight timer value
04806       mesg.user.u.datatag = 'ftim';
04807       SendMessage (&mesg);
04808       int ftime = mesg.intData;
04809 
04810       // Display FLT tag
04811       x = ca[8].x2 + 15;
04812       y = ca[8].y1 - 3;
04813       DrawTextR (surf, fttiny7, x, y, amber, "FLT");
04814 
04815       // Display flight time
04816       char sTime[8];
04817       sprintf (sTime, "%02d:%02d", ftime / 60, ftime % 60);
04818       x = ca[5].x1;
04819       y = ca[5].y1;
04820       DrawText (surf, ftdigi9, x, y, amber, sTime);
04821     } else if (et) {
04822       // Get elapsed timer value
04823       mesg.user.u.datatag = 'etim';
04824       SendMessage (&mesg);
04825       int etime = mesg.intData;
04826 
04827       // Display ET tag
04828       x = ca[8].x2 + 15;
04829       y = ca[8].y2 + 3 - TextHeight (fttiny7, "ET");
04830       DrawTextR (surf, fttiny7, x, y, amber, "ET");
04831 
04832       // Display elapsed time
04833       char sTime[8];
04834       sprintf (sTime, "%02d:%02d", etime / 60, etime % 60);
04835       x = ca[5].x1;
04836       y = ca[5].y1;
04837       DrawText (surf, ftdigi9, x, y, amber, sTime);
04838     }
04839   }
04840 }
04841 
04842 
04843 //
04844 // CBKGPSKLN89Gauge
04845 //
04846 CBKGPSKLN89Gauge::CBKGPSKLN89Gauge (void)
04847 {
04848   radi = 0;
04849 }
04850 
04851 int CBKGPSKLN89Gauge::Read (SStream *stream, Tag tag)
04852 {
04853   int rc = TAG_IGNORED;
04854 
04855   switch (tag) {
04856   case 'radi':
04857     ReadTag (&radi, stream);
04858     rc = TAG_READ;
04859     break;
04860 
04861   case 'ca01':
04862     ReadFrom (&ca01, stream);
04863     rc = TAG_READ;
04864     break;
04865 
04866   case 'ca02':
04867     ReadFrom (&ca02, stream);
04868     rc = TAG_READ;
04869     break;
04870 
04871   case 'ca03':
04872     ReadFrom (&ca03, stream);
04873     rc = TAG_READ;
04874     break;
04875 
04876   case 'ca04':
04877     ReadFrom (&ca04, stream);
04878     rc = TAG_READ;
04879     break;
04880 
04881   case 'ca05':
04882     ReadFrom (&ca05, stream);
04883     rc = TAG_READ;
04884     break;
04885 
04886   case 'ca06':
04887     ReadFrom (&ca06, stream);
04888     rc = TAG_READ;
04889     break;
04890 
04891   case 'ca07':
04892     ReadFrom (&ca07, stream);
04893     rc = TAG_READ;
04894     break;
04895 
04896   case 'ca08':
04897     ReadFrom (&ca08, stream);
04898     rc = TAG_READ;
04899     break;
04900 
04901   case 'ca09':
04902     ReadFrom (&ca09, stream);
04903     rc = TAG_READ;
04904     break;
04905 
04906   case 'ca10':
04907     ReadFrom (&ca10, stream);
04908     rc = TAG_READ;
04909     break;
04910 
04911   case 'ca11':
04912     ReadFrom (&ca11, stream);
04913     rc = TAG_READ;
04914     break;
04915 
04916   case 'ca12':
04917     ReadFrom (&ca12, stream);
04918     rc = TAG_READ;
04919     break;
04920 
04921   case 'ca13':
04922     ReadFrom (&ca13, stream);
04923     rc = TAG_READ;
04924     break;
04925 
04926   case 'ca14':
04927     ReadFrom (&ca14, stream);
04928     rc = TAG_READ;
04929     break;
04930 
04931   case 'ca15':
04932     ReadFrom (&ca15, stream);
04933     rc = TAG_READ;
04934     break;
04935 
04936   case 'ca16':
04937     ReadFrom (&ca16, stream);
04938     rc = TAG_READ;
04939     break;
04940 
04941   case 'ca17':
04942     ReadFrom (&ca17, stream);
04943     rc = TAG_READ;
04944     break;
04945 
04946   case 'ca18':
04947     ReadFrom (&ca18, stream);
04948     rc = TAG_READ;
04949     break;
04950 
04951   case 'ca19':
04952     ReadFrom (&ca19, stream);
04953     rc = TAG_READ;
04954     break;
04955 
04956   case 'ca20':
04957     ReadFrom (&ca20, stream);
04958     rc = TAG_READ;
04959     break;
04960 
04961   case 'ca21':
04962     ReadFrom (&ca21, stream);
04963     rc = TAG_READ;
04964     break;
04965 
04966   case 'ca22':
04967     ReadFrom (&ca22, stream);
04968     rc = TAG_READ;
04969     break;
04970   }
04971 
04972   if (rc == TAG_IGNORED) {
04973     rc = CBitmapGauge::Read (stream, tag);
04974   }
04975 
04976   if (rc == TAG_IGNORED) {
04977     char s[64];
04978     TagToString (s, tag);
04979     globals->logWarning->Write ("CBKGPSKLN89Gauge::Read : Unknown tag %s", s);
04980   }
04981 
04982   return rc;
04983 }
04984 
04985 
04986 ECursorResult CBKGPSKLN89Gauge::MouseMoved (int x, int y)
04987 {
04988   ECursorResult rc = CURSOR_NOT_CHANGED;
04989 
04990   // Send updated mouse position to all click areas
04991   rc = ca01.MouseMoved (x, y);
04992   if (rc == CURSOR_NOT_CHANGED) rc = ca02.MouseMoved (x, y);
04993   if (rc == CURSOR_NOT_CHANGED) rc = ca03.MouseMoved (x, y);
04994   if (rc == CURSOR_NOT_CHANGED) rc = ca04.MouseMoved (x, y);
04995   if (rc == CURSOR_NOT_CHANGED) rc = ca05.MouseMoved (x, y);
04996   if (rc == CURSOR_NOT_CHANGED) rc = ca06.MouseMoved (x, y);
04997   if (rc == CURSOR_NOT_CHANGED) rc = ca07.MouseMoved (x, y);
04998   if (rc == CURSOR_NOT_CHANGED) rc = ca08.MouseMoved (x, y);
04999   if (rc == CURSOR_NOT_CHANGED) rc = ca09.MouseMoved (x, y);
05000   if (rc == CURSOR_NOT_CHANGED) rc = ca10.MouseMoved (x, y);
05001   if (rc == CURSOR_NOT_CHANGED) rc = ca11.MouseMoved (x, y);
05002   if (rc == CURSOR_NOT_CHANGED) rc = ca12.MouseMoved (x, y);
05003   if (rc == CURSOR_NOT_CHANGED) rc = ca13.MouseMoved (x, y);
05004   if (rc == CURSOR_NOT_CHANGED) rc = ca14.MouseMoved (x, y);
05005   if (rc == CURSOR_NOT_CHANGED) rc = ca15.MouseMoved (x, y);
05006   if (rc == CURSOR_NOT_CHANGED) rc = ca16.MouseMoved (x, y);
05007   if (rc == CURSOR_NOT_CHANGED) rc = ca17.MouseMoved (x, y);
05008   if (rc == CURSOR_NOT_CHANGED) rc = ca18.MouseMoved (x, y);
05009   if (rc == CURSOR_NOT_CHANGED) rc = ca19.MouseMoved (x, y);
05010   if (rc == CURSOR_NOT_CHANGED) rc = ca20.MouseMoved (x, y);
05011   if (rc == CURSOR_NOT_CHANGED) rc = ca21.MouseMoved (x, y);
05012   if (rc == CURSOR_NOT_CHANGED) rc = ca22.MouseMoved (x, y);
05013 
05014   // Call parent method if cursor not changed
05015   if (rc == CURSOR_NOT_CHANGED) {
05016     rc = CBitmapGauge::MouseMoved (x, y);
05017   }
05018 
05019   return rc;
05020 }
05021 
05022 
05023 //
05024 // CBKAP140Gauge
05025 //
05026 CBKAP140Gauge::CBKAP140Gauge (void)
05027 {
05028   nClickAreas = 6;
05029   caClicked = 0;
05030 }
05031 
05032 int CBKAP140Gauge::Read (SStream *stream, Tag tag)
05033 {
05034   int rc = TAG_IGNORED;
05035 
05036   // Check for click area tags
05037   int ica = ClickAreaFromTag (tag);
05038   if ((ica >= 1) && (ica <= nClickAreas)) {
05039     // Valid click area
05040     ReadFrom (&ca[ica], stream);
05041     rc = TAG_READ;
05042   }
05043 
05044   if (rc == TAG_IGNORED) {
05045     rc = CBitmapGauge::Read (stream, tag);
05046   }
05047 
05048   if (rc == TAG_IGNORED) {
05049     char s[64];
05050     TagToString (s, tag);
05051     globals->logWarning->Write ("CBKAP140Gauge::Read : Unknown tag %s", s);
05052   }
05053 
05054   return rc;
05055 }
05056 
05057 ECursorResult CBKAP140Gauge::MouseMoved (int x, int y)
05058 {
05059   ECursorResult rc = CURSOR_NOT_CHANGED;
05060 
05061   // Send updated mouse position to all click areas
05062   for (int i=1; i<=nClickAreas && (rc == CURSOR_NOT_CHANGED); i++) {
05063     rc = ca[i].MouseMoved (x, y);
05064   }
05065 
05066   // Call parent method if cursor not changed
05067   if (rc == CURSOR_NOT_CHANGED) {
05068     rc = CBitmapGauge::MouseMoved (x, y);
05069   }
05070 
05071   return rc;
05072 }
05073 
05074 void CBKAP140Gauge::Draw (void)
05075 {
05076   ClearSurface ();
05077   DrawUnderlay ();
05078 
05079   // Get activity status of subsystem
05080   mesg.id = MSG_GETDATA;
05081   mesg.user.u.datatag = 'actv';
05082   SendMessage (&mesg);
05083   bool active = (mesg.intData != 0);
05084   int frame = active ? 1 : 0;
05085 
05086   // Draw button images
05087   // ca01 = AP button
05088   // ca02 = HDG button
05089   // ca03 = NAV button
05090   // ca04 = APR button
05091   // ca05 = RVS button
05092   ca[1].Draw (surf, frame);
05093   ca[2].Draw (surf, frame);
05094   ca[3].Draw (surf, frame);
05095   ca[4].Draw (surf, frame);
05096   ca[5].Draw (surf, frame);
05097 
05098   if (active) {
05099     // ca06 = Engage button
05100   }
05101 }
05102 
05103 
05104 //
05105 // CBKKFC200Gauge
05106 //
05107 CBKKFC200Gauge::CBKKFC200Gauge (void)
05108 {
05109   strcpy (fd.art, "");
05110   fd.x = fd.y = 0;
05111 
05112   strcpy (alt.art, "");
05113   alt.x = alt.y = 0;
05114 
05115   strcpy (hdg.art, "");
05116   hdg.x = hdg.y = 0;
05117 
05118   strcpy (gs.art, "");
05119   gs.x = gs.y = 0;
05120 
05121   strcpy (nav.art, "");
05122   nav.x = nav.y = 0;
05123 
05124   strcpy (apr.art, "");
05125   apr.x = apr.y = 0;
05126 
05127   strcpy (bc.art, "");
05128   bc.x = bc.y = 0;
05129 
05130   strcpy (trim.art, "");
05131   trim.x = trim.y = 0;
05132 
05133   strcpy (ap.art, "");
05134   ap.x = ap.y = 0;
05135 }
05136 
05137 int CBKKFC200Gauge::Read (SStream *stream, Tag tag)
05138 {
05139   int rc = TAG_IGNORED;
05140 
05141   switch (tag) {
05142   case 'ca01':
05143     ReadFrom (&ca01, stream);
05144     rc = TAG_READ;
05145     break;
05146 
05147   case 'ca02':
05148     ReadFrom (&ca02, stream);
05149     rc = TAG_READ;
05150     break;
05151 
05152   case 'ca03':
05153     ReadFrom (&ca03, stream);
05154     rc = TAG_READ;
05155     break;
05156 
05157   case 'ca04':
05158     ReadFrom (&ca04, stream);
05159     rc = TAG_READ;
05160     break;
05161 
05162   case 'ca05':
05163     ReadFrom (&ca05, stream);
05164     rc = TAG_READ;
05165     break;
05166 
05167   case 'ca06':
05168     ReadFrom (&ca06, stream);
05169     rc = TAG_READ;
05170     break;
05171 
05172   case 'ca07':
05173     ReadFrom (&ca07, stream);
05174     rc = TAG_READ;
05175     break;
05176 
05177   case 'ca08':
05178     ReadFrom (&ca08, stream);
05179     rc = TAG_READ;
05180     break;
05181 
05182   case 'ca09':
05183     ReadFrom (&ca09, stream);
05184     rc = TAG_READ;
05185     break;
05186 
05187   case 'ca10':
05188     ReadFrom (&ca10, stream);
05189     rc = TAG_READ;
05190     break;
05191 
05192   case 'ca11':
05193     ReadFrom (&ca11, stream);
05194     rc = TAG_READ;
05195     break;
05196 
05197   case 'fd__':
05198     ReadString (fd.art, 64, stream);
05199     ReadInt (&fd.x, stream);
05200     ReadInt (&fd.y, stream);
05201     rc = TAG_READ;
05202     break;
05203 
05204   case 'alt_':
05205     ReadString (alt.art, 64, stream);
05206     ReadInt (&alt.x, stream);
05207     ReadInt (&alt.y, stream);
05208     rc = TAG_READ;
05209     break;
05210 
05211   case 'hdg_':
05212     ReadString (hdg.art, 64, stream);
05213     ReadInt (&hdg.x, stream);
05214     ReadInt (&hdg.y, stream);
05215     rc = TAG_READ;
05216     break;
05217 
05218   case 'gs__':
05219     ReadString (gs.art, 64, stream);
05220     ReadInt (&gs.x, stream);
05221     ReadInt (&gs.y, stream);
05222     rc = TAG_READ;
05223     break;
05224 
05225   case 'nav_':
05226     ReadString (nav.art, 64, stream);
05227     ReadInt (&nav.x, stream);
05228     ReadInt (&nav.y, stream);
05229     rc = TAG_READ;
05230     break;
05231 
05232   case 'apr_':
05233     ReadString (apr.art, 64, stream);
05234     ReadInt (&apr.x, stream);
05235     ReadInt (&apr.y, stream);
05236     rc = TAG_READ;
05237     break;
05238 
05239   case 'bc__':
05240     ReadString (bc.art, 64, stream);
05241     ReadInt (&bc.x, stream);
05242     ReadInt (&bc.y, stream);
05243     rc = TAG_READ;
05244     break;
05245 
05246   case 'trim':
05247     ReadString (trim.art, 64, stream);
05248     ReadInt (&trim.x, stream);
05249     ReadInt (&trim.y, stream);
05250     rc = TAG_READ;
05251     break;
05252 
05253   case 'ap__':
05254     ReadString (ap.art, 64, stream);
05255     ReadInt (&ap.x, stream);
05256     ReadInt (&ap.y, stream);
05257     rc = TAG_READ;
05258     break;
05259   }
05260 
05261   if (rc == TAG_IGNORED) {
05262     rc = CBitmapGauge::Read (stream, tag);
05263   }
05264 
05265   if (rc == TAG_IGNORED) {
05266     char s[64];
05267     TagToString (s, tag);
05268     globals->logWarning->Write ("CBKKFC200Gauge::Read : Unknown tag %s", s);
05269   }
05270 
05271   return rc;
05272 }
05273 
05274 ECursorResult CBKKFC200Gauge::MouseMoved (int x, int y)
05275 {
05276   ECursorResult rc = CURSOR_NOT_CHANGED;
05277 
05278   // Send updated mouse position to all click areas
05279   rc = ca01.MouseMoved (x, y);
05280   if (rc == CURSOR_NOT_CHANGED) rc = ca02.MouseMoved (x, y);
05281   if (rc == CURSOR_NOT_CHANGED) rc = ca03.MouseMoved (x, y);
05282   if (rc == CURSOR_NOT_CHANGED) rc = ca04.MouseMoved (x, y);
05283   if (rc == CURSOR_NOT_CHANGED) rc = ca05.MouseMoved (x, y);
05284   if (rc == CURSOR_NOT_CHANGED) rc = ca06.MouseMoved (x, y);
05285   if (rc == CURSOR_NOT_CHANGED) rc = ca07.MouseMoved (x, y);
05286   if (rc == CURSOR_NOT_CHANGED) rc = ca08.MouseMoved (x, y);
05287   if (rc == CURSOR_NOT_CHANGED) rc = ca09.MouseMoved (x, y);
05288   if (rc == CURSOR_NOT_CHANGED) rc = ca10.MouseMoved (x, y);
05289   if (rc == CURSOR_NOT_CHANGED) rc = ca11.MouseMoved (x, y);
05290 
05291   // Call parent method if cursor not changed
05292   if (rc == CURSOR_NOT_CHANGED) {
05293     rc = CBitmapGauge::MouseMoved (x, y);
05294   }
05295 
05296   return rc;
05297 }
05298 
05299 
05300 //
05301 // CBKKFC150Gauge
05302 //
05303 CBKKFC150Gauge::CBKKFC150Gauge (void)
05304 {
05305   strcpy (fd.art, "");
05306   fd.x = fd.y = 0;
05307 
05308   strcpy (alt.art, "");
05309   alt.x = alt.y = 0;
05310 
05311   strcpy (hdg.art, "");
05312   hdg.x = hdg.y = 0;
05313 
05314   strcpy (gs.art, "");
05315   gs.x = gs.y = 0;
05316 
05317   strcpy (nav.art, "");
05318   nav.x = nav.y = 0;
05319 
05320   strcpy (apr.art, "");
05321   apr.x = apr.y = 0;
05322 
05323   strcpy (bc.art, "");
05324   bc.x = bc.y = 0;
05325 
05326   strcpy (trim.art, "");
05327   trim.x = trim.y = 0;
05328 
05329   strcpy (ap.art, "");
05330   ap.x = ap.y = 0;
05331 }
05332 
05333 int CBKKFC150Gauge::Read (SStream *stream, Tag tag)
05334 {
05335   int rc = TAG_IGNORED;
05336 
05337   switch (tag) {
05338   case 'ca01':
05339     ReadFrom (&ca01, stream);
05340     rc = TAG_READ;
05341     break;
05342 
05343   case 'ca02':
05344     ReadFrom (&ca02, stream);
05345     rc = TAG_READ;
05346     break;
05347 
05348   case 'ca03':
05349     ReadFrom (&ca03, stream);
05350     rc = TAG_READ;
05351     break;
05352 
05353   case 'ca04':
05354     ReadFrom (&ca04, stream);
05355     rc = TAG_READ;
05356     break;
05357 
05358   case 'ca05':
05359     ReadFrom (&ca05, stream);
05360     rc = TAG_READ;
05361     break;
05362 
05363   case 'ca06':
05364     ReadFrom (&ca06, stream);
05365     rc = TAG_READ;
05366     break;
05367 
05368   case 'ca07':
05369     ReadFrom (&ca07, stream);
05370     rc = TAG_READ;
05371     break;
05372 
05373   case 'ca08':
05374     ReadFrom (&ca08, stream);
05375     rc = TAG_READ;
05376     break;
05377 
05378   case 'ca09':
05379     ReadFrom (&ca09, stream);
05380     rc = TAG_READ;
05381     break;
05382 
05383   case 'ca10':
05384     ReadFrom (&ca10, stream);
05385     rc = TAG_READ;
05386     break;
05387 
05388   case 'ca11':
05389     ReadFrom (&ca11, stream);
05390     rc = TAG_READ;
05391     break;
05392 
05393   case 'fd__':
05394     ReadString (fd.art, 64, stream);
05395     ReadInt (&fd.x, stream);
05396     ReadInt (&fd.y, stream);
05397     rc = TAG_READ;
05398     break;
05399 
05400   case 'alt_':
05401     ReadString (alt.art, 64, stream);
05402     ReadInt (&alt.x, stream);
05403     ReadInt (&alt.y, stream);
05404     rc = TAG_READ;
05405     break;
05406 
05407   case 'hdg_':
05408     ReadString (hdg.art, 64, stream);
05409     ReadInt (&hdg.x, stream);
05410     ReadInt (&hdg.y, stream);
05411     rc = TAG_READ;
05412     break;
05413 
05414   case 'gs__':
05415     ReadString (gs.art, 64, stream);
05416     ReadInt (&gs.x, stream);
05417     ReadInt (&gs.y, stream);
05418     rc = TAG_READ;
05419     break;
05420 
05421   case 'nav_':
05422     ReadString (nav.art, 64, stream);
05423     ReadInt (&nav.x, stream);
05424     ReadInt (&nav.y, stream);
05425     rc = TAG_READ;
05426     break;
05427 
05428   case 'apr_':
05429     ReadString (apr.art, 64, stream);
05430     ReadInt (&apr.x, stream);
05431     ReadInt (&apr.y, stream);
05432     rc = TAG_READ;
05433     break;
05434 
05435   case 'bc__':
05436     ReadString (bc.art, 64, stream);
05437     ReadInt (&bc.x, stream);
05438     ReadInt (&bc.y, stream);
05439     rc = TAG_READ;
05440     break;
05441 
05442   case 'trim':
05443     ReadString (trim.art, 64, stream);
05444     ReadInt (&trim.x, stream);
05445     ReadInt (&trim.y, stream);
05446     rc = TAG_READ;
05447     break;
05448 
05449   case 'ap__':
05450     ReadString (ap.art, 64, stream);
05451     ReadInt (&ap.x, stream);
05452     ReadInt (&ap.y, stream);
05453     rc = TAG_READ;
05454     break;
05455   }
05456 
05457   if (rc == TAG_IGNORED) {
05458     rc = CBitmapGauge::Read (stream, tag);
05459   }
05460 
05461   if (rc == TAG_IGNORED) {
05462     char s[64];
05463     TagToString (s, tag);
05464     globals->logWarning->Write ("CBKKFC150Gauge::Read : Unknown tag %s", s);
05465   }
05466 
05467   return rc;
05468 }
05469 
05470 ECursorResult CBKKFC150Gauge::MouseMoved (int x, int y)
05471 {
05472   ECursorResult rc = CURSOR_NOT_CHANGED;
05473 
05474   // Send updated mouse position to all click areas
05475   rc = ca01.MouseMoved (x, y);
05476   if (rc == CURSOR_NOT_CHANGED) rc = ca02.MouseMoved (x, y);
05477   if (rc == CURSOR_NOT_CHANGED) rc = ca03.MouseMoved (x, y);
05478   if (rc == CURSOR_NOT_CHANGED) rc = ca04.MouseMoved (x, y);
05479   if (rc == CURSOR_NOT_CHANGED) rc = ca05.MouseMoved (x, y);
05480   if (rc == CURSOR_NOT_CHANGED) rc = ca06.MouseMoved (x, y);
05481   if (rc == CURSOR_NOT_CHANGED) rc = ca07.MouseMoved (x, y);
05482   if (rc == CURSOR_NOT_CHANGED) rc = ca08.MouseMoved (x, y);
05483   if (rc == CURSOR_NOT_CHANGED) rc = ca09.MouseMoved (x, y);
05484   if (rc == CURSOR_NOT_CHANGED) rc = ca10.MouseMoved (x, y);
05485   if (rc == CURSOR_NOT_CHANGED) rc = ca11.MouseMoved (x, y);
05486 
05487   // Call parent method if cursor not changed
05488   if (rc == CURSOR_NOT_CHANGED) {
05489     rc = CBitmapGauge::MouseMoved (x, y);
05490   }
05491 
05492   return rc;
05493 }
05494 
05495 
05496 //
05497 // CBKAudioKMA26Gauge
05498 //
05499 CBKAudioKMA26Gauge::CBKAudioKMA26Gauge (void)
05500 {
05501   radi = 0;
05502 }
05503 
05504 int CBKAudioKMA26Gauge::Read (SStream *stream, Tag tag)
05505 {
05506   int rc = TAG_IGNORED;
05507 
05508   switch (tag) {
05509   case 'radi':
05510     ReadTag (&radi, stream);
05511     rc = TAG_READ;
05512     break;
05513 
05514   case 'ca01':
05515     ReadFrom (&ca01, stream);
05516     rc = TAG_READ;
05517     break;
05518 
05519   case 'ca02':
05520     ReadFrom (&ca02, stream);
05521     rc = TAG_READ;
05522     break;
05523 
05524   case 'ca03':
05525     ReadFrom (&ca03, stream);
05526     rc = TAG_READ;
05527     break;
05528 
05529   case 'ca04':
05530     ReadFrom (&ca04, stream);
05531     rc = TAG_READ;
05532     break;
05533 
05534   case 'ca05':
05535     ReadFrom (&ca05, stream);
05536     rc = TAG_READ;
05537     break;
05538 
05539   case 'ca06':
05540     ReadFrom (&ca06, stream);
05541     rc = TAG_READ;
05542     break;
05543 
05544   case 'ca07':
05545     ReadFrom (&ca07, stream);
05546     rc = TAG_READ;
05547     break;
05548 
05549   case 'ca08':
05550     ReadFrom (&ca08, stream);
05551     rc = TAG_READ;
05552     break;
05553 
05554   case 'ca09':
05555     ReadFrom (&ca09, stream);
05556     rc = TAG_READ;
05557     break;
05558 
05559   case 'ca10':
05560     ReadFrom (&ca10, stream);
05561     rc = TAG_READ;
05562     break;
05563 
05564   case 'ca11':
05565     ReadFrom (&ca11, stream);
05566     rc = TAG_READ;
05567     break;
05568 
05569   case 'ca12':
05570     ReadFrom (&ca12, stream);
05571     rc = TAG_READ;
05572     break;
05573 
05574   case 'ca13':
05575     ReadFrom (&ca13, stream);
05576     rc = TAG_READ;
05577     break;
05578 
05579   case 'ca14':
05580     ReadFrom (&ca14, stream);
05581     rc = TAG_READ;
05582     break;
05583 
05584   case 'ca15':
05585     ReadFrom (&ca15, stream);
05586     rc = TAG_READ;
05587     break;
05588   }
05589 
05590   if (rc == TAG_IGNORED) {
05591     rc = CBitmapGauge::Read (stream, tag);
05592   }
05593 
05594   if (rc == TAG_IGNORED) {
05595     char s[64];
05596     TagToString (s, tag);
05597     globals->logWarning->Write ("CBKKMA26Gauge::Read : Unknown tag %s", s);
05598   }
05599 
05600   return rc;
05601 }
05602 
05603 ECursorResult CBKAudioKMA26Gauge::MouseMoved (int x, int y)
05604 {
05605   ECursorResult rc = CURSOR_NOT_CHANGED;
05606 
05607   // Send updated mouse position to all click areas
05608   rc = ca01.MouseMoved (x, y);
05609   if (rc == CURSOR_NOT_CHANGED) rc = ca02.MouseMoved (x, y);
05610   if (rc == CURSOR_NOT_CHANGED) rc = ca03.MouseMoved (x, y);
05611   if (rc == CURSOR_NOT_CHANGED) rc = ca04.MouseMoved (x, y);
05612   if (rc == CURSOR_NOT_CHANGED) rc = ca05.MouseMoved (x, y);
05613   if (rc == CURSOR_NOT_CHANGED) rc = ca06.MouseMoved (x, y);
05614   if (rc == CURSOR_NOT_CHANGED) rc = ca07.MouseMoved (x, y);
05615   if (rc == CURSOR_NOT_CHANGED) rc = ca08.MouseMoved (x, y);
05616   if (rc == CURSOR_NOT_CHANGED) rc = ca09.MouseMoved (x, y);
05617   if (rc == CURSOR_NOT_CHANGED) rc = ca10.MouseMoved (x, y);
05618   if (rc == CURSOR_NOT_CHANGED) rc = ca11.MouseMoved (x, y);
05619   if (rc == CURSOR_NOT_CHANGED) rc = ca12.MouseMoved (x, y);
05620   if (rc == CURSOR_NOT_CHANGED) rc = ca13.MouseMoved (x, y);
05621   if (rc == CURSOR_NOT_CHANGED) rc = ca14.MouseMoved (x, y);
05622   if (rc == CURSOR_NOT_CHANGED) rc = ca15.MouseMoved (x, y);
05623 
05624   // Call parent method if cursor not changed
05625   if (rc == CURSOR_NOT_CHANGED) {
05626     rc = CBitmapGauge::MouseMoved (x, y);
05627   }
05628 
05629   return rc;
05630 }
05631 
05632 
05633 //
05634 // CGenericNavRadioGauge
05635 //
05636 CGenericNavRadioGauge::CGenericNavRadioGauge (void)
05637 {
05638   radi_tag = 0;
05639   radi_unit = 0;
05640   sdim = false;
05641 }
05642 
05643 int CGenericNavRadioGauge::Read (SStream *stream, Tag tag)
05644 {
05645   int rc = TAG_IGNORED;
05646 
05647   switch (tag) {
05648   case 'radi':
05649     ReadTag (&radi_tag, stream);
05650     ReadInt (&radi_unit, stream);
05651     rc = TAG_READ;
05652     break;
05653 
05654   case 'ca01':
05655     ReadFrom (&ca01, stream);
05656     rc = TAG_READ;
05657     break;
05658 
05659   case 'ca02':
05660     ReadFrom (&ca02, stream);
05661     rc = TAG_READ;
05662     break;
05663 
05664   case 'ca03':
05665     ReadFrom (&ca03, stream);
05666     rc = TAG_READ;
05667     break;
05668 
05669   case 'ca04':
05670     ReadFrom (&ca04, stream);
05671     rc = TAG_READ;
05672     break;
05673 
05674   case 'ca05':
05675     ReadFrom (&ca05, stream);
05676     rc = TAG_READ;
05677     break;
05678 
05679   case 'ca06':
05680     ReadFrom (&ca06, stream);
05681     rc = TAG_READ;
05682     break;
05683 
05684   case 'sdim':
05685     sdim = true;
05686     rc = TAG_READ;
05687     break;
05688   }
05689 
05690   if (rc == TAG_IGNORED) {
05691     rc = CBitmapGauge::Read (stream, tag);
05692   }
05693 
05694   if (rc == TAG_IGNORED) {
05695     char s[64];
05696     TagToString (s, tag);
05697     globals->logWarning->Write ("CGenericNavRadioGauge::Read : Unknown tag %s", s);
05698   }
05699 
05700   return rc;
05701 }
05702 
05703 
05704 ECursorResult CGenericNavRadioGauge::MouseMoved (int x, int y)
05705 {
05706   ECursorResult rc = CURSOR_NOT_CHANGED;
05707 
05708   // Send updated mouse position to all click areas
05709   rc = ca01.MouseMoved (x, y);
05710   if (rc == CURSOR_NOT_CHANGED) rc = ca02.MouseMoved (x, y);
05711   if (rc == CURSOR_NOT_CHANGED) rc = ca03.MouseMoved (x, y);
05712   if (rc == CURSOR_NOT_CHANGED) rc = ca04.MouseMoved (x, y);
05713   if (rc == CURSOR_NOT_CHANGED) rc = ca05.MouseMoved (x, y);
05714   if (rc == CURSOR_NOT_CHANGED) rc = ca06.MouseMoved (x, y);
05715 
05716   // Call parent method if cursor not changed
05717   if (rc == CURSOR_NOT_CHANGED) {
05718     rc = CBitmapGauge::MouseMoved (x, y);
05719   }
05720 
05721   return rc;
05722 }
05723 
05724 
05725 //
05726 // CGenericCommRadioGauge
05727 //
05728 CGenericCommRadioGauge::CGenericCommRadioGauge (void)
05729 {
05730   radi_tag = 0;
05731   radi_unit = 0;
05732   sdim = false;
05733 }
05734 
05735 int CGenericCommRadioGauge::Read (SStream *stream, Tag tag)
05736 {
05737   int rc = TAG_IGNORED;
05738 
05739   switch (tag) {
05740   case 'radi':
05741     ReadTag (&radi_tag, stream);
05742     ReadInt (&radi_unit, stream);
05743     rc = TAG_READ;
05744     break;
05745 
05746   case 'ca01':
05747     ReadFrom (&ca01, stream);
05748     rc = TAG_READ;
05749     break;
05750 
05751   case 'ca02':
05752     ReadFrom (&ca02, stream);
05753     rc = TAG_READ;
05754     break;
05755 
05756   case 'ca03':
05757     ReadFrom (&ca03, stream);
05758     rc = TAG_READ;
05759     break;
05760 
05761   case 'ca04':
05762     ReadFrom (&ca04, stream);
05763     rc = TAG_READ;
05764     break;
05765 
05766   case 'ca05':
05767     ReadFrom (&ca05, stream);
05768     rc = TAG_READ;
05769     break;
05770 
05771   case 'ca06':
05772     ReadFrom (&ca06, stream);
05773     rc = TAG_READ;
05774     break;
05775 
05776   case 'sdim':
05777     sdim = true;
05778     rc = TAG_READ;
05779     break;
05780   }
05781 
05782   if (rc == TAG_IGNORED) {
05783     rc = CBitmapGauge::Read (stream, tag);
05784   }
05785 
05786   if (rc == TAG_IGNORED) {
05787     char s[64];
05788     TagToString (s, tag);
05789     globals->logWarning->Write ("CGenericCommRadioGauge::Read : Unknown tag %s", s);
05790   }
05791 
05792   return rc;
05793 }
05794 
05795 ECursorResult CGenericCommRadioGauge::MouseMoved (int x, int y)
05796 {
05797   ECursorResult rc = CURSOR_NOT_CHANGED;
05798 
05799   // Send updated mouse position to all click areas
05800   rc = ca01.MouseMoved (x, y);
05801   if (rc == CURSOR_NOT_CHANGED) rc = ca02.MouseMoved (x, y);
05802   if (rc == CURSOR_NOT_CHANGED) rc = ca03.MouseMoved (x, y);
05803   if (rc == CURSOR_NOT_CHANGED) rc = ca04.MouseMoved (x, y);
05804   if (rc == CURSOR_NOT_CHANGED) rc = ca05.MouseMoved (x, y);
05805   if (rc == CURSOR_NOT_CHANGED) rc = ca06.MouseMoved (x, y);
05806 
05807   // Call parent method if cursor not changed
05808   if (rc == CURSOR_NOT_CHANGED) {
05809     rc = CBitmapGauge::MouseMoved (x, y);
05810   }
05811 
05812   return rc;
05813 }
05814 
05815 
05816 //
05817 // CGenericTransponderGauge
05818 //
05819 CGenericTransponderGauge::CGenericTransponderGauge (void)
05820 {
05821   radi_tag = 0;
05822   radi_unit = 0;
05823 }
05824 
05825 int CGenericTransponderGauge::Read (SStream *stream, Tag tag)
05826 {
05827   int rc = TAG_IGNORED;
05828 
05829   switch (tag) {
05830   case 'radi':
05831     ReadTag (&radi_tag, stream);
05832     ReadInt (&radi_unit, stream);
05833     rc = TAG_READ;
05834     break;
05835 
05836   case 'tune':
05837     ReadFrom (&tune, stream);
05838     rc = TAG_READ;
05839     break;
05840 
05841   case 'mode':
05842     ReadFrom (&mode, stream);
05843     rc = TAG_READ;
05844     break;
05845 
05846   case 'idnt':
05847     ReadFrom (&idnt, stream);
05848     rc = TAG_READ;
05849     break;
05850 
05851   case 'test':
05852     ReadFrom (&test, stream);
05853     rc = TAG_READ;
05854     break;
05855 
05856   case 'ida1':
05857     ReadFrom (&ida1, stream);
05858     rc = TAG_READ;
05859     break;
05860 
05861   case 'ida2':
05862     ReadFrom (&ida2, stream);
05863     rc = TAG_READ;
05864     break;
05865 
05866   case 'ida3':
05867     ReadFrom (&ida3, stream);
05868     rc = TAG_READ;
05869     break;
05870 
05871   case 'ida4':
05872     ReadFrom (&ida4, stream);
05873     rc = TAG_READ;
05874     break;
05875 
05876   case 'idb1':
05877     ReadFrom (&idb1, stream);
05878     rc = TAG_READ;
05879     break;
05880 
05881   case 'idb2':
05882     ReadFrom (&idb2, stream);
05883     rc = TAG_READ;
05884     break;
05885 
05886   case 'idb3':
05887     ReadFrom (&idb3, stream);
05888     rc = TAG_READ;
05889     break;
05890 
05891   case 'idb4':
05892     ReadFrom (&idb4, stream);
05893     rc = TAG_READ;
05894     break;
05895   }
05896 
05897   if (rc == TAG_IGNORED) {
05898     rc = CBitmapGauge::Read (stream, tag);
05899   }
05900 
05901   if (rc == TAG_IGNORED) {
05902     char s[64];
05903     TagToString (s, tag);
05904     globals->logWarning->Write ("CGenericTransponderGauge::Read : Unknown tag %s", s);
05905   }
05906 
05907   return rc;
05908 }
05909 
05910 
05911 ECursorResult CGenericTransponderGauge::MouseMoved (int x, int y)
05912 {
05913   ECursorResult rc = CURSOR_NOT_CHANGED;
05914 
05915   // Send updated mouse position to all click areas
05916   if (rc == CURSOR_NOT_CHANGED) rc = tune.MouseMoved (x, y);
05917   if (rc == CURSOR_NOT_CHANGED) rc = mode.MouseMoved (x, y);
05918   if (rc == CURSOR_NOT_CHANGED) rc = idnt.MouseMoved (x, y);
05919   if (rc == CURSOR_NOT_CHANGED) rc = test.MouseMoved (x, y);
05920   if (rc == CURSOR_NOT_CHANGED) rc = ida1.MouseMoved (x, y);
05921   if (rc == CURSOR_NOT_CHANGED) rc = ida2.MouseMoved (x, y);
05922   if (rc == CURSOR_NOT_CHANGED) rc = ida3.MouseMoved (x, y);
05923   if (rc == CURSOR_NOT_CHANGED) rc = ida4.MouseMoved (x, y);
05924   if (rc == CURSOR_NOT_CHANGED) rc = idb1.MouseMoved (x, y);
05925   if (rc == CURSOR_NOT_CHANGED) rc = idb2.MouseMoved (x, y);
05926   if (rc == CURSOR_NOT_CHANGED) rc = idb3.MouseMoved (x, y);
05927   if (rc == CURSOR_NOT_CHANGED) rc = idb4.MouseMoved (x, y);
05928 
05929   // Call parent method if cursor not changed
05930   if (rc == CURSOR_NOT_CHANGED) {
05931     rc = CBitmapGauge::MouseMoved (x, y);
05932   }
05933 
05934   return rc;
05935 }
05936 
05937 
05938 
05939 //
05940 // CGenericADFRadioGauge
05941 //
05942 CGenericADFRadioGauge::CGenericADFRadioGauge (void)
05943 {
05944   radi_tag = 0;
05945   radi_unit = 0;
05946   sdim = false;
05947 }
05948 
05949 int CGenericADFRadioGauge::Read (SStream *stream, Tag tag)
05950 {
05951   int rc = TAG_IGNORED;
05952 
05953   switch (tag) {
05954   case 'radi':
05955     ReadTag (&radi_tag, stream);
05956     ReadInt (&radi_unit, stream);
05957     rc = TAG_READ;
05958     break;
05959 
05960   case 'dga1':
05961     ReadFrom (&dga1, stream);
05962     rc = TAG_READ;
05963     break;
05964 
05965   case 'dga2':
05966     ReadFrom (&dga2, stream);
05967     rc = TAG_READ;
05968     break;
05969 
05970   case 'dga3':
05971     ReadFrom (&dga3, stream);
05972     rc = TAG_READ;
05973     break;
05974 
05975   case 'dga4':
05976     ReadFrom (&dga4, stream);
05977     rc = TAG_READ;
05978     break;
05979 
05980   case 'dga5':
05981     ReadFrom (&dga5, stream);
05982     rc = TAG_READ;
05983     break;
05984 
05985   case 'dgb1':
05986     ReadFrom (&dgb1, stream);
05987     rc = TAG_READ;
05988     break;
05989 
05990   case 'dgb2':
05991     ReadFrom (&dgb2, stream);
05992     rc = TAG_READ;
05993     break;
05994 
05995   case 'dgb3':
05996     ReadFrom (&dgb3, stream);
05997     rc = TAG_READ;
05998     break;
05999 
06000   case 'dgb4':
06001     ReadFrom (&dgb4, stream);
06002     rc = TAG_READ;
06003     break;
06004 
06005   case 'dgb5':
06006     ReadFrom (&dgb5, stream);
06007     rc = TAG_READ;
06008     break;
06009 
06010   case 'tune':
06011     ReadFrom (&tune, stream);
06012     rc = TAG_READ;
06013     break;
06014 
06015   case 'mode':
06016     ReadFrom (&mode, stream);
06017     rc = TAG_READ;
06018     break;
06019 
06020   case 'stor':
06021     ReadFrom (&stor, stream);
06022     rc = TAG_READ;
06023     break;
06024 
06025   case 'test':
06026     ReadFrom (&test, stream);
06027     rc = TAG_READ;
06028     break;
06029 
06030 
06031   case 'sdim':
06032     sdim = true;
06033     rc = TAG_READ;
06034     break;
06035   }
06036 
06037   if (rc == TAG_IGNORED) {
06038     rc = CBitmapGauge::Read (stream, tag);
06039   }
06040 
06041   if (rc == TAG_IGNORED) {
06042     char s[64];
06043     TagToString (s, tag);
06044     globals->logWarning->Write ("CGenericADFRadioGauge::Read : Unknown tag %s", s);
06045   }
06046 
06047   return rc;
06048 }
06049 
06050 ECursorResult CGenericADFRadioGauge::MouseMoved (int x, int y)
06051 {
06052   ECursorResult rc = CURSOR_NOT_CHANGED;
06053 
06054   // Send updated mouse position to all click areas
06055   if (rc == CURSOR_NOT_CHANGED) rc = dga1.MouseMoved (x, y);
06056   if (rc == CURSOR_NOT_CHANGED) rc = dga2.MouseMoved (x, y);
06057   if (rc == CURSOR_NOT_CHANGED) rc = dga3.MouseMoved (x, y);
06058   if (rc == CURSOR_NOT_CHANGED) rc = dga4.MouseMoved (x, y);
06059   if (rc == CURSOR_NOT_CHANGED) rc = dga5.MouseMoved (x, y);
06060   if (rc == CURSOR_NOT_CHANGED) rc = dgb1.MouseMoved (x, y);
06061   if (rc == CURSOR_NOT_CHANGED) rc = dgb2.MouseMoved (x, y);
06062   if (rc == CURSOR_NOT_CHANGED) rc = dgb3.MouseMoved (x, y);
06063   if (rc == CURSOR_NOT_CHANGED) rc = dgb4.MouseMoved (x, y);
06064   if (rc == CURSOR_NOT_CHANGED) rc = dgb5.MouseMoved (x, y);
06065   if (rc == CURSOR_NOT_CHANGED) rc = tune.MouseMoved (x, y);
06066   if (rc == CURSOR_NOT_CHANGED) rc = mode.MouseMoved (x, y);
06067   if (rc == CURSOR_NOT_CHANGED) rc = stor.MouseMoved (x, y);
06068   if (rc == CURSOR_NOT_CHANGED) rc = test.MouseMoved (x, y);
06069 
06070   // Call parent method if cursor not changed
06071   if (rc == CURSOR_NOT_CHANGED) {
06072     rc = CBitmapGauge::MouseMoved (x, y);
06073   }
06074 
06075   return rc;
06076 }
06077 
06078 
06079 
06080 CRMINeedleGauge::CRMINeedleGauge (void)
06081 {
06082   comp_tag = 0;
06083   cpxy_x = cpxy_y = 0;
06084   anxy_x = anxy_y = 0;
06085   rnxy_x = rnxy_y = 0;
06086   adf1 = adf2 = nav1 = nav2 = 0;
06087   adf1_unit = adf2_unit = nav1_unit = nav2_unit = 0;
06088   strcpy (adfa.art, "");
06089   adfa.x = adfa.y = 0;
06090   strcpy (vora.art, "");
06091   vora.x = vora.y = 0;
06092 }
06093 
06094 int CRMINeedleGauge::Read (SStream *stream, Tag tag)
06095 {
06096   int rc = TAG_IGNORED;
06097 
06098   switch (tag) {
06099   case 'comp':
06100     ReadTag (&comp_tag, stream);
06101     ReadFrom (&comp, stream);
06102     rc = TAG_READ;
06103     break;
06104 
06105   case 'cpxy':
06106     ReadInt (&cpxy_x, stream);
06107     ReadInt (&cpxy_y, stream);
06108     rc = TAG_READ;
06109     break;
06110 
06111   case 'adfn':
06112     ReadFrom (&adfn, stream);
06113     rc = TAG_READ;
06114     break;
06115 
06116   case 'anxy':
06117     ReadInt (&anxy_x, stream);
06118     ReadInt (&anxy_y, stream);
06119     rc = TAG_READ;
06120     break;
06121 
06122   case 'rmin':
06123     ReadFrom (&rmin, stream);
06124     rc = TAG_READ;
06125     break;
06126 
06127   case 'rnxy':
06128     ReadInt (&rnxy_x, stream);
06129     ReadInt (&rnxy_y, stream);
06130     rc = TAG_READ;
06131     break;
06132 
06133   case 'adf1':
06134   case 'adfr':
06135     ReadTag (&adf1, stream);
06136     ReadInt (&adf1_unit, stream);
06137     rc = TAG_READ;
06138     break;
06139 
06140   case 'adf2':
06141     ReadTag (&adf2, stream);
06142     ReadInt (&adf2_unit, stream);
06143     rc = TAG_READ;
06144     break;
06145 
06146   case 'nav1':
06147     ReadTag (&nav1, stream);
06148     ReadInt (&nav1_unit, stream);
06149     rc = TAG_READ;
06150     break;
06151 
06152   case 'nav2':
06153     ReadTag (&nav2, stream);
06154     ReadInt (&nav2_unit, stream);
06155     rc = TAG_READ;
06156     break;
06157 
06158   case 'adfa':
06159     ReadString (adfa.art, 64, stream);
06160     ReadInt (&adfa.x, stream);
06161     ReadInt (&adfa.y, stream);
06162     rc = TAG_READ;
06163     break;
06164 
06165   case 'vora':
06166     ReadString (vora.art, 64, stream);
06167     ReadInt (&vora.x, stream);
06168     ReadInt (&vora.y, stream);
06169     rc = TAG_READ;
06170     break;
06171 
06172   case 'lbtn':
06173     ReadFrom (&lbtn, stream);
06174     rc = TAG_READ;
06175     break;
06176 
06177   case 'rbtn':
06178     ReadFrom (&rbtn, stream);
06179     rc = TAG_READ;
06180     break;
06181   }
06182 
06183   if (rc == TAG_IGNORED) {
06184     rc = CBitmapGauge::Read (stream, tag);
06185   }
06186 
06187   if (rc == TAG_IGNORED) {
06188     char s[64];
06189     TagToString (s, tag);
06190     globals->logWarning->Write ("CRMINeedleGauge::Read : Unknown tag %s", s);
06191   }
06192 
06193   return rc;
06194 }
06195 
06196 ECursorResult CRMINeedleGauge::MouseMoved (int x, int y)
06197 {
06198   ECursorResult rc = CURSOR_NOT_CHANGED;
06199 
06200   // Send updated mouse position to all click areas
06201   if (rc == CURSOR_NOT_CHANGED) rc = lbtn.MouseMoved (x, y);
06202   if (rc == CURSOR_NOT_CHANGED) rc = rbtn.MouseMoved (x, y);
06203 
06204   // Call parent method if cursor not changed
06205   if (rc == CURSOR_NOT_CHANGED) {
06206     rc = CBitmapGauge::MouseMoved (x, y);
06207   }
06208 
06209   return rc;
06210 }
06211 
06212 
06213 //
06214 // CNavGaugeGroup
06215 //
06216 
06217 CNavGaugeGroup::CNavGaugeGroup (void)
06218 {
06219   nav1 = nav2 = 0;
06220 }
06221 
06222 int CNavGaugeGroup::Read (SStream *stream, Tag tag)
06223 {
06224   int rc = TAG_IGNORED;
06225 
06226   switch (tag) {
06227   case 'nav1':
06228     ReadTag (&nav1, stream);
06229     rc = TAG_READ;
06230     break;
06231 
06232   case 'nav2':
06233     ReadTag (&nav2, stream);
06234     rc = TAG_READ;
06235     break;
06236   }
06237 
06238   if (rc == TAG_IGNORED) {
06239     rc = CGauge::Read (stream, tag);
06240   }
06241 
06242   if (rc == TAG_IGNORED) {
06243     char s[64];
06244     TagToString (s, tag);
06245     globals->logWarning->Write ("CNavGaugeGroup::Read : Unknown tag %s", s);
06246   }
06247 
06248   return rc;
06249 }
06250 
06251 
06252 //
06253 // CRadioGaugeGroup
06254 //
06255 CRadioGaugeGroup::CRadioGaugeGroup (void)
06256 {
06257   rad1_tag = rad2_tag = key_tag = 0;
06258 }
06259 
06260 int CRadioGaugeGroup::Read (SStream *stream, Tag tag)
06261 {
06262   int rc = TAG_IGNORED;
06263 
06264   switch (tag) {
06265   case 'rad1':
06266     ReadTag (&rad1_tag, stream);
06267     rc = TAG_READ;
06268     break;
06269 
06270   case 'rad2':
06271     ReadTag (&rad2_tag, stream);
06272     rc = TAG_READ;
06273     break;
06274 
06275   case 'key_':
06276     ReadTag (&key_tag, stream);
06277     rc = TAG_READ;
06278     break;
06279   }
06280 
06281   if (rc == TAG_IGNORED) {
06282     rc = CGauge::Read (stream, tag);
06283   }
06284 
06285   if (rc == TAG_IGNORED) {
06286     char s[64];
06287     TagToString (s, tag);
06288     globals->logWarning->Write ("CRadioGaugeGroup::Read : Unknown tag %s", s);
06289   }
06290 
06291   return rc;
06292 }
06293 
06294 
06295 //
06296 // CAnnunciator
06297 //
06298 CAnnunciator::CAnnunciator (void)
06299 {
06300 }
06301 
06302 int CAnnunciator::Read (SStream *stream, Tag tag)
06303 {
06304   int rc = TAG_IGNORED;
06305 
06306   if (rc == TAG_IGNORED) {
06307     rc = CBitmapGauge::Read (stream, tag);
06308   }
06309 
06310   if (rc == TAG_IGNORED) {
06311     char s[64];
06312     TagToString (s, tag);
06313     globals->logWarning->Write ("CAnnunciator::Read : Unknown tag %s", s);
06314   }
06315 
06316   return rc;
06317 }
06318 
06319 
06320 //
06321 // CFlyhawkAnnunciator
06322 //
06323 
06324 CFlyhawkAnnunciator::CFlyhawkAnnunciator (void)
06325 {
06326   strcpy (lowf_art, "");
06327   strcpy (lowl_art, "");
06328   strcpy (lowr_art, "");
06329   strcpy (oilp_art, "");
06330   strcpy (vacl_art, "");
06331   strcpy (vacr_art, "");
06332   strcpy (lowv_art, "");
06333   strcpy (volt_art, "");
06334   strcpy (line_art, "");
06335 }
06336 
06337 int CFlyhawkAnnunciator::Read (SStream *stream, Tag tag)
06338 {
06339   int rc = TAG_IGNORED;
06340 
06341   switch (tag) {
06342   case 'lowf':
06343     ReadString (lowf_art, 64, stream);
06344     rc = TAG_READ;
06345     break;
06346 
06347   case 'lowl':
06348     ReadString (lowl_art, 64, stream);
06349     rc = TAG_READ;
06350     break;
06351 
06352   case 'lowr':
06353     ReadString (lowr_art, 64, stream);
06354     rc = TAG_READ;
06355     break;
06356 
06357   case 'oilp':
06358     ReadString (oilp_art, 64, stream);
06359     rc = TAG_READ;
06360     break;
06361 
06362   case 'vacl':
06363     ReadString (vacl_art, 64, stream);
06364     rc = TAG_READ;
06365     break;
06366 
06367   case 'vacr':
06368     ReadString (vacr_art, 64, stream);
06369     rc = TAG_READ;
06370     break;
06371 
06372   case 'lowv':
06373     ReadString (lowv_art, 64, stream);
06374     rc = TAG_READ;
06375     break;
06376 
06377   case 'volt':
06378     ReadString (volt_art, 64, stream);
06379     rc = TAG_READ;
06380     break;
06381 
06382   case 'line':
06383     ReadString (line_art, 64, stream);
06384     rc = TAG_READ;
06385     break;
06386   }
06387 
06388   if (rc == TAG_IGNORED) {
06389     rc = CGauge::Read (stream, tag);
06390   }
06391 
06392   if (rc == TAG_IGNORED) {
06393     char s[64];
06394     TagToString (s, tag);
06395     globals->logWarning->Write ("CFlyhawkAnnunciator::Read : Unknown tag %s", s);
06396   }
06397 
06398   return rc;
06399 }
06400 
06401 
06402 //
06403 // CFlyhawkAnnunciatorTest
06404 //
06405 
06406 CFlyhawkAnnunciatorTest::CFlyhawkAnnunciatorTest (void)
06407 {
06408   strcpy (swit_art, "");
06409   strcpy (sfxu_wav, "");
06410   strcpy (sfxd_wav, "");
06411   strcpy (csru_csr, "");
06412   strcpy (csrd_csr, "");
06413 }
06414 
06415 int CFlyhawkAnnunciatorTest::Read (SStream *stream, Tag tag)
06416 {
06417   int rc = TAG_IGNORED;
06418 
06419   switch (tag) {
06420   case 'swit':
06421     ReadString (swit_art, 64, stream);
06422     rc = TAG_READ;
06423     break;
06424 
06425   case 'sfxu':
06426     ReadString (sfxu_wav, 64, stream);
06427     rc = TAG_READ;
06428     break;
06429 
06430   case 'sfxd':
06431     ReadString (sfxd_wav, 64, stream);
06432     rc = TAG_READ;
06433     break;
06434 
06435   case 'csru':
06436     ReadString (csru_csr, 64, stream);
06437     rc = TAG_READ;
06438     break;
06439 
06440   case 'csrd':
06441     ReadString (csrd_csr, 64, stream);
06442     rc = TAG_READ;
06443     break;
06444   }
06445 
06446   if (rc == TAG_IGNORED) {
06447     rc = CGauge::Read (stream, tag);
06448   }
06449 
06450   if (rc == TAG_IGNORED) {
06451     char s[64];
06452     TagToString (s, tag);
06453     globals->logWarning->Write ("CFlyhawkAnnunciatorTest::Read : Unknown tag %s", s);
06454   }
06455 
06456   return rc;
06457 }
06458 
06459 
06460 //
06461 // CFlyhawkNavGpsPanelGauge
06462 //
06463 
06464 CFlyhawkNavGpsPanelGauge::CFlyhawkNavGpsPanelGauge (void)
06465 {
06466   xnav_x = xnav_y = 0;
06467   xgps_x = xgps_y = 0;
06468   xapr_x = xapr_y = 0;
06469   xmsg_x = xmsg_y = 0;
06470   xwpt_x = xwpt_y = 0;
06471 }
06472 
06473 int CFlyhawkNavGpsPanelGauge::Read (SStream *stream, Tag tag)
06474 {
06475   int rc = TAG_IGNORED;
06476 
06477   switch (tag) {
06478   case 'cnav':
06479     ReadFrom (&cnav, stream);
06480     rc = TAG_READ;
06481     break;
06482 
06483   case 'capr':
06484     ReadFrom (&capr, stream);
06485     rc = TAG_READ;
06486     break;
06487 
06488   case 'xnav':
06489     ReadInt (&xnav_x, stream);
06490     ReadInt (&xnav_y, stream);
06491     rc = TAG_READ;
06492     break;
06493 
06494   case 'xgps':
06495     ReadInt (&xgps_x, stream);
06496     ReadInt (&xgps_y, stream);
06497     rc = TAG_READ;
06498     break;
06499 
06500   case 'xapr':
06501     ReadInt (&xapr_x, stream);
06502     ReadInt (&xapr_y, stream);
06503     rc = TAG_READ;
06504     break;
06505 
06506   case 'xmsg':
06507     ReadInt (&xmsg_x, stream);
06508     ReadInt (&xmsg_y, stream);
06509     rc = TAG_READ;
06510     break;
06511 
06512   case 'xwpt':
06513     ReadInt (&xwpt_x, stream);
06514     ReadInt (&xwpt_y, stream);
06515     rc = TAG_READ;
06516     break;
06517   }
06518 
06519   if (rc == TAG_IGNORED) {
06520     rc = CBitmapGauge::Read (stream, tag);
06521   }
06522 
06523   if (rc == TAG_IGNORED) {
06524     char s[64];
06525     TagToString (s, tag);
06526     globals->logWarning->Write ("CFlyhawkNavGpsPanelGauge::Read : Unknown tag %s", s);
06527   }
06528 
06529   return rc;
06530 }
06531 
06532 ECursorResult CFlyhawkNavGpsPanelGauge::MouseMoved (int x, int y)
06533 {
06534   ECursorResult rc = CURSOR_NOT_CHANGED;
06535 
06536   // Send updated mouse position to all click areas
06537   if (rc == CURSOR_NOT_CHANGED) rc = cnav.MouseMoved (x, y);
06538   if (rc == CURSOR_NOT_CHANGED) rc = capr.MouseMoved (x, y);
06539 
06540   // Call parent method if cursor not changed
06541   if (rc == CURSOR_NOT_CHANGED) {
06542     rc = CBitmapGauge::MouseMoved (x, y);
06543   }
06544 
06545   return rc;
06546 }
06547 
06548 
06549 //
06550 // CFlyhawkFuelSelectorGauge
06551 //
06552 
06553 CFlyhawkFuelSelectorGauge::CFlyhawkFuelSelectorGauge (void)
06554 {
06555   strcpy (swit_art, "");
06556   memset (&Lmsg, 0, sizeof(SMessage));
06557   memset (&Rmsg, 0, sizeof(SMessage));
06558 }
06559 
06560 int CFlyhawkFuelSelectorGauge::Read (SStream *stream, Tag tag)
06561 {
06562   int rc = TAG_IGNORED;
06563 
06564   switch (tag) {
06565   case 'swit':
06566     ReadString (swit_art, 64, stream);
06567     rc = TAG_READ;
06568     break;
06569 
06570   case 'left':
06571     ReadFrom (&left, stream);
06572     rc = TAG_READ;
06573     break;
06574 
06575   case 'both':
06576     ReadFrom (&both, stream);
06577     rc = TAG_READ;
06578     break;
06579 
06580   case 'righ':
06581     ReadFrom (&righ, stream);
06582     rc = TAG_READ;
06583     break;
06584 
06585   case 'Lmsg':
06586     ReadMessage (&Lmsg, stream);
06587     rc = TAG_READ;
06588     break;
06589 
06590   case 'Rmsg':
06591     ReadMessage (&Rmsg, stream);
06592     rc = TAG_READ;
06593     break;
06594   }
06595 
06596   if (rc == TAG_IGNORED) {
06597     rc = CBitmapGauge::Read (stream, tag);
06598   }
06599 
06600   if (rc == TAG_IGNORED) {
06601     char s[64];
06602     TagToString (s, tag);
06603     globals->logWarning->Write ("CFlyhawkFuelSelectorGauge::Read : Unknown tag %s", s);
06604   }
06605 
06606   return rc;
06607 }
06608 
06609 ECursorResult CFlyhawkFuelSelectorGauge::MouseMoved (int x, int y)
06610 {
06611   ECursorResult rc = CURSOR_NOT_CHANGED;
06612 
06613   // Send updated mouse position to all click areas
06614   if (rc == CURSOR_NOT_CHANGED) rc = left.MouseMoved (x, y);
06615   if (rc == CURSOR_NOT_CHANGED) rc = righ.MouseMoved (x, y);
06616   if (rc == CURSOR_NOT_CHANGED) rc = both.MouseMoved (x, y);
06617 
06618   // Call parent method if cursor not changed
06619   if (rc == CURSOR_NOT_CHANGED) {
06620     rc = CBitmapGauge::MouseMoved (x, y);
06621   }
06622 
06623   return rc;
06624 }
06625 
06626 
06627 //
06628 // CFlyhawkElevatorTrimGauge
06629 //
06630 
06631 CFlyhawkElevatorTrimGauge::CFlyhawkElevatorTrimGauge (void)
06632 {
06633   strcpy (trmw.art, "");
06634   trmw.x = trmw.y = 0;
06635   strcpy (trmi.art, "");
06636   trmi.x = trmi.y = 0;
06637 }
06638 
06639 int CFlyhawkElevatorTrimGauge::Read (SStream *stream, Tag tag)
06640 {
06641   int rc = TAG_IGNORED;
06642 
06643   switch (tag) {
06644   case 'trmw':
06645     ReadString (trmw.art, 64, stream);
06646     ReadInt (&trmw.x, stream);
06647     ReadInt (&trmw.y, stream);
06648     rc = TAG_READ;
06649     break;
06650 
06651   case 'trmi':
06652     ReadString (trmi.art, 64, stream);
06653     ReadInt (&trmi.x, stream);
06654     ReadInt (&trmi.y, stream);
06655     rc = TAG_READ;
06656     break;
06657 
06658   case 'down':
06659     ReadFrom (&down, stream);
06660     rc = TAG_READ;
06661     break;
06662 
06663   case 'up  ':
06664     ReadFrom (&up, stream);
06665     rc = TAG_READ;
06666     break;
06667   }
06668 
06669   if (rc == TAG_IGNORED) {
06670     rc = CBitmapGauge::Read (stream, tag);
06671   }
06672 
06673   if (rc == TAG_IGNORED) {
06674     char s[64];
06675     TagToString (s, tag);
06676     globals->logWarning->Write ("CFlyhawkElevatorTrimGauge::Read : Unknown tag %s", s);
06677   }
06678 
06679   return rc;
06680 }
06681 
06682 ECursorResult CFlyhawkElevatorTrimGauge::MouseMoved (int x, int y)
06683 {
06684   ECursorResult rc = CURSOR_NOT_CHANGED;
06685 
06686   // Send updated mouse position to all click areas
06687   if (rc == CURSOR_NOT_CHANGED) rc = down.MouseMoved (x, y);
06688   if (rc == CURSOR_NOT_CHANGED) rc = up.MouseMoved (x, y);
06689 
06690   // Call parent method if cursor not changed
06691   if (rc == CURSOR_NOT_CHANGED) {
06692     rc = CBitmapGauge::MouseMoved (x, y);
06693   }
06694 
06695   return rc;
06696 }
06697 
06698 
06699 //
06700 // CMalybooCHTIndicatorGauge
06701 //
06702 CMalybooCHTIndicatorGauge::CMalybooCHTIndicatorGauge (void)
06703 {
06704   for (int i=0; i<6; i++) xoff[i] = 0;
06705   yoff = 0;
06706 }
06707 
06708 int CMalybooCHTIndicatorGauge::Read (SStream *stream, Tag tag)
06709 {
06710   int rc = TAG_IGNORED;
06711 
06712   switch (tag) {
06713   case 'xoff':
06714     ReadInt (&xoff[0], stream);
06715     ReadInt (&xoff[1], stream);
06716     ReadInt (&xoff[2], stream);
06717     ReadInt (&xoff[3], stream);
06718     ReadInt (&xoff[4], stream);
06719     ReadInt (&xoff[5], stream);
06720     rc = TAG_READ;
06721     break;
06722 
06723   case 'yoff':
06724     ReadInt (&yoff, stream);
06725     rc = TAG_READ;
06726     break;
06727   }
06728 
06729   if (rc == TAG_IGNORED) {
06730     rc = CBitmapGauge::Read (stream, tag);
06731   }
06732 
06733   if (rc == TAG_IGNORED) {
06734     char s[64];
06735     TagToString (s, tag);
06736     globals->logWarning->Write ("CMalybooCHTIndicatorGauge::Read : Unknown tag %s", s);
06737   }
06738 
06739   return rc;
06740 }
06741 
06742 
06743 //
06744 // CMalybooCHTButtonGauge
06745 //
06746 CMalybooCHTButtonGauge::CMalybooCHTButtonGauge (void)
06747 {
06748 }
06749 
06750 int CMalybooCHTButtonGauge::Read (SStream *stream, Tag tag)
06751 {
06752   int rc = TAG_IGNORED;
06753 
06754   if (rc == TAG_IGNORED) {
06755     rc = CBitmapGauge::Read (stream, tag);
06756   }
06757 
06758   if (rc == TAG_IGNORED) {
06759     char s[64];
06760     TagToString (s, tag);
06761     globals->logWarning->Write ("CMalybooCHTButtonGauge::Read : Unknown tag %s", s);
06762   }
06763 
06764   return rc;
06765 }
06766 
06767 
06768 //
06769 // CMalybooNavGpsPanelGauge
06770 //
06771 
06772 CMalybooNavGpsPanelGauge::CMalybooNavGpsPanelGauge (void)
06773 {
06774   xnav_x = xnav_y = 0;
06775   xgps_x = xgps_y = 0;
06776   xapr_x = xapr_y = 0;
06777   xarm_x = xarm_y = 0;
06778   xact_x = xact_y = 0;
06779   xcrs_x = xcrs_y = 0;
06780   xobs_x = xobs_y = 0;
06781   xleg_x = xleg_y = 0;
06782   xmsg_x = xmsg_y = 0;
06783   xwpt_x = xwpt_y = 0;
06784   xyaw_x = xyaw_y = 0;
06785 }
06786 
06787 int CMalybooNavGpsPanelGauge::Read (SStream *stream, Tag tag)
06788 {
06789   int rc = TAG_IGNORED;
06790 
06791   switch (tag) {
06792   case 'cnav':
06793     ReadFrom (&cnav, stream);
06794     rc = TAG_READ;
06795     break;
06796 
06797   case 'xnav':
06798     ReadInt (&xnav_x, stream);
06799     ReadInt (&xnav_y, stream);
06800     rc = TAG_READ;
06801     break;
06802 
06803   case 'xgps':
06804     ReadInt (&xgps_x, stream);
06805     ReadInt (&xgps_y, stream);
06806     rc = TAG_READ;
06807     break;
06808 
06809   case 'capr':
06810     ReadFrom (&cnav, stream);
06811     rc = TAG_READ;
06812     break;
06813 
06814   case 'xapr':
06815     ReadInt (&xapr_x, stream);
06816     ReadInt (&xapr_y, stream);
06817     rc = TAG_READ;
06818     break;
06819 
06820   case 'xarm':
06821     ReadInt (&xarm_x, stream);
06822     ReadInt (&xarm_y, stream);
06823     rc = TAG_READ;
06824     break;
06825 
06826   case 'xact':
06827     ReadInt (&xact_x, stream);
06828     ReadInt (&xact_y, stream);
06829     rc = TAG_READ;
06830     break;
06831 
06832   case 'ccrs':
06833     ReadFrom (&cnav, stream);
06834     rc = TAG_READ;
06835     break;
06836 
06837   case 'xcrs':
06838     ReadInt (&xcrs_x, stream);
06839     ReadInt (&xcrs_y, stream);
06840     rc = TAG_READ;
06841     break;
06842 
06843   case 'xobs':
06844     ReadInt (&xobs_x, stream);
06845     ReadInt (&xobs_y, stream);
06846     rc = TAG_READ;
06847     break;
06848 
06849   case 'xleg':
06850     ReadInt (&xleg_x, stream);
06851     ReadInt (&xleg_y, stream);
06852     rc = TAG_READ;
06853     break;
06854 
06855   case 'cmsg':
06856     ReadFrom (&cnav, stream);
06857     rc = TAG_READ;
06858     break;
06859 
06860   case 'xmsg':
06861     ReadInt (&xmsg_x, stream);
06862     ReadInt (&xmsg_y, stream);
06863     rc = TAG_READ;
06864     break;
06865 
06866   case 'xwpt':
06867     ReadInt (&xwpt_x, stream);
06868     ReadInt (&xwpt_y, stream);
06869     rc = TAG_READ;
06870     break;
06871 
06872   case 'cyaw':
06873     ReadFrom (&cnav, stream);
06874     rc = TAG_READ;
06875     break;
06876 
06877   case 'xyaw':
06878     ReadInt (&xyaw_x, stream);
06879     ReadInt (&xyaw_y, stream);
06880     rc = TAG_READ;
06881     break;
06882   }
06883 
06884   if (rc == TAG_IGNORED) {
06885     rc = CBitmapGauge::Read (stream, tag);
06886   }
06887 
06888   if (rc == TAG_IGNORED) {
06889     char s[64];
06890     TagToString (s, tag);
06891     globals->logWarning->Write ("CMalybooNavGpsPanelGauge::Read : Unknown tag %s", s);
06892   }
06893 
06894   return rc;
06895 }
06896 
06897 
06898 
06899 //
06900 // CMalybooDigitalClockGauge
06901 //
06902 
06903 CMalybooDigitalClockGauge::CMalybooDigitalClockGauge (void)
06904 {
06905   clkd_x1 = clkd_y1 = clkd_x2 = clkd_y2 = 0;
06906 }
06907 
06908 int CMalybooDigitalClockGauge::Read (SStream *stream, Tag tag)
06909 {
06910   int rc = TAG_IGNORED;
06911 
06912   switch (tag) {
06913   case 'clkd':
06914     ReadInt (&clkd_x1, stream);
06915     ReadInt (&clkd_y1, stream);
06916     ReadInt (&clkd_x2, stream);
06917     ReadInt (&clkd_y2, stream);
06918     rc = TAG_READ;
06919     break;
06920 
06921   case 'mode':
06922     ReadFrom (&mode, stream);
06923     rc = TAG_READ;
06924     break;
06925 
06926   case 'powr':
06927     ReadFrom (&powr, stream);
06928     rc = TAG_READ;
06929     break;
06930 
06931   case 'play':
06932     ReadFrom (&play, stream);
06933     rc = TAG_READ;
06934     break;
06935 
06936   case 'rec_':
06937     ReadFrom (&rec, stream);
06938     rc = TAG_READ;
06939     break;
06940 
06941   case 'set_':
06942     ReadFrom (&set, stream);
06943     rc = TAG_READ;
06944     break;
06945   }
06946 
06947   if (rc == TAG_IGNORED) {
06948     rc = CBitmapGauge::Read (stream, tag);
06949   }
06950 
06951   if (rc == TAG_IGNORED) {
06952     char s[64];
06953     TagToString (s, tag);
06954     globals->logWarning->Write ("CMalybooDigitalClockGauge::Read : Unknown tag %s", s);
06955   }
06956 
06957   return rc;
06958 }
06959 
06960 
06961 //
06962 // CMalybooEngineMonitorGauge
06963 //
06964 CMalybooEngineMonitorGauge::CMalybooEngineMonitorGauge (void)
06965 {
06966   strcpy (rlit_art, "");
06967   strcpy (glit_art, "");
06968   strcpy (ylit_art, "");
06969 }
06970 
06971 int CMalybooEngineMonitorGauge::Read (SStream *stream, Tag tag)
06972 {
06973   int rc = TAG_IGNORED;
06974 
06975   switch (tag) {
06976   case 'fuel':
06977     ReadFrom (&fuel, stream);
06978     rc = TAG_READ;
06979     break;
06980 
06981   case 'inst':
06982     ReadFrom (&inst, stream);
06983     rc = TAG_READ;
06984     break;
06985 
06986   case 'blk_':
06987     ReadFrom (&blk_, stream);
06988     rc = TAG_READ;
06989     break;
06990 
06991   case 'fill':
06992     ReadFrom (&fill, stream);
06993     rc = TAG_READ;
06994     break;
06995 
06996   case 'pwr_':
06997     ReadFrom (&pwr_, stream);
06998     rc = TAG_READ;
06999     break;
07000 
07001   case 'set_':
07002     ReadFrom (&set_, stream);
07003     rc = TAG_READ;
07004     break;
07005 
07006   case 'MAP_':
07007     ReadFrom (&MAP_, stream);
07008     rc = TAG_READ;
07009     break;
07010 
07011   case 'RPM_':
07012     ReadFrom (&RPM_, stream);
07013     rc = TAG_READ;
07014     break;
07015 
07016   case 'TIT_':
07017     ReadFrom (&TIT, stream);
07018     rc = TAG_READ;
07019     break;
07020 
07021   case 'FF__':
07022     ReadFrom (&FF__, stream);
07023     rc = TAG_READ;
07024     break;
07025 
07026   case 'OT__':
07027     ReadFrom (&OT__, stream);
07028     rc = TAG_READ;
07029     break;
07030 
07031   case 'OP__':
07032     ReadFrom (&OP__, stream);
07033     rc = TAG_READ;
07034     break;
07035 
07036   case 'CHT_':
07037     ReadFrom (&CHT_, stream);
07038     rc = TAG_READ;
07039     break;
07040 
07041   case 'VAC_':
07042     ReadFrom (&VAC_, stream);
07043     rc = TAG_READ;
07044     break;
07045 
07046   case 'LQTY':
07047     ReadFrom (&LQTY, stream);
07048     rc = TAG_READ;
07049     break;
07050 
07051   case 'RQTY':
07052     ReadFrom (&RQTY, stream);
07053     rc = TAG_READ;
07054     break;
07055 
07056   case 'rlit':
07057     ReadString (rlit_art, 64, stream);
07058 //    ReadString (glit_art, 64, stream);
07059 //    ReadString (ylit_art, 64, stream);
07060     rc = TAG_READ;
07061     break;
07062 
07063   case 'glit':
07064     ReadString (glit_art, 64, stream);
07065 //    ReadString (glit_art, 64, stream);
07066 //    ReadString (ylit_art, 64, stream);
07067     rc = TAG_READ;
07068     break;
07069 
07070   case 'ylit':
07071     ReadString (ylit_art, 64, stream);
07072 //    ReadString (glit_art, 64, stream);
07073 //    ReadString (ylit_art, 64, stream);
07074     rc = TAG_READ;
07075     break;
07076   }
07077 
07078   if (rc == TAG_IGNORED) {
07079     rc = CBitmapGauge::Read (stream, tag);
07080   }
07081 
07082   if (rc == TAG_IGNORED) {
07083     char s[64];
07084     TagToString (s, tag);
07085     globals->logWarning->Write ("CMalybooEngineMonitorGauge::Read : Unknown tag %s", s);
07086   }
07087 
07088   return rc;
07089 }
07090 
07091 
07092 //
07093 // CNavajoFuelSelectorGauge
07094 //
07095 CNavajoFuelSelectorGauge::CNavajoFuelSelectorGauge (void)
07096 {
07097   strcpy (swit, "");
07098   memset (&obms, 0, sizeof(SMessage));
07099   memset (&ibms, 0, sizeof(SMessage));
07100 }
07101 
07102 int CNavajoFuelSelectorGauge::Read (SStream *stream, Tag tag)
07103 {
07104   int rc = TAG_IGNORED;
07105 
07106   switch (tag) {
07107   case 'swit':
07108     ReadString (swit, 64, stream);
07109     rc = TAG_READ;
07110     break;
07111 
07112   case 'obca':
07113     ReadFrom (&obca, stream);
07114     rc = TAG_READ;
07115     break;
07116 
07117   case 'ofca':
07118     ReadFrom (&ofca, stream);
07119     rc = TAG_READ;
07120     break;
07121 
07122   case 'ibca':
07123     ReadFrom (&obca, stream);
07124     rc = TAG_READ;
07125     break;
07126 
07127   case 'obms':
07128     ReadMessage (&obms, stream);
07129     rc = TAG_READ;
07130     break;
07131 
07132   case 'ibms':
07133     ReadMessage (&ibms, stream);
07134     rc = TAG_READ;
07135     break;
07136   }
07137 
07138   if (rc == TAG_IGNORED) {
07139     rc = CBitmapGauge::Read (stream, tag);
07140   }
07141 
07142   if (rc == TAG_IGNORED) {
07143     char s[64];
07144     TagToString (s, tag);
07145     globals->logWarning->Write ("CNavajoFuelSelectorGauge::Read : Unknown tag %s", s);
07146   }
07147 
07148   return rc;
07149 }
07150 
07151 
07152 //
07153 // CNavajoFuelAmmeterGauge
07154 //
07155 CNavajoAmmeterGauge::CNavajoAmmeterGauge (void)
07156 {
07157   memset (&mChg, 0, sizeof(SMessage));
07158   memset (&mLtM, 0, sizeof(SMessage));
07159   memset (&mRtM, 0, sizeof(SMessage));
07160   memset (&mLtS, 0, sizeof(SMessage));
07161   memset (&mRtS, 0, sizeof(SMessage));
07162 }
07163 
07164 int CNavajoAmmeterGauge::Read (SStream *stream, Tag tag)
07165 {
07166   int rc = TAG_IGNORED;
07167 
07168   switch (tag) {
07169   case 'nedl':
07170     ReadFrom (&nedl, stream);
07171     rc = TAG_READ;
07172     break;
07173 
07174   case 'mChg':
07175     ReadMessage (&mChg, stream);
07176     rc = TAG_READ;
07177     break;
07178 
07179   case 'mLtM':
07180     ReadMessage (&mLtM, stream);
07181     rc = TAG_READ;
07182     break;
07183 
07184   case 'mRtM':
07185     ReadMessage (&mRtM, stream);
07186     rc = TAG_READ;
07187     break;
07188 
07189   case 'mLtS':
07190     ReadMessage (&mLtS, stream);
07191     rc = TAG_READ;
07192     break;
07193 
07194   case 'mRtS':
07195     ReadMessage (&mRtS, stream);
07196     rc = TAG_READ;
07197     break;
07198 
07199   case 'ca01':
07200     ReadFrom (&ca01, stream);
07201     rc = TAG_READ;
07202     break;
07203 
07204   case 'ca02':
07205     ReadFrom (&ca02, stream);
07206     rc = TAG_READ;
07207     break;
07208   }
07209 
07210   if (rc == TAG_IGNORED) {
07211     rc = CNeedleGauge::Read (stream, tag);
07212   }
07213 
07214   if (rc == TAG_IGNORED) {
07215     char s[64];
07216     TagToString (s, tag);
07217     globals->logWarning->Write ("CNavajoAmmeterGauge::Read : Unknown tag %s", s);
07218   }
07219 
07220   return rc;
07221 }
07222 
07223 
07224 //
07225 // CNavajoRadarAltimeterGauge
07226 //
07227 CNavajoRadarAltimeterGauge::CNavajoRadarAltimeterGauge (void)
07228 {
07229   memset (&bMsg, 0, sizeof(SMessage));
07230   strcpy (bug.art, "");
07231   bug.x = bug.y = 0;
07232   strcpy (plit.art, "");
07233   plit.x = plit.y = 0;
07234   memset (&dhms, 0, sizeof(SMessage));
07235 }
07236 
07237 int CNavajoRadarAltimeterGauge::Read (SStream *stream, Tag tag)
07238 {
07239   int rc = TAG_IGNORED;
07240 
07241   switch (tag) {
07242   case 'bMsg':
07243     ReadMessage (&bMsg, stream);
07244     rc = TAG_READ;
07245     break;
07246 
07247   case 'dhbt':
07248     SkipObject (stream);
07249 //    ReadTable (&dhbt, stream);
07250     rc = TAG_READ;
07251     break;
07252 
07253   case 'bug ':
07254     ReadString (bug.art, 64, stream);
07255     ReadInt (&bug.x, stream);
07256     ReadInt (&bug.y, stream);
07257     rc = TAG_READ;
07258     break;
07259 
07260   case 'plit':
07261     ReadString (plit.art, 64, stream);
07262     ReadInt (&plit.x, stream);
07263     ReadInt (&plit.y, stream);
07264     rc = TAG_READ;
07265     break;
07266 
07267   case 'dhms':
07268     ReadMessage (&dhms, stream);
07269     rc = TAG_READ;
07270     break;
07271 
07272   case 'knob':
07273     ReadFrom (&knob, stream);
07274     rc = TAG_READ;
07275     break;
07276   }
07277 
07278   if (rc == TAG_IGNORED) {
07279     rc = CNeedleGauge::Read (stream, tag);
07280   }
07281 
07282   if (rc == TAG_IGNORED) {
07283     char s[64];
07284     TagToString (s, tag);
07285     globals->logWarning->Write ("CNavajoRadarAltimeterGauge::Read : Unknown tag %s", s);
07286   }
07287 
07288   return rc;
07289 }
07290 
07291 
07292 //
07293 // CCollinsEFISSelectionGauge
07294 //
07295 CCollinsEFISSelectionGauge::CCollinsEFISSelectionGauge (void)
07296 {
07297   memset (&pfdm, 0, sizeof(SMessage));
07298   memset (&ehim, 0, sizeof(SMessage));
07299   memset (&mndm, 0, sizeof(SMessage));
07300   memset (&adm_, 0, sizeof(SMessage));
07301   memset (&aplt, 0, sizeof(SMessage));
07302 }
07303 
07304 int CCollinsEFISSelectionGauge::Read (SStream *stream, Tag tag)
07305 {
07306   int rc = TAG_IGNORED;
07307 
07308   switch (tag) {
07309   case 'brg_':
07310     ReadFrom (&brg_, stream);
07311     rc = TAG_READ;
07312     break;
07313 
07314   case 'brgm':
07315     ReadFrom (&brgm, stream);
07316     rc = TAG_READ;
07317     break;
07318 
07319   case 'brgk':
07320     ReadFrom (&brgk, stream);
07321     rc = TAG_READ;
07322     break;
07323 
07324   case 'dh__':
07325     ReadFrom (&dh__, stream);
07326     rc = TAG_READ;
07327     break;
07328 
07329   case 'form':
07330     ReadFrom (&form, stream);
07331     rc = TAG_READ;
07332     break;
07333 
07334   case 'crs_':
07335     ReadFrom (&crs_, stream);
07336     rc = TAG_READ;
07337     break;
07338 
07339   case 'crsm':
07340     ReadFrom (&crsm, stream);
07341     rc = TAG_READ;
07342     break;
07343 
07344   case 'crsk':
07345     ReadFrom (&crsk, stream);
07346     rc = TAG_READ;
07347     break;
07348 
07349   case 'wx__':
07350     ReadFrom (&wx__, stream);
07351     rc = TAG_READ;
07352     break;
07353 
07354   case 'nav_':
07355     ReadFrom (&nav_, stream);
07356     rc = TAG_READ;
07357     break;
07358 
07359   case 'pfdm':
07360     ReadMessage (&pfdm, stream);
07361     rc = TAG_READ;
07362     break;
07363 
07364   case 'ehim':
07365     ReadMessage (&ehim, stream);
07366     rc = TAG_READ;
07367     break;
07368 
07369   case 'mndm':
07370     ReadMessage (&mndm, stream);
07371     rc = TAG_READ;
07372     break;
07373 
07374   case 'adm_':
07375     ReadMessage (&adm_, stream);
07376     rc = TAG_READ;
07377     break;
07378 
07379   case 'aplt':
07380     ReadMessage (&aplt, stream);
07381     rc = TAG_READ;
07382     break;
07383   }
07384 
07385   if (rc == TAG_IGNORED) {
07386     rc = CBitmapGauge::Read (stream, tag);
07387   }
07388 
07389   if (rc == TAG_IGNORED) {
07390     char s[64];
07391     TagToString (s, tag);
07392     globals->logWarning->Write ("CCollinsEFISSelectionGauge::Read : Unknown tag %s", s);
07393   }
07394 
07395   return rc;
07396 }
07397 
07398 
07399 //
07400 // CCollinsVspeedPanel
07401 //
07402 CCollinsVspeedPanel::CCollinsVspeedPanel (void)
07403 {
07404 }
07405 
07406 int CCollinsVspeedPanel::Read (SStream *stream, Tag tag)
07407 {
07408   int rc = TAG_IGNORED;
07409 
07410   switch (tag) {
07411   case 'sped':
07412     ReadFrom (&sped, stream);
07413     rc = TAG_READ;
07414     break;
07415 
07416   case 'vsel':
07417     ReadFrom (&vsel, stream);
07418     rc = TAG_READ;
07419     break;
07420   }
07421 
07422   if (rc == TAG_IGNORED) {
07423     rc = CBitmapGauge::Read (stream, tag);
07424   }
07425 
07426   if (rc == TAG_IGNORED) {
07427     char s[64];
07428     TagToString (s, tag);
07429     globals->logWarning->Write ("CCollinsVspeedPanel::Read : Unknown tag %s", s);
07430   }
07431 
07432   return rc;
07433 }
07434 
07435 
07436 
07437 //
07438 // CCollinsHFRadioGauge
07439 //
07440 CCollinsHFRadioGauge::CCollinsHFRadioGauge (void)
07441 {
07442   ft13 = false;
07443 }
07444 
07445 int CCollinsHFRadioGauge::Read (SStream *stream, Tag tag)
07446 {
07447   int rc = TAG_IGNORED;
07448 
07449   switch (tag) {
07450   case 'tel_':
07451     ReadFrom (&tel, stream);
07452     rc = TAG_READ;
07453     break;
07454 
07455   case 'am__':
07456     ReadFrom (&am, stream);
07457     rc = TAG_READ;
07458     break;
07459 
07460   case 'usb_':
07461     ReadFrom (&usb, stream);
07462     rc = TAG_READ;
07463     break;
07464 
07465   case 'lsb_':
07466     ReadFrom (&lsb, stream);
07467     rc = TAG_READ;
07468     break;
07469 
07470   case 'mhz_':
07471     ReadFrom (&mhz, stream);
07472     rc = TAG_READ;
07473     break;
07474 
07475   case 'khz_':
07476     ReadFrom (&khz, stream);
07477     rc = TAG_READ;
07478     break;
07479 
07480   case 'stor':
07481     ReadFrom (&stor, stream);
07482     rc = TAG_READ;
07483     break;
07484 
07485   case 'tune':
07486     ReadFrom (&tune, stream);
07487     rc = TAG_READ;
07488     break;
07489 
07490   case 'volu':
07491     ReadFrom (&volu, stream);
07492     rc = TAG_READ;
07493     break;
07494 
07495   case 'dash':
07496     ReadFrom (&dash, stream);
07497     rc = TAG_READ;
07498     break;
07499 
07500   case 'tx__':
07501     ReadFrom (&tx, stream);
07502     rc = TAG_READ;
07503     break;
07504 
07505   case 'chan':
07506     ReadFrom (&chan, stream);
07507     rc = TAG_READ;
07508     break;
07509 
07510   case 'ft13':
07511     ft13 = true;
07512     rc = TAG_READ;
07513     break;
07514   }
07515 
07516   if (rc == TAG_IGNORED) {
07517     rc = CBitmapGauge::Read (stream, tag);
07518   }
07519 
07520   if (rc == TAG_IGNORED) {
07521     char s[64];
07522     TagToString (s, tag);
07523     globals->logWarning->Write ("CCollinsHFRadioGauge::Read : Unknown tag %s", s);
07524   }
07525 
07526   return rc;
07527 }
07528 
07529 
07530 //
07531 // CCollinsPFDGauge
07532 //
07533 CCollinsPFDGauge::CCollinsPFDGauge (void)
07534 {
07535 }
07536 
07537 int CCollinsPFDGauge::Read (SStream *stream, Tag tag)
07538 {
07539   int rc = TAG_IGNORED;
07540 
07541   if (rc == TAG_IGNORED) {
07542     rc = CBitmapGauge::Read (stream, tag);
07543   }
07544 
07545   if (rc == TAG_IGNORED) {
07546     char s[64];
07547     TagToString (s, tag);
07548     globals->logWarning->Write ("CCollinsPFDGauge::Read : Unknown tag %s", s);
07549   }
07550 
07551   return rc;
07552 }
07553 
07554 
07555 //
07556 // CCollinsNDGauge
07557 //
07558 CCollinsNDGauge::CCollinsNDGauge (void)
07559 {
07560 }
07561 
07562 int CCollinsNDGauge::Read (SStream *stream, Tag tag)
07563 {
07564   int rc = TAG_IGNORED;
07565 
07566   if (rc == TAG_IGNORED) {
07567     rc = CBitmapGauge::Read (stream, tag);
07568   }
07569 
07570   if (rc == TAG_IGNORED) {
07571     char s[64];
07572     TagToString (s, tag);
07573     globals->logWarning->Write ("CCollinsNDGauge::Read : Unknown tag %s", s);
07574   }
07575 
07576   return rc;
07577 }
07578 
07579 
07580 //
07581 // CCollinsRTUGauge
07582 //
07583 CCollinsRTUGauge::CCollinsRTUGauge (void)
07584 {
07585   memset (&rtu_, 0, sizeof(SMessage));
07586   memset (&dme1, 0, sizeof(SMessage));
07587   memset (&dme2, 0, sizeof(SMessage));
07588   strcpy (dmeH.art, "");
07589   dmeH.x = dmeH.y = 0;
07590   strcpy (repl.art, "");
07591   repl.x = repl.y = 0;
07592   side = 0;
07593 }
07594 
07595 int CCollinsRTUGauge::Read (SStream *stream, Tag tag)
07596 {
07597   int rc = TAG_IGNORED;
07598 
07599   switch (tag) {
07600   case 'lin1':
07601     ReadFrom (&lin1, stream);
07602     rc = TAG_READ;
07603     break;
07604 
07605   case 'lin2':
07606     ReadFrom (&lin2, stream);
07607     rc = TAG_READ;
07608     break;
07609 
07610   case 'lin3':
07611     ReadFrom (&lin3, stream);
07612     rc = TAG_READ;
07613     break;
07614 
07615   case 'lin4':
07616     ReadFrom (&lin4, stream);
07617     rc = TAG_READ;
07618     break;
07619 
07620   case 'lin5':
07621     ReadFrom (&lin4, stream);
07622     rc = TAG_READ;
07623     break;
07624 
07625   case 'btn1':
07626     ReadFrom (&btn1, stream);
07627     rc = TAG_READ;
07628     break;
07629 
07630   case 'btn2':
07631     ReadFrom (&btn2, stream);
07632     rc = TAG_READ;
07633     break;
07634 
07635   case 'btn3':
07636     ReadFrom (&btn3, stream);
07637     rc = TAG_READ;
07638     break;
07639 
07640   case 'btn4':
07641     ReadFrom (&btn4, stream);
07642     rc = TAG_READ;
07643     break;
07644 
07645   case 'btn5':
07646     ReadFrom (&btn5, stream);
07647     rc = TAG_READ;
07648     break;
07649 
07650   case 'cmaw':
07651     ReadFrom (&cmaw, stream);
07652     rc = TAG_READ;
07653     break;
07654 
07655   case 'cmaf':
07656     ReadFrom (&cmaf, stream);
07657     rc = TAG_READ;
07658     break;
07659 
07660   case 'cmsw':
07661     ReadFrom (&cmsw, stream);
07662     rc = TAG_READ;
07663     break;
07664 
07665   case 'cmsf':
07666     ReadFrom (&cmsf, stream);
07667     rc = TAG_READ;
07668     break;
07669 
07670   case 'nvaw':
07671     ReadFrom (&nvaw, stream);
07672     rc = TAG_READ;
07673     break;
07674 
07675   case 'nvaf':
07676     ReadFrom (&nvaf, stream);
07677     rc = TAG_READ;
07678     break;
07679 
07680   case 'adf1':
07681     ReadFrom (&adf1, stream);
07682     rc = TAG_READ;
07683     break;
07684 
07685   case 'adf2':
07686     ReadFrom (&adf2, stream);
07687     rc = TAG_READ;
07688     break;
07689 
07690   case 'adf3':
07691     ReadFrom (&adf3, stream);
07692     rc = TAG_READ;
07693     break;
07694 
07695   case 'adf4':
07696     ReadFrom (&adf4, stream);
07697     rc = TAG_READ;
07698     break;
07699 
07700   case 'adf5':
07701     ReadFrom (&adf5, stream);
07702     rc = TAG_READ;
07703     break;
07704 
07705   case 'xpd1':
07706     ReadFrom (&xpd1, stream);
07707     rc = TAG_READ;
07708     break;
07709 
07710   case 'xpd2':
07711     ReadFrom (&xpd2, stream);
07712     rc = TAG_READ;
07713     break;
07714 
07715   case 'xpd3':
07716     ReadFrom (&xpd3, stream);
07717     rc = TAG_READ;
07718     break;
07719 
07720   case 'xpd4':
07721     ReadFrom (&xpd4, stream);
07722     rc = TAG_READ;
07723     break;
07724 
07725   case 'atci':
07726     ReadFrom (&atci, stream);
07727     rc = TAG_READ;
07728     break;
07729 
07730   case 'dmeh':
07731     ReadFrom (&dmeh, stream);
07732     rc = TAG_READ;
07733     break;
07734 
07735   case 'coms':
07736     ReadFrom (&coms, stream);
07737     rc = TAG_READ;
07738     break;
07739 
07740   case 'atcs':
07741     ReadFrom (&atcs, stream);
07742     rc = TAG_READ;
07743     break;
07744 
07745   case '1/2_':
07746     ReadFrom (&b1_2, stream);
07747     rc = TAG_READ;
07748     break;
07749 
07750   case 'adft':
07751     ReadFrom (&xpd1, stream);
07752     rc = TAG_READ;
07753     break;
07754 
07755   case 'rtu_':
07756     ReadMessage (&rtu_, stream);
07757     rc = TAG_READ;
07758     break;
07759 
07760   case 'dme1':
07761     ReadMessage (&dme1, stream);
07762     rc = TAG_READ;
07763     break;
07764 
07765   case 'dme2':
07766     ReadMessage (&dme2, stream);
07767     rc = TAG_READ;
07768     break;
07769 
07770   case 'dmeH':
07771     ReadString (dmeH.art, 64, stream);
07772     ReadInt (&dmeH.x, stream);
07773     ReadInt (&dmeH.y, stream);
07774     rc = TAG_READ;
07775     break;
07776 
07777   case 'repl':
07778     ReadString (repl.art, 64, stream);
07779     ReadInt (&repl.x, stream);
07780     ReadInt (&repl.y, stream);
07781     rc = TAG_READ;
07782     break;
07783 
07784   case 'side':
07785     ReadInt (&side, stream);
07786     rc = TAG_READ;
07787     break;
07788   }
07789 
07790   if (rc == TAG_IGNORED) {
07791     rc = CBitmapGauge::Read (stream, tag);
07792   }
07793 
07794   if (rc == TAG_IGNORED) {
07795     char s[64];
07796     TagToString (s, tag);
07797     globals->logWarning->Write ("CCollinsRTUGauge::Read : Unknown tag %s", s);
07798   }
07799 
07800   return rc;
07801 }
07802 
07803 
07804 //
07805 // CCollinsAirDataGauge
07806 //
07807 CCollinsAirDataGauge::CCollinsAirDataGauge (void)
07808 {
07809 }
07810 
07811 int CCollinsAirDataGauge::Read (SStream *stream, Tag tag)
07812 {
07813   int rc = TAG_IGNORED;
07814 
07815   switch (tag) {
07816   case 'scrn':
07817     ReadFrom (&scrn, stream);
07818     rc = TAG_READ;
07819     break;
07820 
07821   case 'baro':
07822     ReadFrom (&baro, stream);
07823     rc = TAG_READ;
07824     break;
07825 
07826   case 'vs__':
07827     ReadFrom (&vs__, stream);
07828     rc = TAG_READ;
07829     break;
07830 
07831   case 'alt_':
07832     ReadFrom (&alt_, stream);
07833     rc = TAG_READ;
07834     break;
07835 
07836   case 'in__':
07837     ReadFrom (&in__, stream);
07838     rc = TAG_READ;
07839     break;
07840 
07841   case 'mb__':
07842     ReadFrom (&mb__, stream);
07843     rc = TAG_READ;
07844     break;
07845   }
07846 
07847   if (rc == TAG_IGNORED) {
07848     rc = CBitmapGauge::Read (stream, tag);
07849   }
07850 
07851   if (rc == TAG_IGNORED) {
07852     char s[64];
07853     TagToString (s, tag);
07854     globals->logWarning->Write ("CCollinsAirDataGauge::Read : Unknown tag %s", s);
07855   }
07856 
07857   return rc;
07858 }
07859 
07860 
07861 //
07862 // CCollinsMNDGauge
07863 //
07864 CCollinsMNDGauge::CCollinsMNDGauge (void)
07865 {
07866   memset (&obs_, 0, sizeof(SMessage));
07867   memset (&ap__, 0, sizeof(SMessage));
07868 }
07869 
07870 int CCollinsMNDGauge::Read (SStream *stream, Tag tag)
07871 {
07872   int rc = TAG_IGNORED;
07873 
07874   switch (tag) {
07875   case 'obs_':
07876     ReadMessage (&obs_, stream);
07877     rc = TAG_READ;
07878     break;
07879 
07880   case 'ap__':
07881     ReadMessage (&ap__, stream);
07882     rc = TAG_READ;
07883     break;
07884 
07885   case 'frmt':
07886     ReadFrom (&frmt, stream);
07887     rc = TAG_READ;
07888     break;
07889 
07890   case 'hdg_':
07891     ReadFrom (&hdg_, stream);
07892     rc = TAG_READ;
07893     break;
07894 
07895   case 'crs_':
07896     ReadFrom (&crs_, stream);
07897     rc = TAG_READ;
07898     break;
07899 
07900   case 'brgt':
07901     ReadFrom (&brgt, stream);
07902     rc = TAG_READ;
07903     break;
07904   }
07905 
07906   if (rc == TAG_IGNORED) {
07907     rc = CBitmapGauge::Read (stream, tag);
07908   }
07909 
07910   if (rc == TAG_IGNORED) {
07911     char s[64];
07912     TagToString (s, tag);
07913     globals->logWarning->Write ("CCollinsMNDGauge::Read : Unknown tag %s", s);
07914   }
07915 
07916   return rc;
07917 }
07918 
07919 
07920 //
07921 // CUniversalFMSGauge
07922 //
07923 CUniversalFMSGauge::CUniversalFMSGauge (void)
07924 {
07925 }
07926 
07927 int CUniversalFMSGauge::Read (SStream *stream, Tag tag)
07928 {
07929   int rc = TAG_IGNORED;
07930 
07931   switch (tag) {
07932   case 'scrn':
07933     ReadFrom (&scrn, stream);
07934     rc = TAG_READ;
07935     break;
07936 
07937   case 'l1__':
07938     ReadFrom (&l1, stream);
07939     rc = TAG_READ;
07940     break;
07941 
07942   case 'l2__':
07943     ReadFrom (&l2, stream);
07944     rc = TAG_READ;
07945     break;
07946 
07947   case 'l3__':
07948     ReadFrom (&l3, stream);
07949     rc = TAG_READ;
07950     break;
07951 
07952   case 'l4__':
07953     ReadFrom (&l4, stream);
07954     rc = TAG_READ;
07955     break;
07956 
07957   case 'l5__':
07958     ReadFrom (&l5, stream);
07959     rc = TAG_READ;
07960     break;
07961 
07962   case 'r1__':
07963     ReadFrom (&r1, stream);
07964     rc = TAG_READ;
07965     break;
07966 
07967   case 'r2__':
07968     ReadFrom (&r2, stream);
07969     rc = TAG_READ;
07970     break;
07971 
07972   case 'r3__':
07973     ReadFrom (&r3, stream);
07974     rc = TAG_READ;
07975     break;
07976 
07977   case 'r4__':
07978     ReadFrom (&r4, stream);
07979     rc = TAG_READ;
07980     break;
07981 
07982   case 'r5__':
07983     ReadFrom (&r5, stream);
07984     rc = TAG_READ;
07985     break;
07986 
07987   case 'data':
07988     ReadFrom (&data, stream);
07989     rc = TAG_READ;
07990     break;
07991 
07992   case 'nav_':
07993     ReadFrom (&nav, stream);
07994     rc = TAG_READ;
07995     break;
07996 
07997   case 'vnav':
07998     ReadFrom (&vnav, stream);
07999     rc = TAG_READ;
08000     break;
08001 
08002   case 'dto_':
08003     ReadFrom (&dto, stream);
08004     rc = TAG_READ;
08005     break;
08006 
08007   case 'list':
08008     ReadFrom (&list, stream);
08009     rc = TAG_READ;
08010     break;
08011 
08012   case 'prev':
08013     ReadFrom (&prev, stream);
08014     rc = TAG_READ;
08015     break;
08016 
08017   case 'fuel':
08018     ReadFrom (&fuel, stream);
08019     rc = TAG_READ;
08020     break;
08021 
08022   case 'fpl_':
08023     ReadFrom (&fpl, stream);
08024     rc = TAG_READ;
08025     break;
08026 
08027   case 'perf':
08028     ReadFrom (&perf, stream);
08029     rc = TAG_READ;
08030     break;
08031 
08032   case 'tune':
08033     ReadFrom (&tune, stream);
08034     rc = TAG_READ;
08035     break;
08036 
08037   case 'menu':
08038     ReadFrom (&menu, stream);
08039     rc = TAG_READ;
08040     break;
08041 
08042   case 'next':
08043     ReadFrom (&next, stream);
08044     rc = TAG_READ;
08045     break;
08046 
08047   case '1___':
08048     ReadFrom (&key1, stream);
08049     rc = TAG_READ;
08050     break;
08051 
08052   case '2___':
08053     ReadFrom (&key2, stream);
08054     rc = TAG_READ;
08055     break;
08056 
08057   case '3___':
08058     ReadFrom (&key3, stream);
08059     rc = TAG_READ;
08060     break;
08061 
08062   case '4___':
08063     ReadFrom (&key4, stream);
08064     rc = TAG_READ;
08065     break;
08066 
08067   case '5___':
08068     ReadFrom (&key5, stream);
08069     rc = TAG_READ;
08070     break;
08071 
08072   case '6___':
08073     ReadFrom (&key6, stream);
08074     rc = TAG_READ;
08075     break;
08076 
08077   case '7___':
08078     ReadFrom (&key7, stream);
08079     rc = TAG_READ;
08080     break;
08081 
08082   case '8___':
08083     ReadFrom (&key8, stream);
08084     rc = TAG_READ;
08085     break;
08086 
08087   case '9___':
08088     ReadFrom (&key9, stream);
08089     rc = TAG_READ;
08090     break;
08091 
08092   case 'back':
08093     ReadFrom (&back, stream);
08094     rc = TAG_READ;
08095     break;
08096 
08097   case '0___':
08098     ReadFrom (&key0, stream);
08099     rc = TAG_READ;
08100     break;
08101 
08102   case 'msg_':
08103     ReadFrom (&msg, stream);
08104     rc = TAG_READ;
08105     break;
08106 
08107   case 'dim_':
08108     ReadFrom (&dim, stream);
08109     rc = TAG_READ;
08110     break;
08111 
08112   case '+-__':
08113     ReadFrom (&plus, stream);
08114     rc = TAG_READ;
08115     break;
08116 
08117   case 'entr':
08118     ReadFrom (&entr, stream);
08119     rc = TAG_READ;
08120     break;
08121 
08122   case 'A___':
08123     ReadFrom (&keyA, stream);
08124     rc = TAG_READ;
08125     break;
08126 
08127   case 'B___':
08128     ReadFrom (&keyB, stream);
08129     rc = TAG_READ;
08130     break;
08131 
08132   case 'C___':
08133     ReadFrom (&keyC, stream);
08134     rc = TAG_READ;
08135     break;
08136 
08137   case 'D___':
08138     ReadFrom (&keyD, stream);
08139     rc = TAG_READ;
08140     break;
08141 
08142   case 'E___':
08143     ReadFrom (&keyE, stream);
08144     rc = TAG_READ;
08145     break;
08146 
08147   case 'F___':
08148     ReadFrom (&keyF, stream);
08149     rc = TAG_READ;
08150     break;
08151 
08152   case 'G___':
08153     ReadFrom (&keyG, stream);
08154     rc = TAG_READ;
08155     break;
08156 
08157   case 'H___':
08158     ReadFrom (&keyH, stream);
08159     rc = TAG_READ;
08160     break;
08161 
08162   case 'I___':
08163     ReadFrom (&keyI, stream);
08164     rc = TAG_READ;
08165     break;
08166 
08167   case 'J___':
08168     ReadFrom (&keyJ, stream);
08169     rc = TAG_READ;
08170     break;
08171 
08172   case 'K___':
08173     ReadFrom (&keyK, stream);
08174     rc = TAG_READ;
08175     break;
08176 
08177   case 'L___':
08178     ReadFrom (&keyL, stream);
08179     rc = TAG_READ;
08180     break;
08181 
08182   case 'M___':
08183     ReadFrom (&keyM, stream);
08184     rc = TAG_READ;
08185     break;
08186 
08187   case 'N___':
08188     ReadFrom (&keyN, stream);
08189     rc = TAG_READ;
08190     break;
08191 
08192   case 'O___':
08193     ReadFrom (&keyO, stream);
08194     rc = TAG_READ;
08195     break;
08196 
08197   case 'P___':
08198     ReadFrom (&keyP, stream);
08199     rc = TAG_READ;
08200     break;
08201 
08202   case 'Q___':
08203     ReadFrom (&keyQ, stream);
08204     rc = TAG_READ;
08205     break;
08206 
08207   case 'R___':
08208     ReadFrom (&keyR, stream);
08209     rc = TAG_READ;
08210     break;
08211 
08212   case 'S___':
08213     ReadFrom (&keyS, stream);
08214     rc = TAG_READ;
08215     break;
08216 
08217   case 'T___':
08218     ReadFrom (&keyT, stream);
08219     rc = TAG_READ;
08220     break;
08221 
08222   case 'U___':
08223     ReadFrom (&keyU, stream);
08224     rc = TAG_READ;
08225     break;
08226 
08227   case 'V___':
08228     ReadFrom (&keyV, stream);
08229     rc = TAG_READ;
08230     break;
08231 
08232   case 'W___':
08233     ReadFrom (&keyW, stream);
08234     rc = TAG_READ;
08235     break;
08236 
08237   case 'X___':
08238     ReadFrom (&keyX, stream);
08239     rc = TAG_READ;
08240     break;
08241 
08242   case 'Y___':
08243     ReadFrom (&keyY, stream);
08244     rc = TAG_READ;
08245     break;
08246 
08247   case 'Z___':
08248     ReadFrom (&keyZ, stream);
08249     rc = TAG_READ;
08250     break;
08251   }
08252 
08253   if (rc == TAG_IGNORED) {
08254     rc = CBitmapGauge::Read (stream, tag);
08255   }
08256 
08257   if (rc == TAG_IGNORED) {
08258     char s[64];
08259     TagToString (s, tag);
08260     globals->logWarning->Write ("CUniversalFMSGauge::Read : Unknown tag %s", s);
08261   }
08262 
08263   return rc;
08264 }
08265 
08266 
08267 //
08268 // CPilatusEFISPanel
08269 //
08270 CPilatusEFISPanel::CPilatusEFISPanel (void)
08271 {
08272   memset (&pfdm, 0, sizeof(SMessage));
08273   memset (&navm, 0, sizeof(SMessage));
08274 }
08275 
08276 int CPilatusEFISPanel::Read (SStream *stream, Tag tag)
08277 {
08278   int rc = TAG_IGNORED;
08279 
08280   switch (tag) {
08281   case 'pfdm':
08282     ReadMessage (&pfdm, stream);
08283     rc = TAG_READ;
08284     break;
08285 
08286   case 'navm':
08287     ReadMessage (&navm, stream);
08288     rc = TAG_READ;
08289     break;
08290 
08291   case 'dh__':
08292     ReadFrom (&dh, stream);
08293     rc = TAG_READ;
08294     break;
08295 
08296   case 'brt_':
08297     ReadFrom (&brt, stream);
08298     rc = TAG_READ;
08299     break;
08300 
08301   case 'crs_':
08302     ReadFrom (&crs, stream);
08303     rc = TAG_READ;
08304     break;
08305 
08306   case 'hdg_':
08307     ReadFrom (&hdg, stream);
08308     rc = TAG_READ;
08309     break;
08310 
08311   case 'hsi_':
08312     ReadFrom (&hsi, stream);
08313     rc = TAG_READ;
08314     break;
08315 
08316   case 'arc_':
08317     ReadFrom (&arc, stream);
08318     rc = TAG_READ;
08319     break;
08320 
08321   case 'nav_':
08322     ReadFrom (&nav, stream);
08323     rc = TAG_READ;
08324     break;
08325 
08326   case 'rgup':
08327     ReadFrom (&rgup, stream);
08328     rc = TAG_READ;
08329     break;
08330 
08331   case 'rgdn':
08332     ReadFrom (&rgdn, stream);
08333     rc = TAG_READ;
08334     break;
08335 
08336   case 'nav1':
08337     ReadFrom (&nav1, stream);
08338     rc = TAG_READ;
08339     break;
08340 
08341   case 'nav2':
08342     ReadFrom (&nav2, stream);
08343     rc = TAG_READ;
08344     break;
08345 
08346   case 'k1_2':
08347     ReadFrom (&k1_2, stream);
08348     rc = TAG_READ;
08349     break;
08350   }
08351 
08352   if (rc == TAG_IGNORED) {
08353     rc = CBitmapGauge::Read (stream, tag);
08354   }
08355 
08356   if (rc == TAG_IGNORED) {
08357     char s[64];
08358     TagToString (s, tag);
08359     globals->logWarning->Write ("CPilatusEFISPanel::Read : Unknown tag %s", s);
08360   }
08361 
08362   return rc;
08363 }
08364 
08365 //
08366 // CWalkerTempAirspeedGauge
08367 //
08368 CWalkerTempAirspeedGauge::CWalkerTempAirspeedGauge (void)
08369 {
08370 }
08371 
08372 int CWalkerTempAirspeedGauge::Read (SStream *stream, Tag tag)
08373 {
08374   int rc = TAG_IGNORED;
08375 
08376   switch (tag) {
08377   case 'tat_':
08378     ReadFrom (&tat, stream);
08379     rc = TAG_READ;
08380     break;
08381 
08382   case 'sat_':
08383     ReadFrom (&sat, stream);
08384     rc = TAG_READ;
08385     break;
08386 
08387   case 'tas_':
08388     ReadFrom (&tas, stream);
08389     rc = TAG_READ;
08390     break;
08391   }
08392 
08393   if (rc == TAG_IGNORED) {
08394     rc = CBitmapGauge::Read (stream, tag);
08395   }
08396 
08397   if (rc == TAG_IGNORED) {
08398     char s[64];
08399     TagToString (s, tag);
08400     globals->logWarning->Write ("CWalkerTempAirspeedGauge::Read : Unknown tag %s", s);
08401   }
08402 
08403   return rc;
08404 }
08405 
08406 //
08407 // CGyroSlavingGauge
08408 //
08409 CGyroSlavingGauge::CGyroSlavingGauge (void)
08410 {
08411   strcpy (slvb.art, "");
08412   slvb.x = slvb.y = 0;
08413   strcpy (ccwb.art, "");
08414   ccwb.x = ccwb.y = 0;
08415   lrgb_r = lrgb_g = lrgb_b = 0;
08416   strcpy (sfxu_wav, "");
08417   strcpy (sfxd_wav, "");
08418   sfxu_tag = sfxd_tag = 0;
08419 }
08420 
08421 int CGyroSlavingGauge::Read (SStream *stream, Tag tag)
08422 {
08423   int rc = TAG_IGNORED;
08424 
08425   switch (tag) {
08426   case 'nedl':
08427     ReadString (nedl.art, 64, stream);
08428     ReadInt (&nedl.x, stream);
08429     ReadInt (&nedl.y, stream);
08430     rc = TAG_READ;
08431     break;
08432 
08433   case 'slvb':
08434     ReadString (slvb.art, 64, stream);
08435     ReadInt (&slvb.x, stream);
08436     ReadInt (&slvb.y, stream);
08437     rc = TAG_READ;
08438     break;
08439 
08440   case 'ccwb':
08441     ReadString (ccwb.art, 64, stream);
08442     ReadInt (&ccwb.x, stream);
08443     ReadInt (&ccwb.y, stream);
08444     rc = TAG_READ;
08445     break;
08446 
08447   case 'err_':
08448     ReadFrom (&err, stream);
08449     rc = TAG_READ;
08450     break;
08451 
08452   case 'slav':
08453     ReadFrom (&slav, stream);
08454     rc = TAG_READ;
08455     break;
08456 
08457   case 'free':
08458     ReadFrom (&free, stream);
08459     rc = TAG_READ;
08460     break;
08461   
08462   case 'mode':
08463     ReadFrom (&mode, stream);
08464     rc = TAG_READ;
08465     break;
08466 
08467   case 'ccw_':
08468     ReadFrom (&ccw, stream);
08469     rc = TAG_READ;
08470     break;
08471 
08472   case 'cw__':
08473     ReadFrom (&cw, stream);
08474     rc = TAG_READ;
08475     break;
08476 
08477   case 'lrgb':
08478     ReadInt (&lrgb_r, stream);
08479     ReadInt (&lrgb_g, stream);
08480     ReadInt (&lrgb_b, stream);
08481     rc = TAG_READ;
08482     break;
08483 
08484   case 'sfx_':
08485     ReadString (sfxu_wav, 64, stream);
08486     ReadString (sfxd_wav, 64, stream);
08487     rc = TAG_READ;
08488     break;
08489   }
08490 
08491   if (rc == TAG_IGNORED) {
08492     rc = CBitmapGauge::Read (stream, tag);
08493   }
08494 
08495   if (rc == TAG_IGNORED) {
08496     char s[64];
08497     TagToString (s, tag);
08498     globals->logWarning->Write ("CGyroSlavingGauge::Read : Unknown tag %s", s);
08499   }
08500 
08501   return rc;
08502 }
08503 
08504 void CGyroSlavingGauge::ReadFinished (void)
08505 {
08506   CBitmapGauge::ReadFinished ();
08507 
08508   // Load sound effects
08509   if (strlen (sfxu_wav) > 0) {
08510     char sfxFullname[64];
08511     strcpy (sfxFullname, "SOUND\\");
08512     strcat (sfxFullname, sfxu_wav);
08513     sfxu_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
08514   }
08515   if (strlen (sfxd_wav) > 0) {
08516     char sfxFullname[64];
08517     strcpy (sfxFullname, "SOUND\\");
08518     strcat (sfxFullname, sfxd_wav);
08519     sfxd_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
08520   }
08521 }
08522 
08523 
08524 //
08525 // CVerticalRateGauge
08526 //
08527 CVerticalRateGauge::CVerticalRateGauge (void)
08528 {
08529   avil = 0;
08530 }
08531 
08532 int CVerticalRateGauge::Read (SStream *stream, Tag tag)
08533 {
08534   int rc = TAG_IGNORED;
08535 
08536   switch (tag) {
08537   case 'eng_':
08538     ReadFrom (&eng, stream);
08539     rc = TAG_READ;
08540     break;
08541 
08542   case 'arm_':
08543     ReadFrom (&arm, stream);
08544     rc = TAG_READ;
08545     break;
08546 
08547   case 'knob':
08548     ReadFrom (&knob, stream);
08549     rc = TAG_READ;
08550     break;
08551 
08552   case 'led_':
08553     ReadFrom (&led, stream);
08554     rc = TAG_READ;
08555     break;
08556 
08557   case 'avil':
08558     ReadTag (&avil, stream);
08559     rc = TAG_READ;
08560     break;
08561   }
08562 
08563   if (rc == TAG_IGNORED) {
08564     rc = CBitmapGauge::Read (stream, tag);
08565   }
08566 
08567   if (rc == TAG_IGNORED) {
08568     char s[64];
08569     TagToString (s, tag);
08570     globals->logWarning->Write ("CVerticalRateGauge::Read : Unknown tag %s", s);
08571   }
08572 
08573   return rc;
08574 }
08575 
08576 //
08577 // CPropSyncGauge
08578 //
08579 CPropSyncGauge::CPropSyncGauge (void)
08580 {
08581 }
08582 
08583 int CPropSyncGauge::Read (SStream *stream, Tag tag)
08584 {
08585   int rc = TAG_IGNORED;
08586 
08587   if (rc == TAG_IGNORED) {
08588     rc = CBitmapGauge::Read (stream, tag);
08589   }
08590 
08591   if (rc == TAG_IGNORED) {
08592     char s[64];
08593     TagToString (s, tag);
08594     globals->logWarning->Write ("CPropSyncGauge::Read : Unknown tag %s", s);
08595   }
08596 
08597   return rc;
08598 }
08599 
08600 //
08601 // CDMEGauge
08602 //
08603 CDMEGauge::CDMEGauge (void)
08604 {
08605   hold = false;
08606   dist_x = dist_y = 0;
08607   sped_x = sped_y = 0;
08608   time_x = time_y = 0;
08609   tiny = false;
08610 }
08611 
08612 int CDMEGauge::Read (SStream *stream, Tag tag)
08613 {
08614   int rc = TAG_IGNORED;
08615 
08616   switch (tag) {
08617   case 'hold':
08618     hold = true;
08619     rc = TAG_READ;
08620     break;
08621 
08622   case 'dist':
08623     ReadInt (&dist_x, stream);
08624     ReadInt (&dist_y, stream);
08625     rc = TAG_READ;
08626     break;
08627 
08628   case 'sped':
08629     ReadInt (&sped_x, stream);
08630     ReadInt (&sped_y, stream);
08631     rc = TAG_READ;
08632     break;
08633 
08634   case 'time':
08635     ReadInt (&time_x, stream);
08636     ReadInt (&time_y, stream);
08637     rc = TAG_READ;
08638     break;
08639 
08640   case 'knob':
08641     ReadFrom (&knob, stream);
08642     rc = TAG_READ;
08643     break;
08644 
08645   case 'tiny':
08646     tiny = true;
08647     rc = TAG_READ;
08648     break;
08649   }
08650 
08651   if (rc == TAG_IGNORED) {
08652     rc = CBitmapGauge::Read (stream, tag);
08653   }
08654 
08655   if (rc == TAG_IGNORED) {
08656     char s[64];
08657     TagToString (s, tag);
08658     globals->logWarning->Write ("CDMEGauge::Read : Unknown tag %s", s);
08659   }
08660 
08661   return rc;
08662 }
08663 
08664 ECursorResult CDMEGauge::MouseMoved (int x, int y)
08665 {
08666   ECursorResult rc = CURSOR_NOT_CHANGED;
08667 
08668   // Send updated mouse position to all click areas
08669   if (rc == CURSOR_NOT_CHANGED) rc = knob.MouseMoved (x, y);
08670 
08671   // Call parent method if cursor not changed
08672   if (rc == CURSOR_NOT_CHANGED) {
08673     rc = CBitmapGauge::MouseMoved (x, y);
08674   }
08675 
08676   return rc;
08677 }
08678 
08679 
08680 //
08681 // CDME2Gauge
08682 //
08683 CDME2Gauge::CDME2Gauge (void)
08684 {
08685   hold = false;
08686   left_x = left_y = 0;
08687   rght_x = rght_y = 0;
08688 }
08689 
08690 int CDME2Gauge::Read (SStream *stream, Tag tag)
08691 {
08692   int rc = TAG_IGNORED;
08693 
08694   switch (tag) {
08695   case 'hold':
08696     hold = true;
08697     rc = TAG_READ;
08698     break;
08699 
08700   case 'left':
08701     ReadInt (&left_x, stream);
08702     ReadInt (&left_y, stream);
08703     rc = TAG_READ;
08704     break;
08705 
08706   case 'rght':
08707     ReadInt (&rght_x, stream);
08708     ReadInt (&rght_y, stream);
08709     rc = TAG_READ;
08710     break;
08711 
08712   case 'ch__':
08713     ReadFrom (&ch, stream);
08714     rc = TAG_READ;
08715     break;
08716 
08717   case 'sel_':
08718     ReadFrom (&sel, stream);
08719     rc = TAG_READ;
08720     break;
08721 
08722   case 'pwr_':
08723     ReadFrom (&pwr, stream);
08724     rc = TAG_READ;
08725     break;
08726   }
08727 
08728   if (rc == TAG_IGNORED) {
08729     rc = CBitmapGauge::Read (stream, tag);
08730   }
08731 
08732   if (rc == TAG_IGNORED) {
08733     char s[64];
08734     TagToString (s, tag);
08735     globals->logWarning->Write ("CDME2Gauge::Read : Unknown tag %s", s);
08736   }
08737 
08738   return rc;
08739 }
08740 
08741 
08742 ECursorResult CDME2Gauge::MouseMoved (int x, int y)
08743 {
08744   ECursorResult rc = CURSOR_NOT_CHANGED;
08745 
08746   // Send updated mouse position to all click areas
08747   if (rc == CURSOR_NOT_CHANGED) rc = ch.MouseMoved (x, y);
08748   if (rc == CURSOR_NOT_CHANGED) rc = sel.MouseMoved (x, y);
08749   if (rc == CURSOR_NOT_CHANGED) rc = pwr.MouseMoved (x, y);
08750 
08751   // Call parent method if cursor not changed
08752   if (rc == CURSOR_NOT_CHANGED) {
08753     rc = CBitmapGauge::MouseMoved (x, y);
08754   }
08755 
08756   return rc;
08757 }
08758 
08759 //
08760 // CWeatherRadarGauge
08761 //
08762 CWeatherRadarGauge::CWeatherRadarGauge (void)
08763 {
08764 }
08765 
08766 int CWeatherRadarGauge::Read (SStream *stream, Tag tag)
08767 {
08768   int rc = TAG_IGNORED;
08769 
08770   switch (tag) {
08771   case 'scrn':
08772     ReadFrom (&scrn, stream);
08773     rc = TAG_READ;
08774     break;
08775 
08776   case 'wx__':
08777     ReadFrom (&wx, stream);
08778     rc = TAG_READ;
08779     break;
08780 
08781   case 'vp__':
08782     ReadFrom (&vp, stream);
08783     rc = TAG_READ;
08784     break;
08785 
08786   case 'map_':
08787     ReadFrom (&map, stream);
08788     rc = TAG_READ;
08789     break;
08790 
08791   case 'nav_':
08792     ReadFrom (&nav, stream);
08793     rc = TAG_READ;
08794     break;
08795 
08796   case 'rng+':
08797     ReadFrom (&rngp, stream);
08798     rc = TAG_READ;
08799     break;
08800 
08801   case 'rng-':
08802     ReadFrom (&rngm, stream);
08803     rc = TAG_READ;
08804     break;
08805 
08806   case 'trk+':
08807     ReadFrom (&trkp, stream);
08808     rc = TAG_READ;
08809     break;
08810 
08811   case 'trk-':
08812     ReadFrom (&trkm, stream);
08813     rc = TAG_READ;
08814     break;
08815 
08816   case 'mode':
08817     ReadFrom (&mode, stream);
08818     rc = TAG_READ;
08819     break;
08820 
08821   case 'tilt':
08822     ReadFrom (&tilt, stream);
08823     rc = TAG_READ;
08824     break;
08825 
08826   case 'gain':
08827     ReadFrom (&gain, stream);
08828     rc = TAG_READ;
08829     break;
08830 
08831   case 'brit':
08832     ReadFrom (&brit, stream);
08833     rc = TAG_READ;
08834     break;
08835   }
08836 
08837   if (rc == TAG_IGNORED) {
08838     rc = CBitmapGauge::Read (stream, tag);
08839   }
08840 
08841   if (rc == TAG_IGNORED) {
08842     char s[64];
08843     TagToString (s, tag);
08844     globals->logWarning->Write ("CWeatherRadarGauge::Read : Unknown tag %s", s);
08845   }
08846 
08847   return rc;
08848 }
08849 
08850 
08851 //
08852 // CAnalogAltPreselectGauge
08853 //
08854 CAnalogAltPreselectGauge::CAnalogAltPreselectGauge (void)
08855 {
08856   strcpy (fdig_art, "");
08857   strcpy (digi_art, "");
08858   strcpy (zero_art, "");
08859   thou_x = thou_y = 0;
08860   hund_x = hund_y = 0;
08861   ones_x = ones_y = 0;
08862   dspc = 0;
08863   zspc = 0;
08864 }
08865 
08866 int CAnalogAltPreselectGauge::Read (SStream *stream, Tag tag)
08867 {
08868   int rc = TAG_IGNORED;
08869 
08870   switch (tag) {
08871   case 'knob':
08872     ReadFrom (&knob, stream);
08873     rc = TAG_READ;
08874     break;
08875 
08876   case 'fdig':
08877     ReadString (fdig_art, 64, stream);
08878     rc = TAG_READ;
08879     break;
08880 
08881   case 'digi':
08882     ReadString (digi_art, 64, stream);
08883     rc = TAG_READ;
08884     break;
08885 
08886   case 'zero':
08887     ReadString (zero_art, 64, stream);
08888     rc = TAG_READ;
08889     break;
08890 
08891   case 'thou':
08892     ReadInt (&thou_x, stream);
08893     ReadInt (&thou_y, stream);
08894     rc = TAG_READ;
08895     break;
08896 
08897   case 'hund':
08898     ReadInt (&hund_x, stream);
08899     ReadInt (&hund_y, stream);
08900     rc = TAG_READ;
08901     break;
08902 
08903   case 'ones':
08904     ReadInt (&ones_x, stream);
08905     ReadInt (&ones_y, stream);
08906     rc = TAG_READ;
08907     break;
08908 
08909   case 'dspc':
08910     ReadInt (&dspc, stream);
08911     rc = TAG_READ;
08912     break;
08913 
08914   case 'zspc':
08915     ReadInt (&zspc, stream);
08916     rc = TAG_READ;
08917     break;
08918 
08919   case 'aler':
08920     ReadFrom (&aler, stream);
08921     rc = TAG_READ;
08922     break;
08923   }
08924 
08925   if (rc == TAG_IGNORED) {
08926     rc = CBitmapGauge::Read (stream, tag);
08927   }
08928 
08929   if (rc == TAG_IGNORED) {
08930     char s[64];
08931     TagToString (s, tag);
08932     globals->logWarning->Write ("CAnalogAltPreselectGauge::Read : Unknown tag %s", s);
08933   }
08934 
08935   return rc;
08936 }
08937 
08938 
08939 //
08940 // CMomentaryHotSpotGauge
08941 //
08942 
08943 CMomentaryHotSpotGauge::CMomentaryHotSpotGauge (void)
08944 {
08945 }
08946 
08947 int CMomentaryHotSpotGauge::Read (SStream *stream, Tag tag)
08948 {
08949   int rc = TAG_IGNORED;
08950 
08951   if (rc == TAG_IGNORED) {
08952     rc = CBitmapGauge::Read (stream, tag);
08953   }
08954 
08955   if (rc == TAG_IGNORED) {
08956     char s[64];
08957     TagToString (s, tag);
08958     globals->logWarning->Write ("CMomentaryHotSpotGauge::Read : Unknown tag %s", s);
08959   }
08960 
08961   return rc;
08962 }
08963 
08964 
08965 //
08966 // CLitInOutSwitch
08967 //
08968 
08969 CLitInOutSwitch::CLitInOutSwitch (void)
08970 {
08971   memset (&powr, 0, sizeof(SMessage));
08972 }
08973 
08974 int CLitInOutSwitch::Read (SStream *stream, Tag tag)
08975 {
08976   int rc = TAG_IGNORED;
08977 
08978   switch (tag) {
08979   case 'powr':
08980     ReadMessage (&powr, stream);
08981     rc = TAG_READ;
08982     break;
08983   }
08984 
08985   if (rc == TAG_IGNORED) {
08986     rc = CSimpleInOutStateSwitch::Read (stream, tag);
08987   }
08988 
08989   if (rc == TAG_IGNORED) {
08990     char s[64];
08991     TagToString (s, tag);
08992     globals->logWarning->Write ("CLitInOutSwitchGauge::Read : Unknown tag %s", s);
08993   }
08994 
08995   return rc;
08996 }
08997 
08998 
08999 //
09000 // CSimpleSwitch
09001 //
09002 
09003 CSimpleSwitch::CSimpleSwitch (void)
09004 {
09005   strcpy (bmap_art, "");
09006   bmap = NULL;
09007 
09008   // Sound effect initialization
09009   strcpy (sfxu_wav, "");
09010   strcpy (sfxd_wav, "");
09011   sfxu_tag = sfxd_tag = 0;
09012 
09013   // Cursor initialization
09014   strcpy (csru_csr, "");
09015   strcpy (csrd_csr, "");
09016   csru_tag = csrd_tag = 0;
09017 
09018   stat_n = 0;
09019   stat = NULL;
09020   sstr_n = 0;
09021   sstr = NULL;
09022   orie = 0;
09023   ordr = 0;
09024   indx = 0;
09025   mmnt = false;
09026   mntO = false;
09027 }
09028 
09029 int CSimpleSwitch::Read (SStream *stream, Tag tag)
09030 {
09031   int rc = TAG_IGNORED;
09032 
09033   switch (tag) {
09034   case 'bmap':
09035     ReadString (bmap_art, 64, stream);
09036     rc = TAG_READ;
09037     break;
09038 
09039   case 'sfxi':
09040   case 'sfxd':
09041   case 'sfxl':
09042     ReadString (sfxd_wav, 64, stream);
09043     rc = TAG_READ;
09044     break;
09045 
09046   case 'sfxo':
09047   case 'sfxu':
09048   case 'sfxr':
09049     ReadString (sfxu_wav, 64, stream);
09050     rc = TAG_READ;
09051     break;
09052 
09053   case 'csrd':
09054   case 'csrl':
09055     ReadString (csrd_csr, 64, stream);
09056     rc = TAG_READ;
09057     break;
09058 
09059   case 'csru':
09060   case 'csrr':
09061     ReadString (csru_csr, 64, stream);
09062     rc = TAG_READ;
09063     break;
09064 
09065   case 'stat':
09066     {
09067       ReadInt (&stat_n, stream);
09068       if (stat_n > 16) {
09069         gtfo ("CSimpleSwitch : <stat> maximum 16 states exceeded");
09070       }
09071       stat = new int[stat_n];
09072       for (int i=0; i<stat_n; i++) {
09073         ReadInt (&stat[i], stream);
09074       }
09075     }
09076     rc = TAG_READ;
09077     break;
09078 
09079   case 'sstr':
09080     {
09081       ReadInt (&sstr_n, stream);
09082       if (sstr_n > 16) {
09083         gtfo ("CSimpleSwitch : <sstr> maximum 16 states exceeded");
09084       }
09085       sstr = new char*[sstr_n];
09086       for (int i=0; i<sstr_n; i++) {
09087         sstr[i] = new char[64];
09088         ReadString (sstr[i], 64, stream);
09089       }
09090     }
09091     rc = TAG_READ;
09092     break;
09093 
09094   case 'orie':
09095     ReadInt (&orie, stream);
09096     rc = TAG_READ;
09097     break;
09098 
09099   case 'ordr':
09100     ReadInt (&orie, stream);
09101     rc = TAG_READ;
09102     break;
09103 
09104   case 'indx':
09105     ReadInt (&indx, stream);
09106     rc = TAG_READ;
09107     break;
09108 
09109   case 'mmnt':
09110     mmnt = true;
09111     rc = TAG_READ;
09112     break;
09113 
09114   case 'mntO':
09115     mntO = true;
09116     rc = TAG_READ;
09117     break;
09118   }
09119 
09120   if (rc == TAG_IGNORED) {
09121     rc = CGauge::Read (stream, tag);
09122   }
09123 
09124   if (rc == TAG_IGNORED) {
09125     char s[64];
09126     TagToString (s, tag);
09127     globals->logWarning->Write ("CSimpleSwitch::Read : Unknown tag %s", s);
09128   }
09129 
09130   return rc;
09131 }
09132 
09133 
09134 void CSimpleSwitch::ReadFinished (void)
09135 {
09136   CGauge::ReadFinished ();
09137 
09138   // Load bitmap artwork
09139   if (strlen (bmap_art) > 0) {
09140     bmap = new SBitmap;
09141     strcpy (bmap->bitmapName, "ART\\");
09142     strcat (bmap->bitmapName, bmap_art);
09143     LoadBitmap (bmap);
09144   }
09145 
09146   // Load sound effects
09147   if (strlen (sfxu_wav) > 0) {
09148     char sfxFullname[64];
09149     strcpy (sfxFullname, "SOUND\\");
09150     strcat (sfxFullname, sfxu_wav);
09151     sfxu_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
09152   }
09153   if (strlen (sfxd_wav) > 0) {
09154     char sfxFullname[64];
09155     strcpy (sfxFullname, "SOUND\\");
09156     strcat (sfxFullname, sfxd_wav);
09157     sfxd_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
09158   }
09159 
09160   // Bind cursors
09161   if (strlen (csru_csr) > 0) {
09162     csru_tag = globals->cursormgr->BindCursor (csru_csr);
09163   }
09164 
09165   if (strlen (csrd_csr) > 0) {
09166     csrd_tag = globals->cursormgr->BindCursor (csrd_csr);
09167   }
09168 
09169   // Initialize default state
09170   if (stat_n > 0) {
09171     if (indx < stat_n) {
09172       last_state = stat[indx];
09173     } else {
09174       // Warning : Default index exceeds upper bound of state array
09175       globals->logWarning->Write ("CSimpleSwitch: Index (%d) exceeds size of state array (%d)",
09176         indx, stat_n);
09177     }
09178   } else {
09179     // No <stat> tag was specified, default to two states, 0 (off) and 1 (on)
09180     stat_n = 2;
09181     stat = new int[2];
09182     stat[0] = 0;
09183     stat[1] = 1;
09184     last_state = indx = 0;
09185   }
09186 }
09187 
09188 
09189 void CSimpleSwitch::Draw (void)
09190 {
09191   // Get subsystem state
09192   mesg.id = MSG_GETDATA;
09193   mesg.user.u.datatag = 'st8t';
09194   if (SendMessage (&mesg) == MSG_PROCESSED) {
09195     // If state value has changed, lookup new index
09196     if (last_state != mesg.intData) {
09197       for (int i=0; i <stat_n; i++) {
09198         if (mesg.intData == stat[i]) {
09199           // Found a match
09200           indx = i;
09201         }
09202       }
09203       last_state = mesg.intData;
09204     }
09205   }
09206 
09207   // Draw appropriate bitmap frame
09208   if (bmap != NULL) {
09209     DrawBitmap (surf, bmap, 0, 0, indx);
09210   }
09211 }
09212 
09213 
09214 // Increment switch state
09215 void CSimpleSwitch::IncState (void)
09216 {
09217   bool changed = false;
09218 
09219   // Check upper bound and increment index
09220   if (indx < (stat_n - 1)) {
09221     // State change is valid
09222     indx++;
09223     changed = true;
09224   }
09225 
09226   // Update subsystem is state has changed
09227   if (changed) {
09228     // Play sound effect
09229     if (sfxu_tag != 0) {
09230       globals->audiomgr->PlaySfx (sfx_source, sfxu_tag);
09231     }
09232 
09233     // Send message
09234     mesg.id = MSG_SETDATA;
09235     mesg.intData = stat[indx];
09236     mesg.user.u.datatag = 'st8t';
09237     SendMessage (&mesg);
09238   }
09239 }
09240 
09241 
09242 // Decrement switch state
09243 void CSimpleSwitch::DecState (void)
09244 {
09245   bool changed = false;
09246 
09247   // Check upper bound and increment index
09248   if (indx > 0) {
09249     // State change is valid
09250     indx--;
09251     changed = true;
09252   }
09253 
09254   // Update subsystem is state has changed
09255   if (changed) {
09256     // Play sound effect
09257     if (sfxd_tag != 0) {
09258       globals->audiomgr->PlaySfx (sfx_source, sfxd_tag);
09259     }
09260 
09261     // Send message
09262     mesg.id = MSG_SETDATA;
09263     mesg.intData = indx;
09264     mesg.user.u.datatag = 'st8t';
09265     SendMessage (&mesg);
09266   }
09267 }
09268 
09269 
09270 ECursorResult CSimpleSwitch::MouseMoved (int mouseX, int mouseY)
09271 {
09272   ECursorResult rc = CURSOR_NOT_CHANGED;
09273 
09274   switch (orie) {
09275   case 0:
09276     // Default, vertical orientation
09277     if (mouseY < (h/2)) {
09278       // Upper half of gauge increments the state
09279       if (csru_tag != 0) {
09280         globals->cursormgr->SetCursor (csru_tag);
09281         rc = CURSOR_WAS_CHANGED;
09282       }
09283     } else {
09284       // Bottom half of the gauge decrements the state
09285       if (csrd_tag != 0) {
09286         globals->cursormgr->SetCursor (csrd_tag);
09287         rc = CURSOR_WAS_CHANGED;
09288       }
09289     }
09290     break;
09291 
09292   case 1:
09293     // Horizontal orientation
09294     if (mouseX < (w/2)) {
09295       // Left half of the gauge decrements the state
09296       if (csrd_tag != 0) {
09297         globals->cursormgr->SetCursor (csrd_tag);
09298         rc = CURSOR_WAS_CHANGED;
09299       }
09300     } else {
09301       // Right half of the gauge increments the state
09302       if (csru_tag != 0) {
09303         globals->cursormgr->SetCursor (csru_tag);
09304         rc = CURSOR_WAS_CHANGED;
09305       }
09306     }
09307   }
09308 
09309   // Call parent method if necessary
09310   if (rc == CURSOR_NOT_CHANGED) {
09311     rc = CGauge::MouseMoved (mouseX, mouseY);
09312   }
09313 
09314   return rc;
09315 }
09316 
09317 EClickResult CSimpleSwitch::MouseClick (int mouseX, int mouseY, int buttons)
09318 {
09319   EClickResult rc = MOUSE_TRACKING_OFF;
09320 
09321   switch (orie) {
09322   case 0:
09323     // Default, vertical orientation
09324     if (mouseY < (h/2)) {
09325       // Top half of the gauge increments the state
09326       IncState ();
09327     } else {
09328       // Bottom half of the gauge decrements the state
09329       DecState ();
09330     }
09331     break;
09332 
09333   case 1:
09334     // Horizontal orientation
09335     if (mouseX < (w/2)) {
09336       // Left half of the gauge decrements the state
09337       DecState ();
09338     } else {
09339       // Right half of the gauge increments the state
09340       IncState ();
09341     }
09342   }
09343   return rc;
09344 }
09345 
09346 
09347 
09348 //
09349 // CSimpleInOutStateSwitch
09350 //
09351 
09352 CSimpleInOutStateSwitch::CSimpleInOutStateSwitch (void)
09353 {
09354   type = GAUGE_SIMPLE_IN_OUT;
09355   strcpy (sbmp_art, "");
09356   sbmp = NULL;
09357   onvl = 1;
09358   ofvl = 0;
09359   stat = false;
09360   strcpy (onht, "");
09361   strcpy (ofht, "");
09362   strcpy (onsf_wav, "");
09363   strcpy (ofsf_wav, "");
09364   onsf_tag = ofsf_tag = 0;
09365   strcpy (sstr_off, "");
09366   strcpy (sstr_on, "");
09367   mmnt = false;
09368 }
09369 
09370 CSimpleInOutStateSwitch::~CSimpleInOutStateSwitch (void)
09371 {
09372   if (sbmp != NULL) {
09373     FreeBitmap (sbmp);
09374     delete sbmp;
09375   }
09376 }
09377 
09378 int CSimpleInOutStateSwitch::Read (SStream *stream, Tag tag)
09379 {
09380   int rc = TAG_IGNORED;
09381 
09382   switch (tag) {
09383   case 'sbmp':
09384     ReadString (sbmp_art, 64, stream);
09385     rc = TAG_READ;
09386     break;
09387 
09388   case 'onvl':
09389   case 'in__':
09390     ReadInt (&onvl, stream);
09391     rc = TAG_READ;
09392     break;
09393 
09394   case 'ofvl':
09395   case 'out_':
09396     ReadInt (&ofvl, stream);
09397     rc = TAG_READ;
09398     break;
09399 
09400   case 'stat':
09401   case 'st8t':
09402     ReadInt ((int*)&stat, stream);
09403     rc = TAG_READ;
09404     break;
09405 
09406   case 'onht':
09407     ReadString (onht, 64, stream);
09408     rc = TAG_READ;
09409     break;
09410 
09411   case 'ofht':
09412     ReadString (ofht, 64, stream);
09413     rc = TAG_READ;
09414     break;
09415 
09416   case 'onsf': // Might also be onfx
09417   case 'sfxu':
09418     ReadString (onsf_wav, 64, stream);
09419     rc = TAG_READ;
09420     break;
09421 
09422   case 'ofsf':  // Might also be offx
09423   case 'sfxd':
09424     ReadString (ofsf_wav, 64, stream);
09425     rc = TAG_READ;
09426     break;
09427 
09428   case 'sstr':
09429     ReadString (sstr_off, 64, stream);
09430     ReadString (sstr_on, 64, stream);
09431     rc = TAG_READ;
09432     break;
09433 
09434   case 'mmnt':
09435     mmnt = true;
09436     rc = TAG_READ;
09437     break;
09438   }
09439 
09440   if (rc == TAG_IGNORED) {
09441     rc = CBitmapGauge::Read (stream, tag);
09442   }
09443 
09444   if (rc == TAG_IGNORED) {
09445     char s[64];
09446     TagToString (s, tag);
09447     globals->logWarning->Write ("CSimpleInOutSwitchGauge::Read : Unknown tag %s", s);
09448   }
09449 
09450   return rc;
09451 }
09452 
09453 
09454 void CSimpleInOutStateSwitch::ReadFinished (void)
09455 {
09456   CGauge::ReadFinished ();
09457 
09458   // Load bitmap artwork
09459   if (strlen (sbmp_art) > 0) {
09460     sbmp = new SBitmap;
09461     strcpy (sbmp->bitmapName, "ART\\");
09462     strcat (sbmp->bitmapName, sbmp_art);
09463     LoadBitmap (sbmp);
09464   }
09465 
09466   // Load sound effects
09467   if (strlen (onsf_wav) > 0) {
09468     char sfxFullname[64];
09469     strcpy (sfxFullname, "SOUND\\");
09470     strcat (sfxFullname, onsf_wav);
09471     onsf_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
09472   }
09473   if (strlen (ofsf_wav) > 0) {
09474     char sfxFullname[64];
09475     strcpy (sfxFullname, "SOUND\\");
09476     strcat (sfxFullname, ofsf_wav);
09477     ofsf_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
09478   }
09479 }
09480 
09481 void CSimpleInOutStateSwitch::Draw (void)
09482 {
09483   // Get subsystem state
09484   mesg.id = MSG_GETDATA;
09485   mesg.user.u.datatag = 'st8t';
09486   if (SendMessage (&mesg) == MSG_PROCESSED) {
09487     if (mesg.intData == onvl) {
09488       // Switch is in ON state
09489       stat = true;
09490     } else if (mesg.intData == ofvl) {
09491       // Dependent subsystem is in OFF state
09492       stat = false;
09493     }
09494   }
09495 
09496   // Draw appropriate bitmap frame
09497   if (sbmp != NULL) {
09498     DrawBitmap (surf, sbmp, 0, 0, stat ? 1 : 0);
09499   }
09500 }
09501 
09502 
09503 EClickResult CSimpleInOutStateSwitch::MouseClick (int mouseX, int mouseY, int buttons)
09504 {
09505   EClickResult rc = MOUSE_TRACKING_OFF;
09506 
09507   // Any mouse click toggles the gauge state in/out
09508   stat = !stat;
09509 
09510   // Play sound effect
09511   if (stat && (onsf_tag != 0)) {
09512     globals->audiomgr->PlaySfx (sfx_source, onsf_tag);
09513   } else if (!stat && (ofsf_tag != 0)) {
09514     globals->audiomgr->PlaySfx (sfx_source, ofsf_tag);
09515   }
09516 
09517   // Send update message to dependent subsystem
09518   mesg.id = MSG_SETDATA;
09519   mesg.intData = stat ? onvl : ofvl;
09520   mesg.user.u.datatag = 'st8t';
09521   mesg.user.u.hw = HW_SWITCH;
09522   SendMessage (&mesg);
09523 
09524   return rc;
09525 }
09526 
09527 
09528 //
09529 // CBasicBatterySwitch
09530 //
09531 
09532 CBasicBatterySwitch::CBasicBatterySwitch (void)
09533 {
09534   altt = batt = 0;
09535   stateAlt = stateBatt = false;
09536 
09537   // Initialize messages
09538   memset (&mesgBatt, 0, sizeof(SMessage));
09539   mesgBatt.user.u.hw = HW_SWITCH;
09540 
09541   memset (&mesgAlt, 0, sizeof(SMessage));
09542   mesgAlt.user.u.hw = HW_SWITCH;
09543 }
09544 
09545 
09546 int CBasicBatterySwitch::Read (SStream *stream, Tag tag)
09547 {
09548   int rc = TAG_IGNORED;
09549 
09550   switch (tag) {
09551   case 'altt':
09552     {
09553       Tag t;
09554       ReadTag (&t, stream);
09555       mesgAlt.group = (unsigned long) t;
09556     }
09557     rc = TAG_READ;
09558     break;
09559 
09560   case 'batt':
09561     {
09562       Tag t;
09563       ReadTag (&t, stream);
09564       mesgBatt.group = (unsigned long) t;
09565     }
09566     rc = TAG_READ;
09567     break;
09568   }
09569 
09570   if (rc == TAG_IGNORED) {
09571     rc = CSimpleSwitch::Read (stream, tag);
09572   }
09573 
09574   if (rc == TAG_IGNORED) {
09575     char s[64];
09576     TagToString (s, tag);
09577     globals->logWarning->Write ("CBasicBatterySwitchGauge::Read : Unknown tag %s", s);
09578   }
09579 
09580   return rc;
09581 }
09582 
09583 
09584 void CBasicBatterySwitch::Draw (void)
09585 {
09586   // Get battery and alternator states
09587   mesgBatt.id = MSG_GETDATA;
09588   if (SendMessage (&mesgBatt) == MSG_PROCESSED) {
09589     stateBatt = (mesgBatt.intData != 0);
09590   }
09591 
09592   mesgAlt.id = MSG_GETDATA;
09593   if (SendMessage (&mesgAlt) == MSG_PROCESSED) {
09594     stateAlt = (mesgAlt.intData != 0);
09595   }
09596 
09597   // Calculate frame number:
09598   //   0 = Both OFF
09599   //   1 = Alternator ON, Battery OFF
09600   //   2 = Alternator OFF, Battery ON
09601   //   3 = Both ON
09602   int frame = 0;
09603   if (stateAlt) frame += 1;
09604   if (stateBatt) frame += 2;
09605 
09606   // Draw appropriate bitmap frame
09607   if (bmap != NULL) {
09608     DrawBitmap (surf, bmap, 0, 0, frame);
09609   }
09610 
09611 }
09612 
09613 
09614 EClickResult CBasicBatterySwitch::MouseClick (int mouseX, int mouseY, int buttons)
09615 {
09616   EClickResult rc = MOUSE_TRACKING_OFF;
09617 
09618   if (mouseX < (w/2)) {
09619     // Left half of the switch controls the alternator
09620     bool changed = false;
09621     if (mouseY < (h/2)) {
09622       // Top half turns the switch ON
09623       if (!stateAlt) {
09624         stateAlt = true;
09625         changed = true;
09626 
09627         // Special case : Turning the alternator OFF to ON causes battery
09628         //   switch to be turned ON
09629         stateBatt = true;
09630       }
09631     } else {
09632       // Bottom half turns the switch OFF
09633       if (stateAlt) {
09634         stateAlt = false;
09635         changed = true;
09636       }
09637     }
09638 
09639     // Play sound effect if alternator state has changed
09640     if (changed) {
09641       if (stateAlt && (sfxu_tag != 0)) {
09642         globals->audiomgr->PlaySfx (sfx_source, sfxu_tag);
09643       } else if (!stateAlt && (sfxd_tag != 0)) {
09644         globals->audiomgr->PlaySfx (sfx_source, sfxd_tag);
09645       }
09646     }
09647 
09648   } else {
09649     // Right half of the switch controls the battery
09650     bool changed = false;
09651     if (mouseY < (h/2)) {
09652       // Top half turns the switch ON
09653       if (!stateBatt) {
09654         stateBatt = true;
09655         changed = true;
09656       }
09657     } else {
09658       // Bottom half turns the switch OFF
09659       if (stateBatt) {
09660         stateBatt = false;
09661         changed = true;
09662       }
09663     }
09664 
09665     // Play sound effect if alternator state has changed
09666     if (changed) {
09667       if (stateBatt && (sfxu_tag != 0)) {
09668         globals->audiomgr->PlaySfx (sfx_source, sfxu_tag);
09669       } else if (!stateBatt && (sfxd_tag != 0)) {
09670         globals->audiomgr->PlaySfx (sfx_source, sfxd_tag);
09671       }
09672     }
09673   }
09674 
09675   // Update battery and alternator subsystems
09676   mesgBatt.id = MSG_SETDATA;
09677   mesgBatt.dataType = TYPE_INT;
09678   mesgBatt.intData = stateBatt ? 1 : 0;
09679   mesgBatt.user.u.datatag = 'stat';
09680   SendMessage (&mesgBatt);
09681 
09682   mesgAlt.id = MSG_SETDATA;
09683   mesgAlt.dataType = TYPE_INT;
09684   mesgAlt.intData = stateAlt ? 1 : 0;
09685   mesgAlt.user.u.datatag = 'stat';
09686   SendMessage (&mesgAlt);
09687 
09688   return rc;
09689 }
09690 
09691 
09692 //
09693 // CBasicMagnetoSwitch
09694 //
09695 // This gauge type implements a basic turn-switch for magnetos.  The switch
09696 //   has five positions:
09697 //   0 = None
09698 //   1 = Right
09699 //   2 = Left
09700 //   3 = Both
09701 //   4 = Start (momentary contact)
09702 //
09703 // Clicking the right mouse button increments the gauge state, and clicking the
09704 //   left button decrements the state.
09705 //
09706 // This gauge is intended to be connected to a rotary ignition subsystem ('rign')
09707 //
09708 CBasicMagnetoSwitch::CBasicMagnetoSwitch (void)
09709 {
09710 }
09711 
09712 
09713 typedef enum {
09714   MAGNETO_SWITCH_OFF = 0,
09715   MAGNETO_SWITCH_RIGHT = 1,
09716   MAGNETO_SWITCH_LEFT = 2,
09717   MAGNETO_SWITCH_BOTH = 3,
09718   MAGNETO_SWITCH_START = 4
09719 } EMagnetoSwitch;
09720 
09721 void CBasicMagnetoSwitch::Draw (void)
09722 {
09723   // Get magneto subsystem state
09724   mesg.id = MSG_GETDATA;
09725   if (SendMessage (&mesg) == MSG_PROCESSED) {
09726     indx = mesg.intData;
09727   }
09728 
09729   // Draw appropriate bitmap frame
09730   if (bmap != NULL) {
09731     DrawBitmap (surf, bmap, 0, 0, indx);
09732   }
09733 }
09734 
09735 
09736 EClickResult CBasicMagnetoSwitch::MouseClick (int mouseX, int mouseY, int buttons)
09737 {
09738   EClickResult rc = MOUSE_TRACKING_OFF;
09739 
09740   if (buttons == MOUSE_BUTTON_LEFT) {
09741     // Decrement state unless we are already in the OFF state
09742     if (indx > MAGNETO_SWITCH_OFF) {
09743       indx--;
09744 
09745       // Play sound effect
09746       if (sfxd_tag != 0) {
09747         globals->audiomgr->PlaySfx (sfx_source, sfxd_tag);
09748       }
09749     }
09750   } else if (buttons == MOUSE_BUTTON_RIGHT) {
09751     // Increment state unless we are already in the START state
09752     if (indx < MAGNETO_SWITCH_START) {
09753       indx++;
09754 
09755       // Play sound effect
09756       if (sfxu_tag != 0) {
09757         globals->audiomgr->PlaySfx (sfx_source, sfxu_tag);
09758       }
09759 
09760       // If we are now in START state, set return code so that we are notified
09761       //  of the click release
09762       if (indx == MAGNETO_SWITCH_START) {
09763         rc = MOUSE_TRACKING_ON;
09764       }
09765     }
09766   }
09767 
09768   // Update magneto subsystem
09769   mesg.id = MSG_SETDATA;
09770   mesg.dataType = TYPE_INT;
09771   mesg.intData = indx;
09772   SendMessage (&mesg);
09773 
09774   return rc;
09775 }
09776 
09777 EClickResult CBasicMagnetoSwitch::StopClick (int mouseX, int mouseY, int buttons)
09778 {
09779   // The only time this method should be called is when the switch is in the
09780   //   START state and the right mouse button is released.  Switch back
09781   //   to BOTH state
09782   indx = MAGNETO_SWITCH_BOTH;
09783 
09784   // Play sound effect
09785   if (sfxd_tag != 0) {
09786     globals->audiomgr->PlaySfx (sfx_source, sfxd_tag);
09787   }
09788 
09789   // Update magneto subsystem
09790   mesg.id = MSG_SETDATA;
09791   mesg.dataType = TYPE_INT;
09792   mesg.intData = indx;
09793   SendMessage (&mesg);
09794 
09795   return MOUSE_TRACKING_OFF;
09796 }
09797 
09798 
09799 //
09800 // CTwoStateELTGauge
09801 //
09802 
09803 CTwoStateELTGauge::CTwoStateELTGauge (void)
09804 {
09805 }
09806 
09807 int CTwoStateELTGauge::Read (SStream *stream, Tag tag)
09808 {
09809   int rc = TAG_IGNORED;
09810 
09811   if (rc == TAG_IGNORED) {
09812     rc = CSimpleSwitch::Read (stream, tag);
09813   }
09814 
09815   if (rc == TAG_IGNORED) {
09816     char s[64];
09817     TagToString (s, tag);
09818     globals->logWarning->Write ("CTwoStateELTGauge::Read : Unknown tag %s", s);
09819   }
09820 
09821   return rc;
09822 }
09823 
09824 
09825 //
09826 // CSwitchPairGauge
09827 //
09828 
09829 CSwitchPairGauge::CSwitchPairGauge (void)
09830 {
09831   memset (&s1ms, 0, sizeof(SMessage));
09832   memset (&s2ms, 0, sizeof(SMessage));
09833 }
09834 
09835 int CSwitchPairGauge::Read (SStream *stream, Tag tag)
09836 {
09837   int rc = TAG_IGNORED;
09838 
09839   switch (tag) {
09840   case 's1ms':
09841     ReadMessage (&s1ms, stream);
09842     rc = TAG_READ;
09843     break;
09844 
09845   case 's2ms':
09846     ReadMessage (&s2ms, stream);
09847     rc = TAG_READ;
09848     break;
09849 
09850   case 's1of':
09851     ReadFrom (&s1of, stream);
09852     rc = TAG_READ;
09853     break;
09854 
09855   case 's1on':
09856     ReadFrom (&s1on, stream);
09857     rc = TAG_READ;
09858     break;
09859 
09860   case 's2on':
09861     ReadFrom (&s2on, stream);
09862     rc = TAG_READ;
09863     break;
09864 
09865   case 's2of':
09866     ReadFrom (&s2of, stream);
09867     rc = TAG_READ;
09868     break;
09869   }
09870 
09871   if (rc == TAG_IGNORED) {
09872     rc = CSimpleSwitch::Read (stream, tag);
09873   }
09874 
09875   if (rc == TAG_IGNORED) {
09876     char s[64];
09877     TagToString (s, tag);
09878     globals->logWarning->Write ("CSwitchPairGauge::Read : Unknown tag %s", s);
09879   }
09880 
09881   return rc;
09882 }
09883 
09884 ECursorResult CSwitchPairGauge::MouseMoved (int x, int y)
09885 {
09886   ECursorResult rc = CURSOR_NOT_CHANGED;
09887 
09888   // Send updated mouse position to all click areas
09889   if (rc == CURSOR_NOT_CHANGED) rc = s1of.MouseMoved (x, y);
09890   if (rc == CURSOR_NOT_CHANGED) rc = s1on.MouseMoved (x, y);
09891   if (rc == CURSOR_NOT_CHANGED) rc = s2of.MouseMoved (x, y);
09892   if (rc == CURSOR_NOT_CHANGED) rc = s2on.MouseMoved (x, y);
09893 
09894   // Call parent method if cursor not changed
09895   if (rc == CURSOR_NOT_CHANGED) {
09896     rc = CSimpleSwitch::MouseMoved (x, y);
09897   }
09898 
09899   return rc;
09900 }
09901 
09902 
09903 //
09904 // CSimpleFloatSwitch
09905 //
09906 
09907 CSimpleFloatSwitch::CSimpleFloatSwitch (void)
09908 {
09909   strcpy (bmap_art, "");
09910   strcpy (csru_csr, "");
09911   strcpy (csrd_csr, "");
09912   csru_tag = csrd_tag = 0;
09913   strcpy (sfxu_wav, "");
09914   strcpy (sfxd_wav, "");
09915   sfxu_tag = sfxd_tag = 0;
09916   stat_n = 0;
09917   stat = NULL;
09918   sstr_n = 0;
09919   sstr = NULL;
09920   mmnt = false;
09921 }
09922 
09923 CSimpleFloatSwitch::~CSimpleFloatSwitch (void)
09924 {
09925   if (stat != NULL) delete[] stat;
09926   if (sstr != NULL) {
09927     for (int i=0; i<sstr_n; i++) {
09928       delete[] sstr[i];
09929     }
09930     delete[] sstr;
09931   }
09932 }
09933 
09934 int CSimpleFloatSwitch::Read (SStream *stream, Tag tag)
09935 {
09936   int rc = TAG_IGNORED;
09937 
09938   switch (tag) {
09939   case 'bmap':
09940     ReadString (bmap_art, 64, stream);
09941     rc = TAG_READ;
09942     break;
09943 
09944   case 'csru':
09945     ReadString (csru_csr, 64, stream);
09946     rc = TAG_READ;
09947     break;
09948 
09949   case 'csrd':
09950     ReadString (csrd_csr, 64, stream);
09951     rc = TAG_READ;
09952     break;
09953 
09954   case 'sfxu':
09955     ReadString (sfxu_wav, 64, stream);
09956     rc = TAG_READ;
09957     break;
09958 
09959   case 'sfxd':
09960     ReadString (sfxd_wav, 64, stream);
09961     rc = TAG_READ;
09962     break;
09963 
09964   case 'stat':
09965     {
09966       ReadInt (&stat_n, stream);
09967       if (stat_n > 16) {
09968         gtfo ("CSimpleFloatSwitch : <stat> maximum 16 states exceeded");
09969       }
09970       stat = new float[stat_n];
09971       for (int i=0; i<stat_n; i++) {
09972         ReadFloat (&stat[i], stream);
09973       }
09974     }
09975     rc = TAG_READ;
09976     break;
09977 
09978   case 'sstr':
09979     {
09980       ReadInt (&sstr_n, stream);
09981       if (sstr_n > 16) {
09982         gtfo ("CSimpleFloatSwitchGauge : <sstr> maximum 16 states exceeded");
09983       }
09984       sstr = new char*[sstr_n];
09985       for (int i=0; i<sstr_n; i++) {
09986         sstr[i] = new char[64];
09987         ReadString (sstr[i], 64, stream);
09988       }
09989     }
09990     rc = TAG_READ;
09991     break;
09992 
09993   case 'mmnt':
09994     {
09995       int i;
09996       ReadInt (&i, stream);
09997       mmnt = (i != 0);
09998     }
09999     rc = TAG_READ;
10000     break;
10001   }
10002 
10003   if (rc == TAG_IGNORED) {
10004     rc = CGauge::Read (stream, tag);
10005   }
10006 
10007   if (rc == TAG_IGNORED) {
10008     char s[64];
10009     TagToString (s, tag);
10010     globals->logWarning->Write ("CSimpleFloatSwitch::Read : Unknown tag %s", s);
10011   }
10012 
10013   return rc;
10014 }
10015 
10016 void CSimpleFloatSwitch::ReadFinished (void)
10017 {
10018   CGauge::ReadFinished ();
10019 
10020   // Bind cursors
10021   if (strlen (csru_csr) > 0) {
10022     csru_tag = globals->cursormgr->BindCursor (csru_csr);
10023   }
10024   if (strlen (csrd_csr) > 0) {
10025     csrd_tag = globals->cursormgr->BindCursor (csrd_csr);
10026   }
10027 
10028   // Load sound effects
10029   if (strlen (sfxu_wav) > 0) {
10030     char sfxFullname[64];
10031     strcpy (sfxFullname, "SOUND\\");
10032     strcat (sfxFullname, sfxu_wav);
10033     sfxu_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
10034   }
10035 }
10036 
10037 
10038 
10039 //
10040 // CDualSwitch
10041 //
10042 
10043 CDualSwitch::CDualSwitch (void)
10044 {
10045   nums = 0;
10046   orie = 0;
10047   memset (&usrl, 0, sizeof(SMessage));
10048   memset (&usrr, 0, sizeof(SMessage));
10049   mmnt = false;
10050 }
10051 
10052 int CDualSwitch::Read (SStream *stream, Tag tag)
10053 {
10054   int rc = TAG_IGNORED;
10055 
10056   switch (tag) {
10057   case 'nums':
10058     ReadInt (&nums, stream);
10059     rc = TAG_READ;
10060     break;
10061 
10062   case 'orie':
10063     ReadInt (&orie, stream);
10064     rc = TAG_READ;
10065     break;
10066 
10067   case 'usrl':
10068     ReadMessage (&usrl, stream);
10069     rc = TAG_READ;
10070     break;
10071 
10072   case 'usrr':
10073     ReadMessage (&usrr, stream);
10074     rc = TAG_READ;
10075     break;
10076 
10077   case 'mmnt':
10078     {
10079       int i;
10080       ReadInt (&i, stream);
10081       mmnt = (i != 0);
10082     }
10083     rc = TAG_READ;
10084     break;
10085   }
10086 
10087   if (rc == TAG_IGNORED) {
10088     rc = CSimpleSwitch::Read (stream, tag);
10089   }
10090 
10091   if (rc == TAG_IGNORED) {
10092     char s[64];
10093     TagToString (s, tag);
10094     globals->logWarning->Write ("CDualSwitchGauge::Read : Unknown tag %s", s);
10095   }
10096 
10097   return rc;
10098 }
10099 
10100 
10101 //
10102 // CPushPullKnobGauge
10103 //
10104 
10105 CPushPullKnobGauge::CPushPullKnobGauge (void)
10106 {
10107   strcpy (bmap_art, "");
10108   memset (&mesg, 0, sizeof(SMessage));
10109   memset (&lnk1, 0, sizeof(SMessage));
10110   ytop = ybtm = 0;
10111   valu_n = 0;
10112   valu = NULL;
10113   lowv = high = 0;
10114   poll = false;
10115 }
10116 
10117 CPushPullKnobGauge::~CPushPullKnobGauge (void)
10118 {
10119   if (valu != NULL) {
10120     delete[] valu;
10121   }
10122 }
10123 
10124 int CPushPullKnobGauge::Read (SStream *stream, Tag tag)
10125 {
10126   int rc = TAG_IGNORED;
10127 
10128   switch (tag) {
10129   case 'bmap':
10130     ReadString (bmap_art, 64, stream);
10131     rc = TAG_READ;
10132     break;
10133 
10134   case 'mesg':
10135     ReadMessage (&mesg, stream);
10136     rc = TAG_READ;
10137     break;
10138 
10139   case 'lnk1':
10140     ReadMessage (&lnk1, stream);
10141     rc = TAG_READ;
10142     break;
10143 
10144   case 'ytop':
10145     ReadInt (&ytop, stream);
10146     rc = TAG_READ;
10147     break;
10148 
10149   case 'ybtm':
10150     ReadInt (&ybtm, stream);
10151     rc = TAG_READ;
10152     break;
10153 
10154   case 'valu':
10155     {
10156       ReadInt (&valu_n, stream);
10157       if (valu_n > 32) {
10158         gtfo ("CPushPullKnobGauge : <valu> maximum 32 values exceeded");
10159       }
10160       valu = new SKnobArea[valu_n];
10161       for (int i=0; i<valu_n; i++) {
10162         ReadInt (&valu[i].ytop, stream);
10163         ReadInt (&valu[i].ybtm, stream);
10164         ReadFloat (&valu[i].valu, stream);
10165         ReadString (valu[i].help, 64, stream);
10166       }
10167     }
10168     rc = TAG_READ;
10169     break;
10170 
10171   case 'lowv':
10172     ReadFloat (&lowv, stream);
10173     rc = TAG_READ;
10174     break;
10175 
10176   case 'high':
10177     ReadFloat (&high, stream);
10178     rc = TAG_READ;
10179     break;
10180 
10181   case 'poll':
10182     {
10183       int i;
10184       ReadInt (&i, stream);
10185       poll = (i != 0);
10186     }
10187     rc = TAG_READ;
10188     break;
10189   }
10190 
10191   if (rc == TAG_IGNORED) {
10192     rc = CGauge::Read (stream, tag);
10193   }
10194 
10195   if (rc == TAG_IGNORED) {
10196     char s[64];
10197     TagToString (s, tag);
10198     globals->logWarning->Write ("CPushPullKnobGauge::Read : Unknown tag %s", s);
10199   }
10200 
10201   return rc;
10202 }
10203 
10204 
10205 //
10206 // CPrimerKnobGauge
10207 //
10208 
10209 CPrimerKnobGauge::CPrimerKnobGauge (void)
10210 {
10211 }
10212 
10213 int CPrimerKnobGauge::Read (SStream *stream, Tag tag)
10214 {
10215   int rc = TAG_IGNORED;
10216 
10217   if (rc == TAG_IGNORED) {
10218     rc = CPushPullKnobGauge::Read (stream, tag);
10219   }
10220 
10221   if (rc == TAG_IGNORED) {
10222     char s[64];
10223     TagToString (s, tag);
10224     globals->logWarning->Write ("CPrimerKnobGauge::Read : Unknown tag %s", s);
10225   }
10226 
10227   return rc;
10228 
10229 }
10230 
10231 //
10232 // CFlapsSwitchGauge
10233 //
10234 
10235 CFlapsSwitchGauge::CFlapsSwitchGauge (void)
10236 {
10237 }
10238 
10239 int CFlapsSwitchGauge::Read (SStream *stream, Tag tag)
10240 {
10241   int rc = TAG_IGNORED;
10242 
10243   if (rc == TAG_IGNORED) {
10244     rc = CPushPullKnobGauge::Read (stream, tag);
10245   }
10246 
10247   if (rc == TAG_IGNORED) {
10248     char s[64];
10249     TagToString (s, tag);
10250     globals->logWarning->Write ("CFlapsSwitchGauge::Read : Unknown tag %s", s);
10251   }
10252 
10253   return rc;
10254 }
10255 
10256 
10257 //
10258 // CLitLandingGearKnobGauge
10259 //
10260 
10261 CLitLandingGearKnobGauge::CLitLandingGearKnobGauge (void)
10262 {
10263 }
10264 
10265 int CLitLandingGearKnobGauge::Read (SStream *stream, Tag tag)
10266 {
10267   int rc = TAG_IGNORED;
10268 
10269   if (rc == TAG_IGNORED) {
10270     rc = CPushPullKnobGauge::Read (stream, tag);
10271   }
10272 
10273   if (rc == TAG_IGNORED) {
10274     char s[64];
10275     TagToString (s, tag);
10276     globals->logWarning->Write ("CLitLandingGearKnobGauge::Read : Unknown tag %s", s);
10277   }
10278 
10279   return rc;
10280 }
10281 
10282 
10283 //
10284 // CMixtureKnobGauge
10285 //
10286 
10287 CMixtureKnobGauge::CMixtureKnobGauge (void)
10288 {
10289 }
10290 
10291 int CMixtureKnobGauge::Read (SStream *stream, Tag tag)
10292 {
10293   int rc = TAG_IGNORED;
10294 
10295   if (rc == TAG_IGNORED) {
10296     rc = CPushPullKnobGauge::Read (stream, tag);
10297   }
10298 
10299   if (rc == TAG_IGNORED) {
10300     char s[64];
10301     TagToString (s, tag);
10302     globals->logWarning->Write ("CMixtureKnobGauge::Read : Unknown tag %s", s);
10303   }
10304 
10305   return rc;
10306 }
10307 
10308 
10309 //
10310 // CReversibleThrottleKnobGauge
10311 //
10312 
10313 CReversibleThrottleKnobGauge::CReversibleThrottleKnobGauge (void)
10314 {
10315   memset (&rvsr, 0, sizeof(SMessage));
10316   strcpy (rbmp_art, "");
10317   rtop = rbtm = 0;
10318 }
10319 
10320 int CReversibleThrottleKnobGauge::Read (SStream *stream, Tag tag)
10321 {
10322   int rc = TAG_IGNORED;
10323 
10324   switch (tag) {
10325   case 'rvsr':
10326     ReadMessage (&rvsr, stream);
10327     rc = TAG_READ;
10328     break;
10329 
10330   case 'rbmp':
10331     ReadString (rbmp_art, 64, stream);
10332     rc = TAG_READ;
10333     break;
10334 
10335   case 'rtop':
10336     ReadInt (&rtop, stream);
10337     rc = TAG_READ;
10338     break;
10339 
10340   case 'rbtm':
10341     ReadInt (&rbtm, stream);
10342     rc = TAG_READ;
10343     break;
10344   }
10345 
10346   if (rc == TAG_IGNORED) {
10347     rc = CPushPullKnobGauge::Read (stream, tag);
10348   }
10349 
10350   if (rc == TAG_IGNORED) {
10351     char s[64];
10352     TagToString (s, tag);
10353     globals->logWarning->Write ("CReversibleThrottleKnobGauge::Read : Unknown tag %s", s);
10354   }
10355 
10356   return rc;
10357 }
10358 
10359 
10360 //
10361 // CDualKnobGauge
10362 //
10363 
10364 CDualKnobGauge::CDualKnobGauge (void)
10365 {
10366   memset (&imsg, 0, sizeof(SMessage));
10367   memset (&omsg, 0, sizeof(SMessage));
10368   iinc = idec = oinc = odec = 0;
10369 }
10370 
10371 int CDualKnobGauge::Read (SStream *stream, Tag tag)
10372 {
10373   int rc = TAG_IGNORED;
10374 
10375   switch (tag) {
10376   case 'imsg':
10377     ReadMessage (&imsg, stream);
10378     rc = TAG_READ;
10379     break;
10380 
10381   case 'usri':
10382     {
10383       // DEPRECATED
10384       char s[64];
10385       ReadString (s, 64, stream);
10386       
10387       // Convert USER string to SMessage field value
10388     }
10389     rc = TAG_READ;
10390     break;
10391 
10392   case 'igrp':
10393     {
10394       // DEPRECATED
10395       Tag tag;
10396       ReadTag (&tag, stream);
10397       imsg.group = tag;
10398     }
10399     rc = TAG_READ;
10400     break;
10401 
10402   case 'omsg':
10403     ReadMessage (&omsg, stream);
10404     rc = TAG_READ;
10405     break;
10406 
10407   case 'usro':
10408     {
10409       // DEPRECATED
10410       char s[64];
10411       ReadString (s, 64, stream);
10412       
10413       // Convert USER string to SMessage field value
10414     }
10415     rc = TAG_READ;
10416     break;
10417 
10418   case 'ogrp':
10419     {
10420       // DEPRECATED
10421       Tag tag;
10422       ReadTag (&tag, stream);
10423       omsg.group = tag;
10424     }
10425     rc = TAG_READ;
10426     break;
10427 
10428   case 'iinc':
10429     ReadFloat (&iinc, stream);
10430     rc = TAG_READ;
10431     break;
10432 
10433   case 'idec':
10434     ReadFloat (&idec, stream);
10435     rc = TAG_READ;
10436     break;
10437 
10438   case 'oinc':
10439     ReadFloat (&oinc, stream);
10440     rc = TAG_READ;
10441     break;
10442 
10443   case 'odec':
10444     ReadFloat (&odec, stream);
10445     rc = TAG_READ;
10446     break;
10447 
10448   case 'inca':
10449     ReadFrom (&inca, stream);
10450     rc = TAG_READ;
10451     break;
10452 
10453   case 'ouca':
10454     ReadFrom (&ouca, stream);
10455     rc = TAG_READ;
10456     break;
10457   }
10458 
10459   if (rc == TAG_IGNORED) {
10460     rc = CGauge::Read (stream, tag);
10461   }
10462 
10463   if (rc == TAG_IGNORED) {
10464     char s[64];
10465     TagToString (s, tag);
10466     globals->logWarning->Write ("CDualKnobGauge::Read : Unknown tag %s", s);
10467   }
10468 
10469   return rc;
10470 }
10471 
10472 ECursorResult CDualKnobGauge::MouseMoved (int x, int y)
10473 {
10474   ECursorResult rc = CURSOR_NOT_CHANGED;
10475 
10476   // Send updated mouse position to all click areas
10477   if (rc == CURSOR_NOT_CHANGED) rc = inca.MouseMoved (x, y);
10478   if (rc == CURSOR_NOT_CHANGED) rc = ouca.MouseMoved (x, y);
10479 
10480   // Call parent method if cursor not changed
10481   if (rc == CURSOR_NOT_CHANGED) {
10482     rc = CGauge::MouseMoved (x, y);
10483   }
10484 
10485   return rc;
10486 }
10487 
10488 
10489 //
10490 // CFlyhawkLightKnobGauge
10491 //
10492 
10493 CFlyhawkLightKnobGauge::CFlyhawkLightKnobGauge (void)
10494 {
10495 }
10496 
10497 int CFlyhawkLightKnobGauge::Read (SStream *stream, Tag tag)
10498 {
10499   int rc = TAG_IGNORED;
10500 
10501   if (rc == TAG_IGNORED) {
10502     rc = CDualKnobGauge::Read (stream, tag);
10503   }
10504 
10505   if (rc == TAG_IGNORED) {
10506     char s[64];
10507     TagToString (s, tag);
10508     globals->logWarning->Write ("CFlyhawkLightKnobGauge::Read : Unknown tag %s", s);
10509   }
10510 
10511   return rc;
10512 }
10513 
10514 
10515 //
10516 // CTurnKnobGauge
10517 //
10518 
10519 CTurnKnobGauge::CTurnKnobGauge (void)
10520 {
10521   strcpy (bmap_art, "");
10522   incr = decr = 0;
10523 }
10524 
10525 int CTurnKnobGauge::Read (SStream *stream, Tag tag)
10526 {
10527   int rc = TAG_IGNORED;
10528 
10529   switch (tag) {
10530   case 'bmap':
10531     ReadString (bmap_art, 64, stream);
10532     rc = TAG_READ;
10533     break;
10534 
10535   case 'incr':
10536   case 'rght':
10537     ReadFloat (&incr, stream);
10538     rc = TAG_READ;
10539     break;
10540 
10541   case 'decr':
10542   case 'left':
10543     ReadFloat (&decr, stream);
10544     rc = TAG_READ;
10545     break;
10546   }
10547 
10548   if (rc == TAG_IGNORED) {
10549     rc = CGauge::Read (stream, tag);
10550   }
10551 
10552   if (rc == TAG_IGNORED) {
10553     char s[64];
10554     TagToString (s, tag);
10555     globals->logWarning->Write ("CTurnKnobGauge::Read : Unknown tag %s", s);
10556   }
10557 
10558   return rc;
10559 }
10560 
10561 
10562 //
10563 // CCoveredSwitch
10564 //
10565 
10566 CCoveredSwitch::CCoveredSwitch (void)
10567 {
10568 }
10569 
10570 int CCoveredSwitch::Read (SStream *stream, Tag tag)
10571 {
10572   int rc = TAG_IGNORED;
10573 
10574   if (rc == TAG_IGNORED) {
10575     rc = CSimpleSwitch::Read (stream, tag);
10576   }
10577 
10578   if (rc == TAG_IGNORED) {
10579     char s[64];
10580     TagToString (s, tag);
10581     globals->logWarning->Write ("CCoveredSwitch::Read : Unknown tag %s", s);
10582   }
10583 
10584   return rc;
10585 }
10586 
10587 
10588 //
10589 // CCoveredLightButtonGauge
10590 //
10591 
10592 CCoveredLightButtonGauge::CCoveredLightButtonGauge (void)
10593 {
10594   strcpy (lbmp_art, "");
10595   memset (&lmsg, 0, sizeof(SMessage));
10596 }
10597 
10598 int CCoveredLightButtonGauge::Read (SStream *stream, Tag tag)
10599 {
10600   int rc = TAG_IGNORED;
10601 
10602   switch (tag) {
10603   case 'lbmp':
10604     ReadString (lbmp_art, 64, stream);
10605     rc = TAG_READ;
10606     break;
10607 
10608   case 'lmsg':
10609     ReadMessage (&lmsg, stream);
10610     rc = TAG_READ;
10611     break;
10612   }
10613 
10614   if (rc == TAG_IGNORED) {
10615     rc = CCoveredSwitch::Read (stream, tag);
10616   }
10617 
10618   if (rc == TAG_IGNORED) {
10619     char s[64];
10620     TagToString (s, tag);
10621     globals->logWarning->Write ("CCoveredLightButtonGauge::Read : Unknown tag %s", s);
10622   }
10623 
10624   return rc;
10625 }
10626 
10627 
10628 //
10629 // CVerticalSliderGauge
10630 //
10631 
10632 CVerticalSliderGauge::CVerticalSliderGauge (void)
10633 {
10634 }
10635 
10636 int CVerticalSliderGauge::Read (SStream *stream, Tag tag)
10637 {
10638   int rc = TAG_IGNORED;
10639 
10640   if (rc == TAG_IGNORED) {
10641     rc = CGauge::Read (stream, tag);
10642   }
10643 
10644   if (rc == TAG_IGNORED) {
10645     char s[64];
10646     TagToString (s, tag);
10647     globals->logWarning->Write ("CVerticalSliderGauge::Read : Unknown tag %s", s);
10648   }
10649 
10650   return rc;
10651 }
10652 
10653 
10654 //
10655 // CTrimWheelGauge
10656 //
10657 
10658 CTrimWheelGauge::CTrimWheelGauge (void)
10659 {
10660   strcpy (bmap_art, "");
10661 }
10662 
10663 int CTrimWheelGauge::Read (SStream *stream, Tag tag)
10664 {
10665   int rc = TAG_IGNORED;
10666 
10667   switch (tag) {
10668   case 'bmap':
10669     ReadString (bmap_art, 64, stream);
10670     rc = TAG_READ;
10671     break;
10672 
10673   case 'down':
10674   case 'left':
10675     ReadFrom (&down, stream);
10676     rc = TAG_READ;
10677     break;
10678 
10679   case 'up  ':
10680   case 'rght':
10681     ReadFrom (&up, stream);
10682     rc = TAG_READ;
10683     break;
10684   }
10685 
10686   if (rc == TAG_IGNORED) {
10687     rc = CGauge::Read (stream, tag);
10688   }
10689 
10690   if (rc == TAG_IGNORED) {
10691     char s[64];
10692     TagToString (s, tag);
10693     globals->logWarning->Write ("CTrimWheelGauge::Read : Unknown tag %s", s);
10694   }
10695 
10696   return rc;
10697 }
10698 
10699 ECursorResult CTrimWheelGauge::MouseMoved (int x, int y)
10700 {
10701   ECursorResult rc = CURSOR_NOT_CHANGED;
10702 
10703   // Send updated mouse position to all click areas
10704   if (rc == CURSOR_NOT_CHANGED) rc = down.MouseMoved (x, y);
10705   if (rc == CURSOR_NOT_CHANGED) rc = up.MouseMoved (x, y);
10706 
10707   // Call parent method if cursor not changed
10708   if (rc == CURSOR_NOT_CHANGED) {
10709     rc = CGauge::MouseMoved (x, y);
10710   }
10711 
10712   return rc;
10713 }
10714 
10715 
10716 //
10717 // CTrimWheelIndicatorGauge
10718 //
10719 
10720 CTrimWheelIndicatorGauge::CTrimWheelIndicatorGauge (void)
10721 {
10722 }
10723 
10724 int CTrimWheelIndicatorGauge::Read (SStream *stream, Tag tag)
10725 {
10726   int rc = TAG_IGNORED;
10727 
10728   if (rc == TAG_IGNORED) {
10729     rc = CTrimWheelGauge::Read (stream, tag);
10730   }
10731 
10732   if (rc == TAG_IGNORED) {
10733     char s[64];
10734     TagToString (s, tag);
10735     globals->logWarning->Write ("CTrimWheelIndicatorGauge::Read : Unknown tag %s", s);
10736   }
10737 
10738   return rc;
10739 }
10740 
10741 
10742 //
10743 // CIndicatorGauge
10744 //
10745 
10746 CIndicatorGauge::CIndicatorGauge (void)
10747 {
10748   strcpy (bmap_art, "");
10749   lval = hval = 0;
10750 }
10751 
10752 int CIndicatorGauge::Read (SStream *stream, Tag tag)
10753 {
10754   int rc = TAG_IGNORED;
10755 
10756   switch (tag) {
10757   case 'bmap':
10758     ReadString (bmap_art, 64, stream);
10759     rc = TAG_READ;
10760     break;
10761 
10762   case 'lval':
10763     ReadFloat (&lval, stream);
10764     rc = TAG_READ;
10765     break;
10766 
10767   case 'hval':
10768     ReadFloat (&hval, stream);
10769     rc = TAG_READ;
10770     break;
10771   }
10772 
10773   if (rc == TAG_IGNORED) {
10774     rc = CGauge::Read (stream, tag);
10775   }
10776 
10777   if (rc == TAG_IGNORED) {
10778     char s[64];
10779     TagToString (s, tag);
10780     globals->logWarning->Write ("CIndicatorGauge::Read : Unknown tag %s", s);
10781   }
10782 
10783   return rc;
10784 }
10785 
10786 
10787 //
10788 // CFlapsIndicatorGauge
10789 //
10790 
10791 CFlapsIndicatorGauge::CFlapsIndicatorGauge (void)
10792 {
10793 }
10794 
10795 int CFlapsIndicatorGauge::Read (SStream *stream, Tag tag)
10796 {
10797   int rc = TAG_IGNORED;
10798 
10799   if (rc == TAG_IGNORED) {
10800     rc = CIndicatorGauge::Read (stream, tag);
10801   }
10802 
10803   if (rc == TAG_IGNORED) {
10804     char s[64];
10805     TagToString (s, tag);
10806     globals->logWarning->Write ("CFlapsIndicatorGauge::Read : Unknown tag %s", s);
10807   }
10808 
10809   return rc;
10810 }
10811 
10812 
10813 //
10814 // CPushButtonGauge
10815 //
10816 
10817 CPushButtonGauge::CPushButtonGauge (void)
10818 {
10819   strcpy (bmap_art, "");
10820   strcpy (curs_csr, "");
10821   mmnt = false;
10822 }
10823 
10824 int CPushButtonGauge::Read (SStream *stream, Tag tag)
10825 {
10826   int rc = TAG_IGNORED;
10827 
10828   switch (tag) {
10829   case 'bmap':
10830     ReadString (bmap_art, 64, stream);
10831     rc = TAG_READ;
10832     break;
10833 
10834   case 'curs':
10835     ReadString (curs_csr, 64, stream);
10836     rc = TAG_READ;
10837     break;
10838 
10839   case 'mmnt':
10840     mmnt = true;
10841     rc = TAG_READ;
10842     break;
10843   }
10844 
10845   if (rc == TAG_IGNORED) {
10846     rc = CGauge::Read (stream, tag);
10847   }
10848 
10849   if (rc == TAG_IGNORED) {
10850     char s[64];
10851     TagToString (s, tag);
10852     globals->logWarning->Write ("CPushButtonGauge::Read : Unknown tag %s", s);
10853   }
10854 
10855   return rc;
10856 }
10857 
10858 
10859 //
10860 // CLightButtonGauge
10861 //
10862 
10863 CLightButtonGauge::CLightButtonGauge (void)
10864 {
10865   memset (&lmsg, 0, sizeof(SMessage));
10866   stat_off = stat_on = 0;
10867   strcpy (sstr_off, "");
10868   strcpy (sstr_on, "");
10869 }
10870 
10871 int CLightButtonGauge::Read (SStream *stream, Tag tag)
10872 {
10873   int rc = TAG_IGNORED;
10874 
10875   switch (tag) {
10876   case 'lmsg':
10877     ReadMessage (&lmsg, stream);
10878     rc = TAG_READ;
10879     break;
10880 
10881   case 'stat':
10882     ReadInt (&stat_off, stream);
10883     ReadInt (&stat_on, stream);
10884     rc = TAG_READ;
10885     break;
10886 
10887   case 'sstr':
10888     ReadString (sstr_off, 64, stream);
10889     ReadString (sstr_on, 64, stream);
10890     rc = TAG_READ;
10891     break;
10892   }
10893 
10894   if (rc == TAG_IGNORED) {
10895     rc = CPushButtonGauge::Read (stream, tag);
10896   }
10897 
10898   if (rc == TAG_IGNORED) {
10899     char s[64];
10900     TagToString (s, tag);
10901     globals->logWarning->Write ("CLightButtonGauge::Read : Unknown tag %s", s);
10902   }
10903 
10904   return rc;
10905 }
10906 
10907 
10908 //
10909 // CTurnSwitchGauge
10910 //
10911 
10912 CTurnSwitchGauge::CTurnSwitchGauge (void)
10913 {
10914 }
10915 
10916 int CTurnSwitchGauge::Read (SStream *stream, Tag tag)
10917 {
10918   int rc = TAG_IGNORED;
10919 
10920   if (rc == TAG_IGNORED) {
10921     rc = CSimpleSwitch::Read (stream, tag);
10922   }
10923 
10924   if (rc == TAG_IGNORED) {
10925     char s[64];
10926     TagToString (s, tag);
10927     globals->logWarning->Write ("CTurnSwitchGauge::Read : Unknown tag %s", s);
10928   }
10929 
10930   return rc;
10931 }
10932 
10933 
10934 //
10935 // CMasterCautionWarningButtonGauge
10936 //
10937 
10938 CMasterCautionWarningButtonGauge::CMasterCautionWarningButtonGauge (void)
10939 {
10940   strcpy (bmap_art, "");
10941   strcpy (sfx_wav, "");
10942   sfx_tag = 0;
10943   memset (&smsg, 0, sizeof(SMessage));
10944   memset (&lmsg, 0, sizeof(SMessage));
10945 }
10946 
10947 int CMasterCautionWarningButtonGauge::Read (SStream *stream, Tag tag)
10948 {
10949   int rc = TAG_IGNORED;
10950 
10951   switch (tag) {
10952   case 'bmap':
10953     ReadString (bmap_art, 64, stream);
10954     rc = TAG_READ;
10955     break;
10956 
10957   case 'sfx_':
10958     ReadString (sfx_wav, 64, stream);
10959     rc = TAG_READ;
10960     break;
10961 
10962   case 'smsg':
10963   case 'swch':
10964     ReadMessage (&smsg, stream);
10965     rc = TAG_READ;
10966     break;
10967 
10968   case 'lmsg':
10969     ReadMessage (&lmsg, stream);
10970     rc = TAG_READ;
10971     break;
10972   }
10973 
10974   if (rc == TAG_IGNORED) {
10975     rc = CGauge::Read (stream, tag);
10976   }
10977 
10978   if (rc == TAG_IGNORED) {
10979     char s[64];
10980     TagToString (s, tag);
10981     globals->logWarning->Write ("CMasterCautionWarningButtonGauge::Read : Unknown tag %s", s);
10982   }
10983 
10984   return rc;
10985 }
10986 
10987 void CMasterCautionWarningButtonGauge::ReadFinished (void)
10988 {
10989   CGauge::ReadFinished ();
10990 
10991   // Load sound effects
10992   if (strlen (sfx_wav) > 0) {
10993     char sfxFullname[64];
10994     strcpy (sfxFullname, "SOUND\\");
10995     strcat (sfxFullname, sfx_wav);
10996     sfx_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
10997   }
10998 }
10999 
11000 
11001 //
11002 // CKAFireExtinguisherButton
11003 //
11004 
11005 CKAFireExtinguisherButton::CKAFireExtinguisherButton (void)
11006 {
11007   strcpy (fire.art, "");
11008   fire.x = fire.y = 0;
11009   strcpy (ok.art, "");
11010   ok.x = ok.y = 0;
11011   strcpy (dsch.art, "");
11012   dsch.x = dsch.y = 0;
11013   strcpy (sfx_wav, "");
11014   sfx_tag = 0;
11015   strcpy (curs_csr, "");
11016   curs_tag = 0;
11017 }
11018 
11019 int CKAFireExtinguisherButton::Read (SStream *stream, Tag tag)
11020 {
11021   int rc = TAG_IGNORED;
11022 
11023   switch (tag) {
11024   case 'd___':
11025     ReadString (dsch.art, 64, stream);
11026     ReadInt (&dsch.x, stream);
11027     ReadInt (&dsch.y, stream);
11028     rc = TAG_READ;
11029     break;
11030 
11031   case 'ok__':
11032     ReadString (ok.art, 64, stream);
11033     ReadInt (&ok.x, stream);
11034     ReadInt (&ok.y, stream);
11035     rc = TAG_READ;
11036     break;
11037 
11038   case 'fire':
11039     ReadString (fire.art, 64, stream);
11040     ReadInt (&fire.x, stream);
11041     ReadInt (&fire.y, stream);
11042     rc = TAG_READ;
11043     break;
11044 
11045   case 'sfx_':
11046     ReadString (sfx_wav, 64, stream);
11047     rc = TAG_READ;
11048     break;
11049 
11050   case 'curs':
11051     ReadString (curs_csr, 64, stream);
11052     rc = TAG_READ;
11053     break;
11054   }
11055 
11056   if (rc == TAG_IGNORED) {
11057     rc = CGauge::Read (stream, tag);
11058   }
11059 
11060   if (rc == TAG_IGNORED) {
11061     char s[64];
11062     TagToString (s, tag);
11063     globals->logWarning->Write ("CKAFireExtinguisherButton::Read : Unknown tag %s", s);
11064   }
11065 
11066   return rc;
11067 }
11068 
11069 void CKAFireExtinguisherButton::ReadFinished (void)
11070 {
11071   CGauge::ReadFinished ();
11072 
11073   // Bind cursors
11074   if (strlen (curs_csr) > 0) {
11075     curs_tag = globals->cursormgr->BindCursor (curs_csr);
11076   }
11077 
11078   // Load sound effects
11079   if (strlen (sfx_wav) > 0) {
11080     char sfxFullname[64];
11081     strcpy (sfxFullname, "SOUND\\");
11082     strcat (sfxFullname, sfx_wav);
11083     sfx_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
11084   }
11085 }
11086 
11087 
11088 //
11089 // CWalkerAPPanel
11090 //
11091 
11092 CWalkerAPPanel::CWalkerAPPanel (void)
11093 {
11094   strcpy (enga_yd_art, "");
11095   strcpy (enga_ap_art, "");
11096   strcpy (knob_bnk_art, "");
11097   strcpy (knob_trm_art, "");
11098 }
11099 
11100 int CWalkerAPPanel::Read (SStream *stream, Tag tag)
11101 {
11102   int rc = TAG_IGNORED;
11103 
11104   switch (tag) {
11105   case 'left':
11106     ReadFrom (&left, stream);
11107     rc = TAG_READ;
11108     break;
11109 
11110   case 'rght':
11111     ReadFrom (&rght, stream);
11112     rc = TAG_READ;
11113     break;
11114 
11115   case 'up__':
11116     ReadFrom (&up, stream);
11117     rc = TAG_READ;
11118     break;
11119 
11120   case 'down':
11121     ReadFrom (&down, stream);
11122     rc = TAG_READ;
11123     break;
11124 
11125   case 'xfer':
11126     ReadFrom (&xfer, stream);
11127     rc = TAG_READ;
11128     break;
11129 
11130   case 'turb':
11131     ReadFrom (&turb, stream);
11132     rc = TAG_READ;
11133     break;
11134 
11135   case 'ydon':
11136     ReadFrom (&ydon, stream);
11137     rc = TAG_READ;
11138     break;
11139 
11140   case 'ydof':
11141     ReadFrom (&ydof, stream);
11142     rc = TAG_READ;
11143     break;
11144 
11145   case 'apon':
11146     ReadFrom (&apon, stream);
11147     rc = TAG_READ;
11148     break;
11149 
11150   case 'apof':
11151     ReadFrom (&apof, stream);
11152     rc = TAG_READ;
11153     break;
11154 
11155   case 'enga':
11156     ReadString (enga_yd_art, 64, stream);
11157     ReadString (enga_ap_art, 64, stream);
11158     rc = TAG_READ;
11159     break;
11160 
11161   case 'knob':
11162     ReadString (knob_bnk_art, 64, stream);
11163     ReadString (knob_trm_art, 64, stream);
11164     rc = TAG_READ;
11165     break;
11166   }
11167 
11168   if (rc == TAG_IGNORED) {
11169     rc = CGauge::Read (stream, tag);
11170   }
11171 
11172   if (rc == TAG_IGNORED) {
11173     char s[64];
11174     TagToString (s, tag);
11175     globals->logWarning->Write ("CWalkerAPPanel::Read : Unknown tag %s", s);
11176   }
11177 
11178   return rc;
11179 }
11180 
11181 
11182 //
11183 // CWalkerFirePanel
11184 //
11185 
11186 CWalkerFirePanel::CWalkerFirePanel (void)
11187 {
11188 }
11189 
11190 int CWalkerFirePanel::Read (SStream *stream, Tag tag)
11191 {
11192   int rc = TAG_IGNORED;
11193 
11194   switch (tag) {
11195   case 'fir1':
11196     ReadMessage (&fir1, stream);
11197     rc = TAG_READ;
11198     break;
11199 
11200   case 'fir2':
11201     ReadMessage (&fir2, stream);
11202     rc = TAG_READ;
11203     break;
11204 
11205   case 'ext1':
11206     ReadFrom (&ext1, stream);
11207     rc = TAG_READ;
11208     break;
11209 
11210   case 'ext2':
11211     ReadFrom (&ext2, stream);
11212     rc = TAG_READ;
11213     break;
11214 
11215   case 'bel1':
11216     ReadFrom (&bel1, stream);
11217     rc = TAG_READ;
11218     break;
11219 
11220   case 'bel2':
11221     ReadFrom (&bel2, stream);
11222     rc = TAG_READ;
11223     break;
11224 
11225   case 'ann1':
11226     ReadFrom (&ann1, stream);
11227     rc = TAG_READ;
11228     break;
11229 
11230   case 'ann2':
11231     ReadFrom (&ann2, stream);
11232     rc = TAG_READ;
11233     break;
11234 
11235   case 'ef1_':
11236     ReadFrom (&ef1, stream);
11237     rc = TAG_READ;
11238     break;
11239 
11240   case 'ef2_':
11241     ReadFrom (&ef2, stream);
11242     rc = TAG_READ;
11243     break;
11244   }
11245 
11246   if (rc == TAG_IGNORED) {
11247     rc = CGauge::Read (stream, tag);
11248   }
11249 
11250   if (rc == TAG_IGNORED) {
11251     char s[64];
11252     TagToString (s, tag);
11253     globals->logWarning->Write ("CWalkerFirePanel::Read : Unknown tag %s", s);
11254   }
11255 
11256   return rc;
11257 }
11258 
11259 
11260 //
11261 // CLightSwitchSetGauge
11262 //
11263 
11264 CLightSwitchSetGauge::CLightSwitchSetGauge (void)
11265 {
11266   memset (&lmsg, 0, sizeof(SMessage));
11267 }
11268 
11269 int CLightSwitchSetGauge::Read (SStream *stream, Tag tag)
11270 {
11271   int rc = TAG_IGNORED;
11272 
11273   switch (tag) {
11274   case 'lmsg':
11275     ReadMessage (&lmsg, stream);
11276     rc = TAG_READ;
11277     break;
11278   }
11279 
11280   if (rc == TAG_IGNORED) {
11281     rc = CBitmapGauge::Read (stream, tag);
11282   }
11283 
11284   if (rc == TAG_IGNORED) {
11285     char s[64];
11286     TagToString (s, tag);
11287     globals->logWarning->Write ("CLightSwitchSetGauge::Read : Unknown tag %s", s);
11288   }
11289 
11290   return rc;
11291 }
11292 
11293 
11294 //
11295 // CRockerSwitch
11296 //
11297 
11298 CRockerSwitch::CRockerSwitch (void)
11299 {
11300   memset (&msg1, 0, sizeof(SMessage));
11301   memset (&msg2, 0, sizeof(SMessage));
11302   strcpy (sfx1_wav, "");
11303   strcpy (sfx2_wav, "");
11304   sfx1_tag = sfx2_tag = 0;
11305 }
11306 
11307 int CRockerSwitch::Read (SStream *stream, Tag tag)
11308 {
11309   int rc = TAG_IGNORED;
11310 
11311   switch (tag) {
11312   case 'one_':
11313     ReadFrom (&one, stream);
11314     rc = TAG_READ;
11315     break;
11316 
11317   case 'two_':
11318     ReadFrom (&two, stream);
11319     rc = TAG_READ;
11320     break;
11321 
11322   case 'msg1':
11323     ReadMessage (&msg1, stream);
11324     rc = TAG_READ;
11325     break;
11326 
11327   case 'msg2':
11328     ReadMessage (&msg2, stream);
11329     rc = TAG_READ;
11330     break;
11331 
11332   case 'sfx1':
11333     ReadString (sfx1_wav, 64, stream);
11334     rc = TAG_READ;
11335     break;
11336 
11337   case 'sfx2':
11338     ReadString (sfx2_wav, 64, stream);
11339     rc = TAG_READ;
11340     break;
11341   }
11342 
11343   if (rc == TAG_IGNORED) {
11344     rc = CSimpleSwitch::Read (stream, tag);
11345   }
11346 
11347   if (rc == TAG_IGNORED) {
11348     char s[64];
11349     TagToString (s, tag);
11350     globals->logWarning->Write ("CRockerSwitch::Read : Unknown tag %s", s);
11351   }
11352 
11353   return rc;
11354 }
11355 
11356 void CRockerSwitch::ReadFinished (void)
11357 {
11358   CGauge::ReadFinished ();
11359 
11360   // Load sound effects
11361   if (strlen (sfx1_wav) > 0) {
11362     char sfxFullname[64];
11363     strcpy (sfxFullname, "SOUND\\");
11364     strcat (sfxFullname, sfx1_wav);
11365     sfx1_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
11366   }
11367   if (strlen (sfx2_wav) > 0) {
11368     char sfxFullname[64];
11369     strcpy (sfxFullname, "SOUND\\");
11370     strcat (sfxFullname, sfx2_wav);
11371     sfx2_tag = globals->audiomgr->CreateSfx (&globals->pfs, sfxFullname);
11372   }
11373 }
11374 
11375 ECursorResult CRockerSwitch::MouseMoved (int x, int y)
11376 {
11377   ECursorResult rc = CURSOR_NOT_CHANGED;
11378 
11379   // Send updated mouse position to all click areas
11380   if (rc == CURSOR_NOT_CHANGED) rc = one.MouseMoved (x, y);
11381   if (rc == CURSOR_NOT_CHANGED) rc = two.MouseMoved (x, y);
11382 
11383   // Call parent method if cursor not changed
11384   if (rc == CURSOR_NOT_CHANGED) {
11385     rc = CSimpleSwitch::MouseMoved (x, y);
11386   }
11387 
11388   return rc;
11389 }
SourceForge.net Logo Documentation generated by doxygen