1
0
Fork 0

Melchior FRANZ:

These patches add a clock instrument, which allows to model failure ("serviceable") and to adjust the time independently of the system time (defaults to GMT). The main incentive is to make the p51d clock work and adjustable via the knob.

 o Offers a time string ("12:03:15") for the LCD or for LED
   clocks, or an empty string in case of failure/power off. The
   instrument assumes that digital clocks are battery buffered,
   so they will be updated even if there's nothing on the display.

 o Offers the number of seconds since midnight for analog
   clocks, like in the p51d. This number is not increased
   if !serviceable. So the clock will stand still and continue
   where it stopped when it's serviceable again.

I did not consider voltage yet, because the Mustang's clock will need a lot more current than the LCD clock. The instrument is updated 4 times per second but returns immediately if neither time nor offset changed. The function getGMTString() in fg_props.cxx could be removed after applying these patches.
This commit is contained in:
ehofman 2003-06-27 08:46:57 +00:00
parent fe1070bfc6
commit 541d41af83
4 changed files with 161 additions and 1 deletions

View file

@ -13,6 +13,7 @@ libInstrumentation_a_SOURCES = \
slip_skid_ball.cxx slip_skid_ball.hxx \ slip_skid_ball.cxx slip_skid_ball.hxx \
heading_indicator.cxx heading_indicator.hxx \ heading_indicator.cxx heading_indicator.hxx \
vertical_speed_indicator.cxx vertical_speed_indicator.hxx \ vertical_speed_indicator.cxx vertical_speed_indicator.hxx \
mag_compass.cxx mag_compass.hxx mag_compass.cxx mag_compass.hxx \
clock.cxx clock.hxx
INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src

View file

@ -0,0 +1,96 @@
// clock.cxx - an electric-powered turn indicator.
// Written by Melchior FRANZ, started 2003.
//
// This file is in the Public Domain and comes with no warranty.
//
// $Id$
#include "clock.hxx"
#include <simgear/timing/sg_time.hxx>
#include <Main/fg_props.hxx>
#include <Main/util.hxx>
Clock::Clock ()
: _is_serviceable(true),
_gmt_time_sec(0),
_offset_sec(0),
_indicated_sec(0),
_standstill_offset(0)
{
_indicated_string[0] = '\0';
}
Clock::~Clock ()
{
}
void
Clock::init ()
{
_serviceable_node = fgGetNode("/instrumentation/clock/serviceable", true);
_offset_node = fgGetNode("/instrumentation/clock/offset-sec", true);
_sec_node = fgGetNode("/instrumentation/clock/indicated-sec", true);
_string_node = fgGetNode("/instrumentation/clock/indicated-string", true);
}
void
Clock::update (double delta_time_sec)
{
if (!_serviceable_node->getBoolValue()) {
if (_is_serviceable) {
_string_node->setStringValue("");
_is_serviceable = false;
}
return;
}
struct tm *t = globals->get_time_params()->getGmt();
int hour = t->tm_hour;
int min = t->tm_min;
int sec = t->tm_sec;
long gmt = (hour * 60 + min) * 60 + sec;
int offset = _offset_node->getLongValue();
if (!_is_serviceable) {
_standstill_offset -= gmt - _gmt_time_sec;
} else if (_gmt_time_sec == gmt && _offset_sec == offset)
return;
_gmt_time_sec = gmt;
_offset_sec = offset;
_indicated_sec = _gmt_time_sec + offset + _standstill_offset;
_sec_node->setLongValue(_indicated_sec);
sec += offset;
while (sec < 0) {
sec += 60;
min--;
}
while (sec >= 60) {
sec -= 60;
min++;
}
while (min < 0) {
min += 60;
hour--;
}
while (min >= 60) {
min -= 60;
hour++;
}
while (hour < 0)
hour += 24;
while (hour >= 24)
hour -= 24;
sprintf(_indicated_string, "%02d:%02d:%02d", hour, min, sec);
_string_node->setStringValue(_indicated_string);
_is_serviceable = true;
}
// end of clock.cxx

View file

@ -0,0 +1,61 @@
// clock.hxx.
// Written by Melchior FRANZ, started 2003.
//
// This file is in the Public Domain and comes with no warranty.
//
// $Id$
#ifndef __INSTRUMENTS_CLOCK_HXX
#define __INSTRUMENTS_CLOCK_HXX 1
#ifndef __cplusplus
# error This library requires C++
#endif
#include <simgear/props/props.hxx>
#include <Main/fgfs.hxx>
/**
* Model a clock.
*
* Input properties:
*
* /instrumentation/clock/serviceable
* /instrumentation/clock/offset-sec
*
* Output properties:
*
* /instrumentation/clock/indicated-sec
* /instrumentation/clock/indicated-string
*/
class Clock : public FGSubsystem
{
public:
Clock ();
virtual ~Clock ();
virtual void init ();
virtual void update (double dt);
private:
bool _is_serviceable;
long _gmt_time_sec;
long _offset_sec;
long _indicated_sec;
char _indicated_string[16];
long _standstill_offset;
SGPropertyNode_ptr _serviceable_node;
SGPropertyNode_ptr _offset_node;
SGPropertyNode_ptr _sec_node;
SGPropertyNode_ptr _string_node;
};
#endif // __INSTRUMENTS_CLOCK_HXX

View file

@ -17,6 +17,7 @@
#include "dme.hxx" #include "dme.hxx"
#include "gps.hxx" #include "gps.hxx"
#include "clock.hxx"
FGInstrumentMgr::FGInstrumentMgr () FGInstrumentMgr::FGInstrumentMgr ()
@ -32,6 +33,7 @@ FGInstrumentMgr::FGInstrumentMgr ()
set_subsystem("compass", new MagCompass); set_subsystem("compass", new MagCompass);
set_subsystem("dme", new DME, 1.0); set_subsystem("dme", new DME, 1.0);
set_subsystem("gps", new GPS, 0.45); set_subsystem("gps", new GPS, 0.45);
set_subsystem("clock", new Clock, 0.25);
} }
FGInstrumentMgr::~FGInstrumentMgr () FGInstrumentMgr::~FGInstrumentMgr ()