aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-11-16 10:19:24 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-11-16 10:19:24 +0000
commit8dfcf7d1701e9f178ec6d8d756a8bd779854a3d9 (patch)
tree4fb4323fb64535992c4c51dc2bdb0d246bd27433 /lib
parent3ac0dcf31587e44523cc41a3819ded19032925a7 (diff)
downloadenigma2-8dfcf7d1701e9f178ec6d8d756a8bd779854a3d9.tar.gz
enigma2-8dfcf7d1701e9f178ec6d8d756a8bd779854a3d9.zip
always emit timeUpdated signal on first received TDT
only set rtc on first tdt receive on the same transponder.. not on updates.. (RTC is our reference time to check of transponder time is to fast or to slow)
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/dvbtime.cpp30
-rw-r--r--lib/dvb/dvbtime.h6
2 files changed, 25 insertions, 11 deletions
diff --git a/lib/dvb/dvbtime.cpp b/lib/dvb/dvbtime.cpp
index 14e0b920..45430480 100644
--- a/lib/dvb/dvbtime.cpp
+++ b/lib/dvb/dvbtime.cpp
@@ -62,8 +62,8 @@ time_t parseDVBtime(__u8 t1, __u8 t2, __u8 t3, __u8 t4, __u8 t5)
return timegm(&t);
}
-TDT::TDT(eDVBChannel *chan)
- :chan(chan)
+TDT::TDT(eDVBChannel *chan, int update_count)
+ :chan(chan), update_count(update_count)
{
CONNECT(tableReady, TDT::ready);
CONNECT(m_interval_timer.timeout, TDT::start);
@@ -73,7 +73,7 @@ TDT::TDT(eDVBChannel *chan)
void TDT::ready(int error)
{
- eDVBLocalTimeHandler::getInstance()->updateTime(error, chan);
+ eDVBLocalTimeHandler::getInstance()->updateTime(error, chan, ++update_count);
}
int TDT::createTable(int nr, const __u8 *data, unsigned int max)
@@ -84,7 +84,7 @@ int TDT::createTable(int nr, const __u8 *data, unsigned int max)
if ( length >= 5 )
{
time_t tptime = parseDVBtime(data[3], data[4], data[5], data[6], data[7]);
- eDVBLocalTimeHandler::getInstance()->updateTime(tptime, chan);
+ eDVBLocalTimeHandler::getInstance()->updateTime(tptime, chan, update_count);
error=0;
return 1;
}
@@ -173,10 +173,10 @@ void eDVBLocalTimeHandler::writeTimeOffsetData( const char* filename )
}
}
-void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan )
+void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int update_count )
{
bool restart_tdt = false;
- if (!tp_time )
+ if (!tp_time)
restart_tdt = true;
else if (tp_time == -1)
{
@@ -238,6 +238,8 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan )
int new_diff=0;
+ bool updated = m_time_ready;
+
if ( m_time_ready ) // ref time ready?
{
// difference between reference time (current enigma time)
@@ -304,7 +306,8 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan )
time_t t = nowTime+new_diff;
m_last_tp_time_difference=tp_time-t;
- if (!new_diff)
+ if (!new_diff &&
+ updated) // overrride this check on first received TDT
{
eDebug("[eDVBLocalTimerHandler] not changed");
return;
@@ -320,7 +323,15 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan )
eDebug("[eDVBLocalTimerHandler] m_time_difference is %d", m_time_difference );
// if ( eSystemInfo::getInstance()->getHwType() == eSystemInfo::DM7020 ) TODO !!
+ if ( !update_count )
+ {
+ // set rtc to calced transponder time when the first tdt is received on this
+ // transponder
setRTC(t);
+ eDebug("[eDVBLocalTimerHandler] update RTC");
+ }
+ else
+ eDebug("[eDVBLocalTimerHandler] don't update RTC");
if ( abs(m_time_difference) > 59 )
{
@@ -342,9 +353,10 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan )
m_knownChannels.find(chan);
if ( it != m_knownChannels.end() )
{
- delete it->second.tdt;
- it->second.tdt = new TDT(chan);
+ TDT *prev_tdt = it->second.tdt;
+ it->second.tdt = new TDT(chan, prev_tdt->getUpdateCount());
it->second.tdt->startTimer(60*60*1000); // restart TDT for this transponder in 60min
+ delete prev_tdt;
}
}
}
diff --git a/lib/dvb/dvbtime.h b/lib/dvb/dvbtime.h
index fbc82f06..8f75ab7f 100644
--- a/lib/dvb/dvbtime.h
+++ b/lib/dvb/dvbtime.h
@@ -25,10 +25,12 @@ class TDT: public eGTable
eTimer m_interval_timer;
int createTable(int nr, const __u8 *data, unsigned int max);
void ready(int);
+ int update_count;
public:
- TDT(eDVBChannel *chan);
+ TDT(eDVBChannel *chan, int update_count=0);
void start();
void startTimer(int interval);
+ int getUpdateCount() { return update_count; }
};
class eDVBLocalTimeHandler: public Object
@@ -51,7 +53,7 @@ class eDVBLocalTimeHandler: public Object
void DVBChannelStateChanged(iDVBChannel*);
void readTimeOffsetData(const char*);
void writeTimeOffsetData(const char*);
- void updateTime(time_t tp_time, eDVBChannel*);
+ void updateTime(time_t tp_time, eDVBChannel*, int updateCount);
static eDVBLocalTimeHandler *instance;
public:
PSignal0<void> m_timeUpdated;