X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/e68ab3a6255de286aad4f503ee9929d0c503ebcc..44b88742b46aea5328fc1f5d9435379485c73cbf:/lib/dvb/dvbtime.cpp diff --git a/lib/dvb/dvbtime.cpp b/lib/dvb/dvbtime.cpp index 6c2df6c2..616363f9 100644 --- a/lib/dvb/dvbtime.cpp +++ b/lib/dvb/dvbtime.cpp @@ -120,7 +120,7 @@ eDVBLocalTimeHandler *eDVBLocalTimeHandler::instance; DEFINE_REF(eDVBLocalTimeHandler); eDVBLocalTimeHandler::eDVBLocalTimeHandler() - :m_time_ready(false), m_time_difference(0) + :m_time_ready(false) { if ( !instance ) instance=this; @@ -148,6 +148,11 @@ eDVBLocalTimeHandler::~eDVBLocalTimeHandler() instance=0; for (std::map::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 ) @@ -187,6 +192,7 @@ void eDVBLocalTimeHandler::writeTimeOffsetData( 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; @@ -208,25 +214,22 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up 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"); @@ -243,11 +246,8 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up // 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; @@ -268,19 +268,18 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up { 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 ) @@ -316,7 +315,7 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up 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 && @@ -326,17 +325,6 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up 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 @@ -344,18 +332,36 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up 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();