DEFINE_REF(eDVBLocalTimeHandler);
eDVBLocalTimeHandler::eDVBLocalTimeHandler()
- :m_time_ready(false), m_time_difference(0)
+ :m_time_ready(false)
{
if ( !instance )
instance=this;
instance=0;
for (std::map<iDVBChannel*, channel_data>::iterator it=m_knownChannels.begin(); it != m_knownChannels.end(); ++it)
delete it->second.tdt;
+ if (ready())
+ {
+ eDebug("set RTC to previous valid time");
+ setRTC(::time(0));
+ }
}
void eDVBLocalTimeHandler::readTimeOffsetData( const char* filename )
void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int update_count )
{
+ int time_difference;
bool restart_tdt = false;
if (!tp_time)
restart_tdt = true;
now.tm_min,
now.tm_sec);
time_t linuxTime=time(0);
- time_t nowTime=linuxTime+m_time_difference;
- localtime_r(&nowTime, &now);
+ localtime_r(&linuxTime, &now);
eDebug("[eDVBLocalTimerHandler] Receiver time is %02d:%02d:%02d",
now.tm_hour,
now.tm_min,
now.tm_sec);
- m_time_difference = rtc_time - linuxTime;
- eDebug("[eDVBLocalTimerHandler] RTC to Receiver time difference is %ld seconds", nowTime - rtc_time );
- if ( abs(m_time_difference) > 59 )
+ time_difference = rtc_time - linuxTime;
+ eDebug("[eDVBLocalTimerHandler] RTC to Receiver time difference is %ld seconds", linuxTime - rtc_time );
+ if ( time_difference )
{
eDebug("[eDVBLocalTimerHandler] set Linux Time to RTC Time");
timeval tnow;
gettimeofday(&tnow,0);
tnow.tv_sec=rtc_time;
settimeofday(&tnow,0);
- eMainloop::addTimeOffset(m_time_difference);
- m_time_difference=0;
}
- else if ( !m_time_difference )
+ else if ( !time_difference )
eDebug("[eDVBLocalTimerHandler] no change needed");
else
eDebug("[eDVBLocalTimerHandler] set to RTC time");
// current linux time
time_t linuxTime = time(0);
- // current enigma time
- time_t nowTime=linuxTime+m_time_difference;
-
// difference between current enigma time and transponder time
- int enigma_diff = tp_time-nowTime;
+ int enigma_diff = tp_time-linuxTime;
int new_diff=0;
{
eDebug("[eDVBLocalTimerHandler] we have correction %d", it->second);
time_t CorrectedTpTime = tp_time+it->second;
- int ddiff = CorrectedTpTime-nowTime;
+ int ddiff = CorrectedTpTime-linuxTime;
eDebug("[eDVBLocalTimerHandler] diff after add correction is %d", ddiff);
if ( abs(it->second) < 300 ) // stored correction < 5 min
{
eDebug("[eDVBLocalTimerHandler] use stored correction(<5 min)");
new_diff = ddiff;
}
- else if ( /*eSystemInfo::getInstance()->getHwType() == eSystemInfo::DM7020 && TODO !!!*/
- getRTC() )
+ else if ( getRTC() )
{
time_t rtc=getRTC();
m_timeOffsetMap[chan->getChannelID()] = rtc-tp_time;
- new_diff = rtc-nowTime; // set enigma time to rtc
+ new_diff = rtc-linuxTime; // set enigma time to rtc
eDebug("[eDVBLocalTimerHandler] update stored correction to %ld (calced against RTC time)", rtc-tp_time );
}
else if ( abs(ddiff) <= 120 )
m_time_ready=true;
}
- time_t t = nowTime+new_diff;
+ time_t t = linuxTime+new_diff;
m_last_tp_time_difference=tp_time-t;
if (!new_diff &&
return;
}
- tm now;
- localtime_r(&t, &now);
- eDebug("[eDVBLocalTimerHandler] time update to %02d:%02d:%02d",
- now.tm_hour,
- now.tm_min,
- now.tm_sec);
-
- m_time_difference = t - linuxTime; // calc our new linux_time -> enigma_time correction
- 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
setRTC(t);
eDebug("[eDVBLocalTimerHandler] update RTC");
}
+ else if (getRTC())
+ {
+ if (abs(getRTC() - t) > 60)
+ {
+ eDebug("[eDVBLocalTimerHandler] difference between new linux time and RTC time is > 60 sec... transponder time looks not ok... use rtc time");
+ t = getRTC();
+ }
+ else
+ eDebug("[eDVBLocalTimerHandler] difference between linux time and RTC time is < 60 sec... so the transponder time looks ok");
+ }
else
- eDebug("[eDVBLocalTimerHandler] don't update RTC");
+ eDebug("[eDVBLocalTimerHandler] no RTC available :(");
+
+ tm now;
+ localtime_r(&t, &now);
+ eDebug("[eDVBLocalTimerHandler] time update to %02d:%02d:%02d",
+ now.tm_hour,
+ now.tm_min,
+ now.tm_sec);
+
+ time_difference = t - linuxTime; // calc our new linux_time -> enigma_time correction
+ eDebug("[eDVBLocalTimerHandler] m_time_difference is %d", time_difference );
- if ( abs(m_time_difference) > 59 )
+ if ( time_difference )
{
eDebug("[eDVBLocalTimerHandler] set Linux Time");
timeval tnow;
gettimeofday(&tnow,0);
tnow.tv_sec=t;
settimeofday(&tnow,0);
- eMainloop::addTimeOffset(m_time_difference);
- m_time_difference=0;
}
/*emit*/ m_timeUpdated();