00001
00002
00003
00004 #include <cerrno>
00005 #include <cstring>
00006
00007 #include <fcntl.h>
00008 #include <unistd.h>
00009 #ifndef USING_MINGW
00010 #include <sys/select.h>
00011 #endif
00012
00013 #include "mythlogging.h"
00014 #include "mythdbcon.h"
00015 #include "hdhrsignalmonitor.h"
00016 #include "atscstreamdata.h"
00017 #include "mpegtables.h"
00018 #include "atsctables.h"
00019
00020 #include "hdhrchannel.h"
00021 #include "hdhrrecorder.h"
00022 #include "hdhrstreamhandler.h"
00023
00024 #define LOC QString("HDHRSM(%1): ").arg(channel->GetDevice())
00025
00040 HDHRSignalMonitor::HDHRSignalMonitor(
00041 int db_cardnum, HDHRChannel* _channel, uint64_t _flags) :
00042 DTVSignalMonitor(db_cardnum, _channel, _flags),
00043 streamHandlerStarted(false), streamHandler(NULL)
00044 {
00045 LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor");
00046
00047 signalStrength.SetThreshold(45);
00048
00049 AddFlags(kSigMon_WaitForSig);
00050
00051 streamHandler = HDHRStreamHandler::Get(_channel->GetDevice());
00052 }
00053
00057 HDHRSignalMonitor::~HDHRSignalMonitor()
00058 {
00059 LOG(VB_CHANNEL, LOG_INFO, LOC + "dtor");
00060 Stop();
00061 HDHRStreamHandler::Return(streamHandler);
00062 }
00063
00067 void HDHRSignalMonitor::Stop(void)
00068 {
00069 LOG(VB_CHANNEL, LOG_INFO, LOC + "Stop() -- begin");
00070 SignalMonitor::Stop();
00071 if (GetStreamData())
00072 streamHandler->RemoveListener(GetStreamData());
00073 streamHandlerStarted = false;
00074
00075 LOG(VB_CHANNEL, LOG_INFO, LOC + "Stop() -- end");
00076 }
00077
00078 HDHRChannel *HDHRSignalMonitor::GetHDHRChannel(void)
00079 {
00080 return dynamic_cast<HDHRChannel*>(channel);
00081 }
00082
00089 void HDHRSignalMonitor::UpdateValues(void)
00090 {
00091 if (!running || exit)
00092 return;
00093
00094 if (streamHandlerStarted)
00095 {
00096 EmitStatus();
00097 if (IsAllGood())
00098 SendMessageAllGood();
00099
00100
00101
00102 update_done = true;
00103 return;
00104 }
00105
00106 struct hdhomerun_tuner_status_t status;
00107 streamHandler->GetTunerStatus(&status);
00108
00109 uint sig = status.signal_strength;
00110 uint snq = status.signal_to_noise_quality;
00111 uint seq = status.symbol_error_quality;
00112
00113 (void) snq;
00114 (void) seq;
00115
00116 LOG(VB_RECORD, LOG_DEBUG, LOC + "Tuner status: " + QString("'%1:%2:%3'")
00117 .arg(sig).arg(snq).arg(seq));
00118
00119
00120 bool isLocked = false;
00121 {
00122 QMutexLocker locker(&statusLock);
00123 signalStrength.SetValue(sig);
00124 signalLock.SetValue(status.lock_supported);
00125 isLocked = signalLock.IsGood();
00126 }
00127
00128 EmitStatus();
00129 if (IsAllGood())
00130 SendMessageAllGood();
00131
00132
00133
00134 if (isLocked && GetStreamData() &&
00135 HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT |
00136 kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT |
00137 kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT))
00138 {
00139 streamHandler->AddListener(GetStreamData());
00140 streamHandlerStarted = true;
00141 }
00142
00143 update_done = true;
00144 }