From 39410381b5f023663c70c4dec09dc1eae287259d Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 3 Dec 2008 23:47:36 +0100 Subject: [PATCH] sync rtc time with linux time every 30 minutes when no transponder is tuned.. we need a fix for hardware without RTC... --- lib/dvb/dvbtime.cpp | 16 ++++++++++++++-- lib/dvb/dvbtime.h | 2 ++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/dvb/dvbtime.cpp b/lib/dvb/dvbtime.cpp index c433579..d879cfa 100644 --- a/lib/dvb/dvbtime.cpp +++ b/lib/dvb/dvbtime.cpp @@ -11,6 +11,8 @@ #define FP_IOCTL_SET_RTC 0x101 #define FP_IOCTL_GET_RTC 0x102 +#define TIME_UPDATE_INTERVAL (30*60*1000) + static time_t prev_time; void setRTC(time_t time) @@ -143,7 +145,7 @@ eDVBLocalTimeHandler *eDVBLocalTimeHandler::instance; DEFINE_REF(eDVBLocalTimeHandler); eDVBLocalTimeHandler::eDVBLocalTimeHandler() - :m_time_ready(false) + :m_time_ready(false), m_updateNonTunedTimer(eTimer::create(eApp)) { if ( !instance ) instance=this; @@ -164,6 +166,7 @@ eDVBLocalTimeHandler::eDVBLocalTimeHandler() /*emit*/ m_timeUpdated(); } } + CONNECT(m_updateNonTunedTimer->timeout, eDVBLocalTimeHandler::updateNonTuned); } eDVBLocalTimeHandler::~eDVBLocalTimeHandler() @@ -211,6 +214,12 @@ void eDVBLocalTimeHandler::writeTimeOffsetData( const char* filename ) } } +void eDVBLocalTimeHandler::updateNonTuned() +{ + updateTime(-1, 0, 0); + m_updateNonTunedTimer->start(TIME_UPDATE_INTERVAL, true); +} + void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int update_count ) { int time_difference; @@ -397,7 +406,7 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up int updateCount = it->second.tdt->getUpdateCount(); it->second.tdt = 0; it->second.tdt = new TDT(chan, updateCount); - it->second.tdt->startTimer(60*60*1000); // restart TDT for this transponder in 60min + it->second.tdt->startTimer(TIME_UPDATE_INTERVAL); // restart TDT for this transponder in 30min } } } @@ -430,12 +439,15 @@ void eDVBLocalTimeHandler::DVBChannelStateChanged(iDVBChannel *chan) { case iDVBChannel::state_ok: eDebug("[eDVBLocalTimerHandler] channel %p running", chan); + m_updateNonTunedTimer->stop(); it->second.tdt = new TDT(it->second.channel); it->second.tdt->start(); break; case iDVBChannel::state_release: eDebug("[eDVBLocalTimerHandler] remove channel %p", chan); m_knownChannels.erase(it); + if (m_knownChannels.empty()) + m_updateNonTunedTimer->start(TIME_UPDATE_INTERVAL, true); break; default: // ignore all other events return; diff --git a/lib/dvb/dvbtime.h b/lib/dvb/dvbtime.h index f403ffd..3f8d9b7 100644 --- a/lib/dvb/dvbtime.h +++ b/lib/dvb/dvbtime.h @@ -54,6 +54,7 @@ class eDVBLocalTimeHandler: public Object ePtr m_stateChangedConn; int m_prevChannelState; }; + ePtr m_updateNonTunedTimer; friend class TDT; std::map m_knownChannels; std::map m_timeOffsetMap; @@ -66,6 +67,7 @@ class eDVBLocalTimeHandler: public Object void readTimeOffsetData(const char*); void writeTimeOffsetData(const char*); void updateTime(time_t tp_time, eDVBChannel*, int updateCount); + void updateNonTuned(); static eDVBLocalTimeHandler *instance; #ifdef SWIG eDVBLocalTimeHandler(); -- 2.7.4