kstars
simclock.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <kdebug.h>
00019 #include <klocale.h>
00020
00021 #include "simclock.h"
00022 #include "kstars.h"
00023
00024 int SimClock::idgen = 1;
00025
00026 int SimClock::TimerInterval = 100;
00027
00028 SimClock::SimClock(QObject *parent, const KStarsDateTime &when) :
00029 DCOPObject("clock#" + QCString().setNum(idgen++)),
00030 QObject(parent),
00031 tmr(this)
00032 {
00033 if (! when.isValid() ) tmr.stop();
00034 setUTC(when);
00035 julianmark = UTC.djd();
00036
00037 Scale = 1.0;
00038 ManualMode = false;
00039 ManualActive = false;
00040
00041 QObject::connect(&tmr, SIGNAL(timeout()), this, SLOT(tick()));
00042 }
00043
00044 SimClock::SimClock (const SimClock &old) :
00045 DCOPObject("clock#" + QCString().setNum(idgen++)),
00046 QObject(old.parent()),
00047 SimClockInterface(),
00048 tmr(this)
00049 {
00050 UTC = old.UTC;
00051 julianmark = old.julianmark;
00052
00053 Scale = old.Scale;
00054 ManualMode = old.ManualMode;
00055 ManualActive = old.ManualActive;
00056
00057 QObject::connect(&tmr, SIGNAL(timeout()), this, SLOT(tick()));
00058 }
00059
00060 void SimClock::tick() {
00061 if ( ! ManualMode ) {
00062 long mselapsed = sysmark.elapsed();
00063 if (mselapsed < lastelapsed) {
00064
00065
00066 julianmark = UTC.djd();
00067 sysmark.start();
00068 lastelapsed = 0;
00069 } else {
00070 lastelapsed = mselapsed;
00071 }
00072
00073 long double scaledsec = (long double)mselapsed * (long double)Scale / 1000.0;
00074 UTC.setDJD( julianmark + scaledsec / (24. * 3600.) );
00075
00076
00077
00078
00079
00080 emit timeAdvanced();
00081 }
00082 }
00083
00084 void SimClock::setManualMode( bool on ) {
00085 if ( on ) {
00086
00087
00088
00089
00090 if ( tmr.isActive() ) {
00091 tmr.stop();
00092 ManualActive = true;
00093 } else {
00094 ManualActive = false;
00095 }
00096 ManualMode = true;
00097 } else {
00098
00099
00100 if ( isActive() ) {
00101 sysmark.start();
00102 julianmark = UTC.djd();
00103 lastelapsed = 0;
00104 tmr.start(TimerInterval);
00105 }
00106 ManualMode = false;
00107 }
00108 }
00109
00110 void SimClock::manualTick( bool force ) {
00111 if ( force || (ManualMode && ManualActive) ) {
00112 setUTC( UTC.addSecs( (long double)Scale ) );
00113 } else if ( ! ManualMode ) tick();
00114 }
00115
00116 bool SimClock::isActive() {
00117 if ( ManualMode ) return ManualActive;
00118 else return tmr.isActive();
00119 }
00120
00121
00122 void SimClock::stop() {
00123 if ( ManualMode && ManualActive ) {
00124 ManualActive = false;
00125 emit clockStopped();
00126 }
00127
00128 if (!ManualMode && tmr.isActive()) {
00129 kdDebug() << i18n( "Stopping the timer" ) << endl;
00130 tmr.stop();
00131 emit clockStopped();
00132 }
00133 }
00134
00135 void SimClock::start() {
00136 if ( ManualMode && !ManualActive ) {
00137 ManualActive = true;
00138 sysmark.start();
00139 julianmark = UTC.djd();
00140 lastelapsed = 0;
00141 emit clockStarted();
00142
00143 emit timeChanged();
00144 }
00145
00146 if (! ManualMode && ! tmr.isActive()) {
00147 kdDebug() << i18n( "Starting the timer" ) << endl;
00148 sysmark.start();
00149 julianmark = UTC.djd();
00150 lastelapsed = 0;
00151 tmr.start(TimerInterval);
00152 emit clockStarted();
00153 }
00154 }
00155
00156 void SimClock::setUTC(const KStarsDateTime &newtime) {
00157 if ( newtime.isValid() ) {
00158 UTC = newtime;
00159 if (tmr.isActive()) {
00160 julianmark = UTC.djd();
00161 sysmark.start();
00162 lastelapsed = 0;
00163 }
00164
00165 kdDebug() << i18n( "Setting clock: UTC: %1 JD: %2" )
00166 .arg( UTC.toString() ).arg( KGlobal::locale()->formatNumber( UTC.djd() ) ) << endl;
00167 emit timeChanged();
00168 } else {
00169 kdDebug() << i18n( "Cannot set SimClock: Invalid Date/Time." ) << endl;
00170 }
00171 }
00172
00173 void SimClock::setScale(float s) {
00174 if (Scale != s ) {
00175 kdDebug() << i18n( "New clock scale: %1 sec" ).arg( s ) << endl;
00176 Scale = s;
00177 if (tmr.isActive()) {
00178 julianmark = UTC.djd();
00179 sysmark.start();
00180 lastelapsed = 0;
00181 }
00182 emit scaleChanged(s);
00183 }
00184 }
00185
00186
00187 void SimClock::setClockScale(float s) {
00188 setScale(s);
00189 }
00190
00191 #include "simclock.moc"