MythTV  master
ExternalSignalMonitor.cpp
Go to the documentation of this file.
1 // -*- Mode: c++ -*-
2 
3 #include <cerrno>
4 #include <cstring>
5 
6 #include <fcntl.h>
7 #include <unistd.h>
8 #if !defined(USING_MINGW) && !defined(_WIN32)
9 #include <sys/select.h>
10 #endif
11 
12 #include "libmythbase/mythdbcon.h"
14 
15 #include "ExternalChannel.h"
16 #include "ExternalRecorder.h"
17 #include "ExternalSignalMonitor.h"
18 #include "ExternalStreamHandler.h"
19 #include "mpeg/atscstreamdata.h"
20 #include "mpeg/atsctables.h"
21 #include "mpeg/mpegtables.h"
22 
23 #define LOC QString("ExternSigMon[%1](%2): ").arg(m_inputid).arg(m_loc)
24 
40  ExternalChannel *_channel,
41  bool _release_stream,
42  uint64_t _flags)
43  : DTVSignalMonitor(db_cardnum, _channel, _release_stream, _flags)
44 {
45  LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor");
50  {
51  LOG(VB_GENERAL, LOG_ERR, LOC + "Open failed");
52  if (m_streamHandler)
54  }
55  else
56  {
58  }
59 
61  if (channel && channel->IsBackgroundTuning())
63 }
64 
69 {
70  LOG(VB_CHANNEL, LOG_INFO, LOC + "dtor");
72  if (m_streamHandler)
74 }
75 
80 {
81  LOG(VB_CHANNEL, LOG_INFO, LOC + "Stop() -- begin");
82 
84  if (GetStreamData())
85  {
88  }
89  m_streamHandlerStarted = false;
90 
91  LOG(VB_CHANNEL, LOG_INFO, LOC + "Stop() -- end");
92 }
93 
101 {
102  if (!m_running || m_exit)
103  return;
104 
105  ExternalChannel *channel = GetExternalChannel();
106  if (channel == nullptr)
107  return;
108 
109  if (channel->IsExternalChannelChangeInUse())
110  {
112 
113  QMutexLocker locker(&m_statusLock);
114  if (!m_scriptStatus.IsGood())
115  return;
116  }
117 
118  if (channel->IsBackgroundTuning())
119  {
120  QMutexLocker locker(&m_statusLock);
121  if (m_scriptStatus.GetValue() < 2)
123 
124  if (!m_scriptStatus.IsGood())
125  return;
126  }
127 
129  {
130  if (!m_streamHandler->IsRunning())
131  {
132  m_error = QObject::tr("Error: stream handler died");
133  LOG(VB_CHANNEL, LOG_ERR, LOC + m_error);
134  m_updateDone = true;
135  return;
136  }
137 
138  EmitStatus();
139  if (IsAllGood())
141 
142  m_updateDone = true;
143  return;
144  }
145 
147 
148  int strength = GetSignalStrengthPercent();
149  bool is_locked = HasLock();
150 
151  // Set SignalMonitorValues
152  {
153  QMutexLocker locker(&m_statusLock);
154  m_signalStrength.SetValue(strength);
155  m_signalLock.SetValue(static_cast<int>(is_locked));
156  }
157 
158  EmitStatus();
159  if (IsAllGood())
161 
162  // Start table monitoring if we are waiting on any table
163  // and we have a lock.
164  if (is_locked && GetStreamData() &&
168  {
170  {
173  m_streamHandlerStarted = true;
174  }
175  }
176 
177  m_updateDone = true;
178 }
179 
181 {
182  QString result;
183 
184  m_streamHandler->ProcessCommand("HasLock?", result);
185  if (result.startsWith("OK:"))
186  {
187  return result.mid(3, 3) == "Yes";
188  }
189  LOG(VB_CHANNEL, LOG_ERR, LOC + QString
190  ("HasLock: invalid response '%1'").arg(result));
191  if (!result.startsWith("WARN"))
192  m_error = QString("HasLock: invalid response '%1'").arg(result);
193  return false;
194 }
195 
197 {
198  QString result;
199 
200  m_streamHandler->ProcessCommand("SignalStrengthPercent?", result);
201  if (result.startsWith("OK:"))
202  {
203  bool ok = false;
204  int percent = result.mid(3).toInt(&ok);
205  if (!ok)
206  {
207  LOG(VB_CHANNEL, LOG_ERR, LOC + QString
208  ("GetSignalStrengthPercent: invalid response '%1'")
209  .arg(result));
210  return -1;
211  }
212  return percent;
213  }
214  LOG(VB_CHANNEL, LOG_ERR, LOC + QString
215  ("GetSignalStrengthPercent: invalid response '%1'").arg(result));
216  if (!result.startsWith("WARN"))
217  m_error = QString("GetSignalStrengthPercent: invalid response '%1'")
218  .arg(result);
219  return -1;
220 }
221 
222 std::chrono::seconds ExternalSignalMonitor::GetLockTimeout(void)
223 {
224  QString result;
225 
226  m_streamHandler->ProcessCommand("LockTimeout?", result, 10s);
227  if (result.startsWith("OK:"))
228  {
229  bool ok = false;
230  auto timeout = std::chrono::seconds(result.mid(3).toInt(&ok));
231  if (!ok)
232  {
233  LOG(VB_CHANNEL, LOG_ERR, LOC + QString
234  ("GetLockTimeout: invalid response '%1'")
235  .arg(result));
236  return -1s;
237  }
238  return timeout;
239  }
240  LOG(VB_CHANNEL, LOG_ERR, LOC + QString
241  ("GetLockTimeout: invalid response '%1'").arg(result));
242  if (!result.startsWith("WARN"))
243  m_error = QString("GetLockTimeout: invalid response '%1'").arg(result);
244  return -1s;
245 }
DTVSignalMonitor::AddFlags
void AddFlags(uint64_t _flags) override
Definition: dtvsignalmonitor.cpp:140
hardwareprofile.smolt.timeout
float timeout
Definition: smolt.py:102
ExternalRecorder.h
SignalMonitorValue::SetValue
void SetValue(int _value)
Definition: signalmonitorvalue.h:74
StreamHandler::HasError
bool HasError(void) const
Definition: streamhandler.h:65
SignalMonitor::m_channel
ChannelBase * m_channel
Definition: signalmonitor.h:201
SignalMonitor::kDTVSigMon_WaitForMGT
static const uint64_t kDTVSigMon_WaitForMGT
Definition: signalmonitor.h:181
ExternalSignalMonitor::m_lockTimeout
std::chrono::milliseconds m_lockTimeout
Definition: ExternalSignalMonitor.h:46
SignalMonitor::m_exit
volatile bool m_exit
Definition: signalmonitor.h:225
mythdbcon.h
ExternalStreamHandler::StopStreaming
bool StopStreaming(void)
Definition: ExternalStreamHandler.cpp:1183
DTVSignalMonitor::GetStreamData
MPEGStreamData * GetStreamData()
Returns the MPEG stream data if it exists.
Definition: dtvsignalmonitor.h:59
atscstreamdata.h
ExternalChannel::IsBackgroundTuning
bool IsBackgroundTuning(void) const
Definition: ExternalChannel.h:51
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
SignalMonitor::m_running
volatile bool m_running
Definition: signalmonitor.h:224
ExternalSignalMonitor.h
ExternalStreamHandler.h
SignalMonitor::HasAnyFlag
bool HasAnyFlag(uint64_t _flags) const
Definition: signalmonitor.cpp:280
SignalMonitor::kSigMon_WaitForSig
static const uint64_t kSigMon_WaitForSig
Definition: signalmonitor.h:185
SignalMonitor::m_error
QString m_error
Definition: signalmonitor.h:214
ExternalSignalMonitor::GetSignalStrengthPercent
int GetSignalStrengthPercent(void)
Definition: ExternalSignalMonitor.cpp:196
StreamHandler::RemoveListener
virtual void RemoveListener(MPEGStreamData *data)
Definition: streamhandler.cpp:80
SignalMonitor::m_statusLock
QRecursiveMutex m_statusLock
Definition: signalmonitor.h:227
SignalMonitor::m_scriptStatus
SignalMonitorValue m_scriptStatus
Definition: signalmonitor.h:218
SignalMonitorValue::GetValue
int GetValue() const
Returns the value.
Definition: signalmonitorvalue.h:40
ExternalSignalMonitor::~ExternalSignalMonitor
~ExternalSignalMonitor() override
Stops signal monitoring and table monitoring threads.
Definition: ExternalSignalMonitor.cpp:68
SignalMonitor::m_signalStrength
SignalMonitorValue m_signalStrength
Definition: signalmonitor.h:217
mythlogging.h
SignalMonitor::m_inputid
int m_inputid
Definition: signalmonitor.h:203
LOC
#define LOC
Definition: ExternalSignalMonitor.cpp:23
ExternalSignalMonitor::GetLockTimeout
std::chrono::seconds GetLockTimeout(void)
Definition: ExternalSignalMonitor.cpp:222
SignalMonitor::m_signalLock
SignalMonitorValue m_signalLock
Definition: signalmonitor.h:216
SignalMonitor::SendMessageAllGood
void SendMessageAllGood(void)
Definition: signalmonitor.cpp:465
SignalMonitor::kDTVSigMon_WaitForPMT
static const uint64_t kDTVSigMon_WaitForPMT
Definition: signalmonitor.h:180
SignalMonitor::kDTVSigMon_WaitForPAT
static const uint64_t kDTVSigMon_WaitForPAT
Definition: signalmonitor.h:179
SignalMonitor::m_updateDone
bool m_updateDone
Definition: signalmonitor.h:208
SignalMonitor::kDTVSigMon_WaitForNIT
static const uint64_t kDTVSigMon_WaitForNIT
Definition: signalmonitor.h:183
SignalMonitor::EmitStatus
virtual void EmitStatus(void)
Definition: signalmonitor.cpp:472
SignalMonitor::kDTVSigMon_WaitForSDT
static const uint64_t kDTVSigMon_WaitForSDT
Definition: signalmonitor.h:184
SignalMonitor::UpdateValues
virtual void UpdateValues(void)
This should be overridden to actually do signal monitoring.
Definition: signalmonitor.cpp:456
ChannelBase::IsExternalChannelChangeInUse
virtual bool IsExternalChannelChangeInUse(void)
Definition: channelbase.cpp:844
ExternalStreamHandler::Get
static ExternalStreamHandler * Get(const QString &devname, int inputid, int majorid)
Definition: ExternalStreamHandler.cpp:464
mpegtables.h
ExternalChannel
-*- Mode: c++ -*-
Definition: ExternalChannel.h:20
ExternalStreamHandler::StartStreaming
bool StartStreaming(void)
Definition: ExternalStreamHandler.cpp:1133
SignalMonitorValue::IsGood
bool IsGood() const
Returns true if the value is equal to the threshold, or on the right side of the threshold (depends o...
Definition: signalmonitorvalue.h:56
ExternalSignalMonitor::HasLock
bool HasLock(void)
Definition: ExternalSignalMonitor.cpp:180
ExternalChannel::GetTuneStatus
uint GetTuneStatus(void)
Definition: ExternalChannel.cpp:216
ExternalChannel.h
ExternalSignalMonitor::GetExternalChannel
ExternalChannel * GetExternalChannel(void)
Definition: ExternalSignalMonitor.h:33
ExternalStreamHandler::ProcessCommand
bool ProcessCommand(const QString &cmd, QString &result, std::chrono::milliseconds timeout=4s, uint retry_cnt=3)
Definition: ExternalStreamHandler.cpp:1242
DTVSignalMonitor
This class is intended to detect the presence of needed tables.
Definition: dtvsignalmonitor.h:14
ChannelBase::GetInputID
virtual int GetInputID(void) const
Definition: channelbase.h:67
ExternalSignalMonitor::UpdateValues
void UpdateValues(void) override
Fills in frontend stats and emits status Qt signals.
Definition: ExternalSignalMonitor.cpp:100
atsctables.h
ChannelBase::GetDevice
virtual QString GetDevice(void) const
Returns String representing device, useful for debugging.
Definition: channelbase.h:78
ExternalSignalMonitor::m_streamHandlerStarted
bool m_streamHandlerStarted
Definition: ExternalSignalMonitor.h:45
StreamHandler::AddListener
virtual void AddListener(MPEGStreamData *data, bool allow_section_reader=false, bool needs_buffering=false, const QString &output_file=QString())
Definition: streamhandler.cpp:35
ExternalSignalMonitor::m_streamHandler
ExternalStreamHandler * m_streamHandler
Definition: ExternalSignalMonitor.h:44
ExternalSignalMonitor::Stop
void Stop(void) override
Stop signal monitoring and table monitoring threads.
Definition: ExternalSignalMonitor.cpp:79
StreamHandler::IsRunning
bool IsRunning(void) const
Definition: streamhandler.cpp:163
SignalMonitor::Stop
virtual void Stop()
Stop signal monitoring thread.
Definition: signalmonitor.cpp:304
ChannelBase::GetMajorID
int GetMajorID(void)
Definition: channelbase.cpp:860
DTVSignalMonitor::IsAllGood
bool IsAllGood(void) const override
Definition: dtvsignalmonitor.cpp:585
ExternalStreamHandler::Return
static void Return(ExternalStreamHandler *&ref, int inputid)
Definition: ExternalStreamHandler.cpp:495
ExternalSignalMonitor::ExternalSignalMonitor
ExternalSignalMonitor(void)
SignalMonitor::kDTVSigMon_WaitForVCT
static const uint64_t kDTVSigMon_WaitForVCT
Definition: signalmonitor.h:182