sync rtc time with linux time every 30 minutes when no transponder is tuned.. we...
authorghost <andreas.monzner@multimedia-labs.de>
Wed, 3 Dec 2008 22:47:36 +0000 (23:47 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Wed, 3 Dec 2008 22:48:20 +0000 (23:48 +0100)
lib/dvb/dvbtime.cpp
lib/dvb/dvbtime.h

index c43357959b16165052d86f71acdc3b378aacf45d..d879cface8b8c73204c03fb341fbadd4f458c327 100644 (file)
@@ -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;
index f403ffd4d17985c7fd3f341e54f3d05e157b3ef9..3f8d9b7dec1204bcdcde8473739741f816e82e1f 100644 (file)
@@ -54,6 +54,7 @@ class eDVBLocalTimeHandler: public Object
                ePtr<eConnection> m_stateChangedConn;
                int m_prevChannelState;
        };
+       ePtr<eTimer> m_updateNonTunedTimer;
        friend class TDT;
        std::map<iDVBChannel*, channel_data> m_knownChannels;
        std::map<eDVBChannelID,int> 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();