X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/672b1ef9c238b94bd46f17020557780745f0db18..726a696a8d423d9f994767f2df01e135f07fca96:/lib/dvb/dvbtime.cpp diff --git a/lib/dvb/dvbtime.cpp b/lib/dvb/dvbtime.cpp index dff5c0c9..4c18faa6 100644 --- a/lib/dvb/dvbtime.cpp +++ b/lib/dvb/dvbtime.cpp @@ -76,7 +76,7 @@ void TDT::ready(int error) eDVBLocalTimeHandler::getInstance()->updateTime(error, chan, ++update_count); } -int TDT::createTable(int nr, const __u8 *data, unsigned int max) +int TDT::createTable(unsigned int nr, const __u8 *data, unsigned int max) { if ( data && data[0] == 0x70 || data[0] == 0x73 ) { @@ -84,7 +84,8 @@ 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, update_count); + if (tptime && tptime != -1) + eDVBLocalTimeHandler::getInstance()->updateTime(tptime, chan, update_count); error=0; return 1; } @@ -128,7 +129,18 @@ eDVBLocalTimeHandler::eDVBLocalTimeHandler() if (!res_mgr) eDebug("[eDVBLocalTimerHandler] no resource manager !!!!!!!"); else + { res_mgr->connectChannelAdded(slot(*this,&eDVBLocalTimeHandler::DVBChannelAdded), m_chanAddedConn); + time_t now = time(0); + if ( now < 1072224000 ) // 01.01.2004 + eDebug("RTC not ready... wait for transponder time"); + else // inform all who's waiting for valid system time.. + { + eDebug("Use valid Linux Time :) (RTC?)"); + m_time_ready = true; + /*emit*/ m_timeUpdated(); + } + } } eDVBLocalTimeHandler::~eDVBLocalTimeHandler() @@ -136,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(nowTime()); + } } void eDVBLocalTimeHandler::readTimeOffsetData( const char* filename ) @@ -203,15 +220,14 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up now.tm_min, now.tm_sec); m_time_difference = rtc_time - linuxTime; - eDebug("[eDVBLocalTimerHandler] RTC to Receiver time difference is %d seconds", nowTime - rtc_time ); - if ( abs(m_time_difference) > 59 ) + eDebug("[eDVBLocalTimerHandler] RTC to Receiver time difference is %ld seconds", nowTime - rtc_time ); + if ( m_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 ) @@ -263,13 +279,12 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up 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 - eDebug("[eDVBLocalTimerHandler] update stored correction to %d (calced against RTC time)", rtc-tp_time ); + eDebug("[eDVBLocalTimerHandler] update stored correction to %ld (calced against RTC time)", rtc-tp_time ); } else if ( abs(ddiff) <= 120 ) { @@ -314,6 +329,26 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up return; } + 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 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] no RTC available :("); + tm now; localtime_r(&t, &now); eDebug("[eDVBLocalTimerHandler] time update to %02d:%02d:%02d", @@ -324,25 +359,13 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up 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 - // transponder - setRTC(t); - eDebug("[eDVBLocalTimerHandler] update RTC"); - } - else - eDebug("[eDVBLocalTimerHandler] don't update RTC"); - - if ( abs(m_time_difference) > 59 ) + if ( m_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; }