• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kstars

simclock.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002                           simclock.cpp  -  description
00003                              -------------------
00004     begin                : Mon Feb 18 2002
00005     copyright          : (C) 2002 by Mark Hollomon
00006     email                : mhh@mindspring.com
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
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; //msec
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 ) { //only tick if ManualMode is false
00062         long mselapsed = sysmark.elapsed();
00063         if (mselapsed < lastelapsed) {
00064             // The sysmark timer has wrapped after 24 hours back to 0 ms.  
00065             // Reset sysmark and julianmark
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 //      kdDebug() << "tick() : JD = " << KGlobal::locale()->formatNumber( UTC.djd(), 7 ) <<
00077 //          " mselapsed = " << mselapsed << " scale = " << Scale <<
00078 //          "  scaledsec = " << double(scaledsec) << endl;
00079 
00080         emit timeAdvanced();
00081     }
00082 }
00083 
00084 void SimClock::setManualMode( bool on ) {
00085     if ( on ) {
00086         //Turn on manual ticking.  
00087         //If the timer was active, stop the timer and set ManualActive=true.  
00088         //Otherwise, set ManualActive=false.
00089         //Finally, set ManualMode=true.
00090         if ( tmr.isActive() ) {
00091             tmr.stop();
00092             ManualActive = true;
00093         } else {
00094             ManualActive = false;
00095         }
00096         ManualMode = true;
00097     } else {
00098         //Turn off manual ticking.  If the Manual clock was active, start the timer.
00099         //Then set ManualMode=false.
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 // The SimClockInterface
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         //emit timeChanged() in order to restart calls to updateTime()
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 //DCOP function to set clock scale
00187 void SimClock::setClockScale(float s) {
00188     setScale(s);
00189 }
00190 
00191 #include "simclock.moc"

kstars

Skip menu "kstars"
  • Main Page
  • Modules
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • keduca
  • kstars
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal