X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fdvbtime.cpp;h=6cfaccc89f06d213638157d2a3d13a2043a7b384;hp=7684bfa4b3fe3407eeb9203b1b2fc062bda96d94;hb=92362f1b73f1e61ad0cb1c581b318b360e0bb6fe;hpb=60a9bcb6f7b0e928a836dccd1008b82f837a0461 diff --git a/lib/dvb/dvbtime.cpp b/lib/dvb/dvbtime.cpp index 7684bfa..6cfaccc 100644 --- a/lib/dvb/dvbtime.cpp +++ b/lib/dvb/dvbtime.cpp @@ -15,26 +15,61 @@ static time_t prev_time; void setRTC(time_t time) { - int fd = open("/dev/dbox/fp0", O_RDWR); - if ( fd >= 0 ) + FILE *f = fopen("/proc/stb/fp/rtc", "w"); + if (f) { - if ( ::ioctl(fd, FP_IOCTL_SET_RTC, (void*)&time ) < 0 ) - eDebug("FP_IOCTL_SET_RTC failed(%m)"); + time_t wakeup=0; + FILE *f2 = fopen("/proc/stb/fp/wakeup_time", "r"); + if (f2) + { + fscanf(f2, "%u", &wakeup); + fclose(f2); + } + if (wakeup) // atmel firmware okay? + { + if (fprintf(f, "%u", time)) + prev_time = time; + else + eDebug("write /proc/stb/fp/rtc failed (%m)"); + fclose(f); + } else - prev_time = time; - close(fd); + eDebug("dont set rtc because of buggy atmel firmware!"); + } + else + { + int fd = open("/dev/dbox/fp0", O_RDWR); + if ( fd >= 0 ) + { + if ( ::ioctl(fd, FP_IOCTL_SET_RTC, (void*)&time ) < 0 ) + eDebug("FP_IOCTL_SET_RTC failed(%m)"); + else + prev_time = time; + close(fd); + } } } time_t getRTC() { time_t rtc_time=0; - int fd = open("/dev/dbox/fp0", O_RDWR); - if ( fd >= 0 ) + FILE *f = fopen("/proc/stb/fp/rtc", "r"); + if (f) + { + // sanity check to detect corrupt atmel firmware + if (fscanf(f, "%u", &rtc_time) != 1) + eDebug("read /proc/stb/fp/rtc failed (%m)"); + fclose(f); + } + else { - if ( ::ioctl(fd, FP_IOCTL_GET_RTC, (void*)&rtc_time ) < 0 ) - eDebug("FP_IOCTL_GET_RTC failed(%m)"); - close(fd); + int fd = open("/dev/dbox/fp0", O_RDWR); + if ( fd >= 0 ) + { + if ( ::ioctl(fd, FP_IOCTL_GET_RTC, (void*)&rtc_time ) < 0 ) + eDebug("FP_IOCTL_GET_RTC failed(%m)"); + close(fd); + } } return rtc_time != prev_time ? rtc_time : 0; } @@ -120,7 +155,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; @@ -151,7 +186,7 @@ eDVBLocalTimeHandler::~eDVBLocalTimeHandler() if (ready()) { eDebug("set RTC to previous valid time"); - setRTC(nowTime()); + setRTC(::time(0)); } } @@ -192,6 +227,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; @@ -213,25 +249,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"); @@ -248,11 +281,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; @@ -273,19 +303,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 ) @@ -321,7 +350,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 && @@ -331,17 +360,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 @@ -349,18 +367,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();