summaryrefslogtreecommitdiff
path: root/example/ntp.cpp
blob: 5357cae8149382d09082be763c9786fccdac73c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include "ntp.h"
#include <qpushbutton.h>
#include <qregexp.h>
#include <qlabel.h>
#include <qlineedit.h>
#include <qmultilineedit.h>
#include <opie/oprocess.h>
#include <qpe/config.h>
#include <qpe/global.h>
#include <qpe/timeconversion.h>
#include <qpe/tzselect.h>
#include <qpe/timestring.h>
#include <qpe/qpedialog.h>
#include <sys/time.h>
#include <time.h>
#include <stdlib.h>


Ntp::Ntp( QWidget* parent,  const char* name, WFlags fl )
    : NtpBase( parent, name, fl )
{
	Config cfg("ntp",Config::User);
  cfg.setGroup("settings");
 	_maxOffset = cfg.readNumEntry("maxOffset",5);
  _minLookupDiff = cfg.readNumEntry("minLookupDiff",10);
  LineEditNtpServer->setText( cfg.readEntry("ntpServer") );
 	ntpProcess = new OProcess( );
  connect ( ntpProcess, SIGNAL(receivedStdout(OProcess*,char*,int)),
  					this, SLOT(getNtpOutput(OProcess*,char*,int)));
  connect ( ntpProcess, SIGNAL(processExited(OProcess*)),
  					this, SLOT(ntpFinished(OProcess*)));
  connect(runNtp, SIGNAL(clicked()), this, SLOT(slotRunNtp()));
 	_nextCorrection = new QTimer( this );
    connect( _nextCorrection, SIGNAL(timeout()), SLOT(correctClock()) );
  slotRunNtp();
}

Ntp::~Ntp()
{
	Config cfg("ntp",Config::User);
  cfg.setGroup("settings");
  cfg.writeEntry("ntpServer", LineEditNtpServer->text());
}


void Ntp::slotRunNtp()
{
	TextLabelStartTime->setText(QDateTime::currentDateTime().toString());
	ntpProcess->clearArguments();
	*ntpProcess << "ntpdate" << LineEditNtpServer->text();
	bool ret = ntpProcess->start(OProcess::NotifyOnExit,OProcess::AllOutput);
  if ( !ret ) {
     qDebug("Error while executing ntp");
     outPut->append("\nError while executing\n\n");
  }
}

void  Ntp::getNtpOutput(OProcess *proc, char *buffer, int buflen)
{
  QString lineStr, lineStrOld;
  lineStr = buffer;
  lineStr=lineStr.left(buflen);
  if (lineStr!=lineStrOld)
  {
	        outPut->append(lineStr);
         	_ntpOutput += lineStr;
  }
  lineStrOld = lineStr;
}

void  Ntp::ntpFinished(OProcess*)
{
	Config cfg("ntp",Config::User);
  cfg.setGroup("lookups");
  int lastLookup = cfg.readNumEntry("time",0);
  int lookupCount = cfg.readNumEntry("count",-1);
  int time = TimeConversion::toUTC( QDateTime::currentDateTime() );
  cfg.writeEntry("time", time);
 	
  float timeShift = getTimeShift();
 	int secsSinceLast = time - lastLookup;
  TextLabelNewTime->setText(QDateTime::currentDateTime().toString());
  if ( lastLookup > 0 && secsSinceLast > 60*_minLookupDiff)
  {
	  lookupCount++;
   	cfg.writeEntry("count",lookupCount);
	  cfg.setGroup("lookup_"+QString::number(lookupCount));
    _shiftPerSec =  timeShift / secsSinceLast;
    float nextCorr = _maxOffset / _shiftPerSec;
   	qDebug("secs since last lookup %i", secsSinceLast);qDebug("timeshift since last lookup %f", timeShift);qDebug("timeshift since per sec %f", _shiftPerSec);qDebug("in %f secs the time will be shifted by %i", nextCorr,_maxOffset);
		cfg.writeEntry("secsSinceLast",secsSinceLast);
		cfg.writeEntry("timeShift",QString::number(timeShift));
  }
}

void Ntp::correctClock()
{
	qDebug("current time: %s",QDateTime::currentDateTime().toString().latin1());
	Config cfg("ntp",Config::User);
  cfg.setGroup("correction");
 	int lastTime = cfg.readNumEntry("time",0);
  int now = TimeConversion::toUTC( QDateTime::currentDateTime() );
  int corr = int((now - lastTime) * _shiftPerSec);
	outPut->append( "time will be shifted by "+QString::number(corr)+ "secs");
  struct timeval myTv;
  myTv.tv_sec = TimeConversion::toUTC( QDateTime::currentDateTime().addSecs(corr) );
  myTv.tv_usec = 0;

  if ( myTv.tv_sec != -1 )
      ::settimeofday( &myTv, 0 );
  Global::writeHWClock();
  cfg.writeEntry("time",now);
	qDebug("current time: %s",QDateTime::currentDateTime().toString().latin1());
}

float Ntp::getTimeShift()
{
	QString _offset = "offset";
  QString _sec = "sec";
  QRegExp _reOffset = QRegExp(_offset);
  QRegExp _reEndOffset = QRegExp(_sec);
  int posOffset = _reOffset.match( _ntpOutput );
  int posEndOffset = _reEndOffset.match( _ntpOutput, posOffset );
  posOffset += _offset.length() + 1;
  QString diff = _ntpOutput.mid(posOffset, posEndOffset-posOffset-1);
  qDebug("%s", _ntpOutput.latin1());
  qDebug("diff = >%s<",diff.latin1());
  TextLabelTimeShift->setText(diff);
  return diff.toFloat();
}