00001
00002
00003
00004 #ifndef SIGNALMONITOR_H
00005 #define SIGNALMONITOR_H
00006
00007
00008 #include <pthread.h>
00009
00010
00011 #include <algorithm>
00012 using namespace std;
00013
00014
00015 #include <qobject.h>
00016 #include <qmutex.h>
00017
00018
00019 #include "signalmonitorvalue.h"
00020 #include "channelbase.h"
00021 #include "cardutil.h"
00022
00023 #define DBG_SM(FUNC, MSG) VERBOSE(VB_CHANNEL, \
00024 "SM("<<channel->GetDevice()<<")::"<<FUNC<<": "<<MSG);
00025
00026 inline QString sm_flags_to_string(uint64_t);
00027
00028 class SignalMonitor : public QObject
00029 {
00030 Q_OBJECT
00031 public:
00033 static inline bool IsRequired(const QString &cardtype);
00034 static inline bool IsSupported(const QString &cardtype);
00035 static SignalMonitor *Init(QString cardtype, int db_cardnum,
00036 ChannelBase *channel);
00037 virtual ~SignalMonitor();
00038
00039
00040
00041
00042 virtual void Start();
00043 virtual void Stop();
00044 virtual void Kick();
00045 virtual bool WaitForLock(int timeout = -1);
00046
00047
00048
00049
00050 virtual void AddFlags(uint64_t _flags);
00051 virtual void RemoveFlags(uint64_t _flags);
00052 bool HasFlags(uint64_t _flags) const;
00053 bool HasAnyFlag(uint64_t _flags) const;
00054 uint64_t GetFlags(void) const { return flags; }
00055
00056
00057
00058
00061 bool GetNotifyFrontend() { return notify_frontend; }
00063 int GetUpdateRate() { return update_rate; }
00064 virtual QStringList GetStatusList(bool kick = true);
00065
00067 bool HasSignalLock(void) const
00068 {
00069 QMutexLocker locker(&statusLock);
00070 return signalLock.IsGood();
00071 }
00072
00073 virtual bool IsAllGood(void) const { return HasSignalLock(); }
00074
00075
00076
00077
00083 void SetNotifyFrontend(bool notify) { notify_frontend = notify; }
00084
00091 void SetUpdateRate(int msec)
00092 { update_rate = max(msec, (int)minimum_update_rate); }
00093
00094 public slots:
00095 virtual void deleteLater(void);
00096
00097 signals:
00103 void StatusSignalLock(const SignalMonitorValue&);
00104
00109 void StatusSignalStrength(const SignalMonitorValue&);
00110
00115 void AllGood(void);
00116 protected:
00117 SignalMonitor(int db_cardnum, ChannelBase *_channel,
00118 uint64_t wait_for_mask, const char *name = "SignalMonitor");
00119
00120 static void* SpawnMonitorLoop(void*);
00121 virtual void MonitorLoop();
00122
00124 virtual void UpdateValues() { ; }
00125
00126 public:
00129 static const uint64_t kDTVSigMon_PATSeen = 0x0000000001ULL;
00132 static const uint64_t kDTVSigMon_PMTSeen = 0x0000000002ULL;
00135 static const uint64_t kDTVSigMon_MGTSeen = 0x0000000004ULL;
00138 static const uint64_t kDTVSigMon_VCTSeen = 0x0000000008ULL;
00140 static const uint64_t kDTVSigMon_TVCTSeen = 0x0000000010ULL;
00142 static const uint64_t kDTVSigMon_CVCTSeen = 0x0000000020ULL;
00145 static const uint64_t kDTVSigMon_NITSeen = 0x0000000040ULL;
00148 static const uint64_t kDTVSigMon_SDTSeen = 0x0000000080ULL;
00150 static const uint64_t kFWSigMon_PowerSeen = 0x0000000100ULL;
00152 static const uint64_t kDTVSigMon_CryptSeen = 0x0000000200ULL;
00153
00155 static const uint64_t kDTVSigMon_PATMatch = 0x0000001000ULL;
00157 static const uint64_t kDTVSigMon_PMTMatch = 0x0000002000ULL;
00159 static const uint64_t kDTVSigMon_MGTMatch = 0x0000004000ULL;
00161 static const uint64_t kDTVSigMon_VCTMatch = 0x0000008000ULL;
00163 static const uint64_t kDTVSigMon_TVCTMatch = 0x0000010000ULL;
00165 static const uint64_t kDTVSigMon_CVCTMatch = 0x0000020000ULL;
00167 static const uint64_t kDTVSigMon_NITMatch = 0x0000040000ULL;
00169 static const uint64_t kDTVSigMon_SDTMatch = 0x0000080000ULL;
00171 static const uint64_t kFWSigMon_PowerMatch = 0x0000100000ULL;
00173 static const uint64_t kDTVSigMon_CryptMatch = 0x0000200000ULL;
00174
00175 static const uint64_t kDTVSigMon_WaitForPAT = 0x0001000000ULL;
00176 static const uint64_t kDTVSigMon_WaitForPMT = 0x0002000000ULL;
00177 static const uint64_t kDTVSigMon_WaitForMGT = 0x0004000000ULL;
00178 static const uint64_t kDTVSigMon_WaitForVCT = 0x0008000000ULL;
00179 static const uint64_t kDTVSigMon_WaitForNIT = 0x0010000000ULL;
00180 static const uint64_t kDTVSigMon_WaitForSDT = 0x0020000000ULL;
00181 static const uint64_t kDTVSigMon_WaitForSig = 0x0040000000ULL;
00182 static const uint64_t kFWSigMon_WaitForPower= 0x0080000000ULL;
00183 static const uint64_t kDTVSigMon_WaitForCrypt=0x0100000000ULL;
00184
00185 static const uint64_t kDTVSigMon_WaitForAll = 0x01FF000000ULL;
00186
00188 static const uint64_t kDVBSigMon_WaitForSNR = 0x1000000000ULL;
00190 static const uint64_t kDVBSigMon_WaitForBER = 0x2000000000ULL;
00192 static const uint64_t kDVBSigMon_WaitForUB = 0x4000000000ULL;
00194 static const uint64_t kDVBSigMon_WaitForPos = 0x8000000000ULL;
00195
00196 protected:
00197 pthread_t monitor_thread;
00198 ChannelBase *channel;
00199 int capturecardnum;
00200 uint64_t flags;
00201 int update_rate;
00202 uint minimum_update_rate;
00203 bool running;
00204 bool exit;
00205 bool update_done;
00206 bool notify_frontend;
00207
00208 SignalMonitorValue signalLock;
00209 SignalMonitorValue signalStrength;
00210
00211 QMutex startStopLock;
00212 mutable QMutex statusLock;
00213 };
00214
00215 inline QString sm_flags_to_string(uint64_t flags)
00216 {
00217 QString str("Seen(");
00218 if (SignalMonitor::kDTVSigMon_PATSeen & flags)
00219 str += "PAT,";
00220 if (SignalMonitor::kDTVSigMon_PMTSeen & flags)
00221 str += "PMT,";
00222 if (SignalMonitor::kDTVSigMon_MGTSeen & flags)
00223 str += "MGT,";
00224 if (SignalMonitor::kDTVSigMon_VCTSeen & flags)
00225 str += "VCT,";
00226 if (SignalMonitor::kDTVSigMon_TVCTSeen & flags)
00227 str += "TVCT,";
00228 if (SignalMonitor::kDTVSigMon_CVCTSeen & flags)
00229 str += "CVCT,";
00230 if (SignalMonitor::kDTVSigMon_NITSeen & flags)
00231 str += "NIT,";
00232 if (SignalMonitor::kDTVSigMon_SDTSeen & flags)
00233 str += "SDT,";
00234 if (SignalMonitor::kFWSigMon_PowerSeen & flags)
00235 str += "STB,";
00236 if (SignalMonitor::kDTVSigMon_CryptSeen & flags)
00237 str += "Crypt,";
00238
00239 str += ") Match(";
00240 if (SignalMonitor::kDTVSigMon_PATMatch & flags)
00241 str += "PAT,";
00242 if (SignalMonitor::kDTVSigMon_PMTMatch & flags)
00243 str += "PMT,";
00244 if (SignalMonitor::kDTVSigMon_MGTMatch & flags)
00245 str += "MGT,";
00246 if (SignalMonitor::kDTVSigMon_VCTMatch & flags)
00247 str += "VCT,";
00248 if (SignalMonitor::kDTVSigMon_TVCTMatch & flags)
00249 str += "TVCT,";
00250 if (SignalMonitor::kDTVSigMon_CVCTMatch & flags)
00251 str += "CVCT,";
00252 if (SignalMonitor::kDTVSigMon_NITMatch & flags)
00253 str += "NIT,";
00254 if (SignalMonitor::kDTVSigMon_SDTMatch & flags)
00255 str += "SDT,";
00256 if (SignalMonitor::kFWSigMon_PowerMatch & flags)
00257 str += "STB,";
00258 if (SignalMonitor::kDTVSigMon_CryptMatch & flags)
00259 str += "Crypt,";
00260
00261 str += ") Wait(";
00262 if (SignalMonitor::kDTVSigMon_WaitForPAT & flags)
00263 str += "PAT,";
00264 if (SignalMonitor::kDTVSigMon_WaitForPMT & flags)
00265 str += "PMT,";
00266 if (SignalMonitor::kDTVSigMon_WaitForMGT & flags)
00267 str += "MGT,";
00268 if (SignalMonitor::kDTVSigMon_WaitForVCT & flags)
00269 str += "VCT,";
00270 if (SignalMonitor::kDTVSigMon_WaitForNIT & flags)
00271 str += "NIT,";
00272 if (SignalMonitor::kDTVSigMon_WaitForSDT & flags)
00273 str += "SDT,";
00274 if (SignalMonitor::kDTVSigMon_WaitForSig & flags)
00275 str += "Sig,";
00276 if (SignalMonitor::kFWSigMon_WaitForPower& flags)
00277 str += "STB,";
00278 if (SignalMonitor::kDTVSigMon_WaitForCrypt & flags)
00279 str += "Crypt,";
00280
00281 if (SignalMonitor::kDVBSigMon_WaitForSNR & flags)
00282 str += "SNR,";
00283 if (SignalMonitor::kDVBSigMon_WaitForBER & flags)
00284 str += "BER,";
00285 if (SignalMonitor::kDVBSigMon_WaitForUB & flags)
00286 str += "UB,";
00287 if (SignalMonitor::kDVBSigMon_WaitForPos & flags)
00288 str += "Pos,";
00289
00290 str += ")";
00291 return str;
00292 }
00293
00294 inline bool SignalMonitor::IsRequired(const QString &cardtype)
00295 {
00296 return (CardUtil::IsDVBCardType(cardtype) ||
00297 (cardtype.upper() == "HDTV") ||
00298 (cardtype.upper() == "HDHOMERUN") ||
00299 (cardtype.upper() == "FIREWIRE") ||
00300 (cardtype.upper() == "FREEBOX"));
00301 }
00302
00303 inline bool SignalMonitor::IsSupported(const QString &cardtype)
00304 {
00305 return (IsRequired(cardtype) ||
00306 (cardtype.upper() == "V4L") ||
00307 (cardtype.upper() == "MPEG"));
00308 }
00309
00310
00311 #endif // SIGNALMONITOR_H