MythTV  master
satiputils.cpp
Go to the documentation of this file.
1 // C++
2 #include <chrono>
3 #include <thread>
4 
5 // Qt
6 #include <QString>
7 #include <QStringList>
8 
9 // MythTV headers
11 #include "libmythbase/mythtimer.h"
12 #include "libmythupnp/ssdp.h"
13 
14 #include "cardutil.h"
15 #include "satiputils.h"
16 
17 #define LOC QString("SatIP: ")
18 
19 namespace {
20  const QString SATIP_URI = "urn:ses-com:device:SatIPServer:1";
21  constexpr std::chrono::milliseconds SEARCH_TIME_MS { 3s };
22 }
23 
24 QStringList SatIP::probeDevices(void)
25 {
26  const std::chrono::milliseconds totalSearchTime = SEARCH_TIME_MS;
27  auto seconds = duration_cast<std::chrono::seconds>(totalSearchTime);
28 
29  LOG(VB_GENERAL, LOG_INFO, LOC + QString("Using UPNP to search for Sat>IP servers (%1 secs)")
30  .arg(seconds.count()));
31 
33 
34  MythTimer totalTime; totalTime.start();
35  MythTimer searchTime; searchTime.start();
36 
37  while (totalTime.elapsed() < totalSearchTime)
38  {
39  std::this_thread::sleep_for(25ms);
40  std::chrono::milliseconds ttl = totalSearchTime - totalTime.elapsed();
41  if (searchTime.elapsed() > 249ms && ttl > 1s)
42  {
43  auto ttl_s = duration_cast<std::chrono::seconds>(ttl);
44  LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("UPNP search %1 ms")
45  .arg(ttl_s.count()));
47  searchTime.start();
48  }
49  }
50 
51  return SatIP::doUPNPsearch(true);
52 }
53 
54 QStringList SatIP::doUPNPsearch(bool loginfo)
55 {
56  QStringList result;
57 
58  SSDPCacheEntries *satipservers = SSDP::Find(SATIP_URI);
59 
60  if (!satipservers)
61  {
62  LOG(VB_GENERAL, LOG_INFO, LOC + "No UPnP Sat>IP servers found");
63  return {};
64  }
65 
66  int count = satipservers->Count();
67  if (count > 0)
68  {
69  if (loginfo)
70  {
71  LOG(VB_GENERAL, LOG_INFO, LOC + QString("Found %1 possible Sat>IP servers").arg(count));
72  }
73  }
74  else
75  {
76  LOG(VB_GENERAL, LOG_ERR, LOC + "No UPnP Sat>IP servers found, but SSDP::Find() != NULL");
77  }
78 
79  EntryMap map;
80  satipservers->GetEntryMap(map);
81 
82  for (auto *BE : std::as_const(map))
83  {
84  QString friendlyName = BE->GetFriendlyName();
85  UPnpDeviceDesc *desc = BE->GetDeviceDesc();
86 
87  if (!desc)
88  {
89  LOG(VB_GENERAL, LOG_ERR, LOC + QString("GetDeviceDesc() failed for %1").arg(friendlyName));
90  continue;
91  }
92 
93  QString ip = desc->m_hostUrl.host();
94  QString id = desc->m_rootDevice.GetUDN();
95  QList<NameValue> extraAttribs = desc->m_rootDevice.m_lstExtra;
96 
97  for (const auto& attrib : extraAttribs)
98  {
99  if (attrib.m_sName == "satip:X_SATIPCAP")
100  {
101  QStringList caps = attrib.m_sValue.split(",");
102 
103  int tuner_id = 0;
104  for (const auto& cap : std::as_const(caps))
105  {
106  QStringList tuner = cap.split("-");
107 
108  if (tuner.size() != 2)
109  continue;
110 
111  int num_tuners = tuner.at(1).toInt();
112  for (int i = 0; i < num_tuners; i++)
113  {
114  QString device = QString("%1 %2 %3 %4 %5")
115  .arg(id,
116  friendlyName.remove(" "),
117  ip,
118  QString::number(tuner_id),
119  tuner.at(0));
120  result << device;
121  tuner_id++;
122  if (loginfo)
123  {
124  LOG(VB_GENERAL, LOG_INFO, LOC + QString("Found %1").arg(device));
125  }
126  }
127  }
128  }
129  }
130  BE->DecrRef();
131  }
132 
133  satipservers->DecrRef();
134  satipservers = nullptr;
135 
136  return result;
137 }
138 
139 QStringList SatIP::findServers(void)
140 {
141  QStringList devs;
142  SSDPCacheEntries *satipservers = SSDP::Find(SATIP_URI);
143  if (satipservers && satipservers->Count() > 0)
144  {
145  devs = SatIP::doUPNPsearch(false);
146  }
147  else
148  {
149  devs = SatIP::probeDevices();
150  }
151  return devs;
152 }
153 
154 QString SatIP::findDeviceIP(const QString& deviceuuid)
155 {
156  QStringList devs = SatIP::findServers();
157 
158  for (const auto& dev : std::as_const(devs))
159  {
160  QStringList devinfo = dev.split(" ");
161  const QString& id = devinfo.at(0);
162 
163  if (id.toUpper() == deviceuuid.toUpper())
164  {
165  return devinfo.at(2);
166  }
167  }
168  return nullptr;
169 }
170 
172 {
173  QStringList dev = deviceid.split(":");
174  if (dev.length() < 3)
175  {
177  }
178 
179  QString type = dev.at(2).toUpper();
180  if (type == "DVBC")
181  {
183  }
184  if (type == "DVBC2")
185  {
186  return CardUtil::INPUT_TYPES::DVBC; // DVB-C2 is not supported yet.
187  }
188  if (type == "DVBT")
189  {
191  }
192  if (type == "DVBT2")
193  {
195  }
196  if (type == "DVBS2")
197  {
199  }
201 }
202 
203 int SatIP::toTunerType(const QString& deviceid)
204 {
205  QStringList devinfo = deviceid.split(":");
206  if (devinfo.length() < 3)
207  {
209  }
210 
211  QString type = devinfo.at(2).toUpper();
212 
213  if (type.startsWith("DVBC")) // DVB-C2 is not supported yet.
214  {
216  }
217  if (type == "DVBT")
218  {
220  }
221  if (type == "DVBT2")
222  {
224  }
225  if (type == "DVBS")
226  {
228  }
229  if (type == "DVBS2")
230  {
232  }
233 
235 }
236 
238 {
240  {
241  return "5";
242  }
244  {
245  return "6";
246  }
248  {
249  return "7";
250  }
252  {
253  return "8";
254  }
256  {
257  return "10";
258  }
260  {
261  return "1.712";
262  }
264  {
265  return "auto";
266  }
267  return "auto";
268 }
269 
270 QString SatIP::freq(uint64_t freq)
271 {
272  return QString::number(freq / 1000000.0, 'f', 2);
273 }
274 
276 {
278  {
279  return "dvbs";
280  }
282  {
283  return "dvbs2";
284  }
286  {
287  return "dvbt";
288  }
290  {
291  return "dvbt2";
292  }
294  {
295  return "dvbc";
296  }
297  // Not supported yet: DVB-C2
298  return "auto";
299 }
300 
302 {
304  {
305  return "qpsk";
306  }
308  {
309  return "8psk";
310  }
312  {
313  return "16qam";
314  }
316  {
317  return "32qam";
318  }
320  {
321  return "64qam";
322  }
324  {
325  return "128qam";
326  }
328  {
329  return "256qam";
330  }
331  return "auto";
332 }
333 
335 {
337  {
338  return "2k";
339  }
341  {
342  return "4k";
343  }
345  {
346  return "8k";
347  }
349  {
350  return "1k";
351  }
353  {
354  return "16k";
355  }
357  {
358  return "32k";
359  }
360  return "auto";
361 }
362 
364 {
366  {
367  return "14";
368  }
370  {
371  return "18";
372  }
374  {
375  return "116";
376  }
378  {
379  return "132";
380  }
382  {
383  return "1128";
384  }
386  {
387  return "19128";
388  }
390  {
391  return "19256";
392  }
393  return "auto";
394 }
395 
397 {
398  if (fec == DTVCodeRate::kFEC_1_2)
399  {
400  return "12";
401  }
402  if (fec == DTVCodeRate::kFEC_2_3)
403  {
404  return "23";
405  }
406  if (fec == DTVCodeRate::kFEC_3_4)
407  {
408  return "34";
409  }
410  if (fec == DTVCodeRate::kFEC_3_5)
411  {
412  return "35";
413  }
414  if (fec == DTVCodeRate::kFEC_4_5)
415  {
416  return "45";
417  }
418  if (fec == DTVCodeRate::kFEC_5_6)
419  {
420  return "56";
421  }
422  if (fec == DTVCodeRate::kFEC_6_7)
423  {
424  return "67";
425  }
426  if (fec == DTVCodeRate::kFEC_7_8)
427  {
428  return "78";
429  }
430  if (fec == DTVCodeRate::kFEC_8_9)
431  {
432  return "89";
433  }
435  {
436  return "910";
437  }
438  return "auto";
439 }
440 
442 {
444  {
445  return "0.35";
446  }
448  {
449  return "0.20";
450  }
452  {
453  return "0.25";
454  }
456  {
457  return "auto";
458  }
459  return "auto";
460 }
461 
463 {
465  {
466  return "v";
467  }
469  {
470  return "h";
471  }
473  {
474  return "r";
475  }
477  {
478  return "l";
479  }
480  return "auto";
481 }
DTVRollOff::kRollOff_25
@ kRollOff_25
Definition: dtvconfparserhelpers.h:738
MythTimer::elapsed
std::chrono::milliseconds elapsed(void)
Returns milliseconds elapsed since last start() or restart()
Definition: mythtimer.cpp:91
DTVGuardInterval::kGuardInterval_1_16
@ kGuardInterval_1_16
Definition: dtvconfparserhelpers.h:499
DTVRollOff::kRollOff_20
@ kRollOff_20
Definition: dtvconfparserhelpers.h:737
DTVBandwidth
Definition: dtvconfparserhelpers.h:217
DTVCodeRate::kFEC_1_2
@ kFEC_1_2
Definition: dtvconfparserhelpers.h:292
DTVTunerType::kTunerTypeDVBC
static const int kTunerTypeDVBC
Definition: dtvconfparserhelpers.h:95
DTVModulation::kModulationQAM256
@ kModulationQAM256
Definition: dtvconfparserhelpers.h:363
ReferenceCounter::DecrRef
virtual int DecrRef(void)
Decrements reference count and deletes on 0.
Definition: referencecounter.cpp:124
DTVPolarity::kPolarityLeft
@ kPolarityLeft
Definition: dtvconfparserhelpers.h:617
DTVTransmitMode::kTransmissionMode2K
@ kTransmissionMode2K
Definition: dtvconfparserhelpers.h:435
SSDP::PerformSearch
void PerformSearch(const QString &sST, std::chrono::seconds timeout=2s)
Definition: ssdp.cpp:251
MythTimer
A QElapsedTimer based timer to replace use of QTime as a timer.
Definition: mythtimer.h:13
DTVModulationSystem::kModulationSystem_DVBT
@ kModulationSystem_DVBT
Definition: dtvconfparserhelpers.h:659
SatIP::ro
static QString ro(DTVRollOff ro)
Definition: satiputils.cpp:441
DTVGuardInterval::kGuardInterval_1_128
@ kGuardInterval_1_128
Definition: dtvconfparserhelpers.h:503
ssdp.h
DTVModulationSystem::kModulationSystem_DVBS2
@ kModulationSystem_DVBS2
Definition: dtvconfparserhelpers.h:662
DTVTunerType::kTunerTypeDVBS1
static const int kTunerTypeDVBS1
Definition: dtvconfparserhelpers.h:93
DTVCodeRate::kFEC_7_8
@ kFEC_7_8
Definition: dtvconfparserhelpers.h:298
DTVTransmitMode::kTransmissionMode4K
@ kTransmissionMode4K
Definition: dtvconfparserhelpers.h:438
CardUtil::INPUT_TYPES::DVBS2
@ DVBS2
freq
static const std::array< const uint32_t, 4 > freq
Definition: element.cpp:45
SatIP::bw
static QString bw(DTVBandwidth bw)
Definition: satiputils.cpp:237
UPnpDeviceDesc
Definition: upnpdevice.h:151
DTVTransmitMode::kTransmissionMode8K
@ kTransmissionMode8K
Definition: dtvconfparserhelpers.h:436
DTVTransmitMode::kTransmissionMode32K
@ kTransmissionMode32K
Definition: dtvconfparserhelpers.h:441
DTVGuardInterval::kGuardInterval_19_128
@ kGuardInterval_19_128
Definition: dtvconfparserhelpers.h:504
SSDP::Find
static SSDPCacheEntries * Find(const QString &sURI)
Definition: ssdp.h:134
DTVTransmitMode::kTransmissionMode16K
@ kTransmissionMode16K
Definition: dtvconfparserhelpers.h:440
DTVCodeRate::kFEC_3_5
@ kFEC_3_5
Definition: dtvconfparserhelpers.h:301
MythTimer::start
void start(void)
starts measuring elapsed time.
Definition: mythtimer.cpp:47
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
DTVBandwidth::kBandwidth10MHz
@ kBandwidth10MHz
Definition: dtvconfparserhelpers.h:233
SatIP::tmode
static QString tmode(DTVTransmitMode tmode)
Definition: satiputils.cpp:334
SSDPCacheEntries::GetEntryMap
void GetEntryMap(EntryMap &map)
Returns a copy of the EntryMap.
Definition: ssdpcache.cpp:87
DTVGuardInterval::kGuardInterval_19_256
@ kGuardInterval_19_256
Definition: dtvconfparserhelpers.h:505
anonymous_namespace{satiputils.cpp}::SEARCH_TIME_MS
constexpr std::chrono::milliseconds SEARCH_TIME_MS
Definition: satiputils.cpp:21
SatIP::doUPNPsearch
static QStringList doUPNPsearch(bool loginfo)
Definition: satiputils.cpp:54
DTVGuardInterval
Definition: dtvconfparserhelpers.h:487
DTVCodeRate::kFEC_2_3
@ kFEC_2_3
Definition: dtvconfparserhelpers.h:293
SatIP::findDeviceIP
static QString findDeviceIP(const QString &deviceuuid)
Definition: satiputils.cpp:154
DTVCodeRate
Definition: dtvconfparserhelpers.h:280
DTVBandwidth::kBandwidthAuto
@ kBandwidthAuto
Definition: dtvconfparserhelpers.h:231
satiputils.h
SSDP::Instance
static SSDP * Instance()
Definition: ssdp.cpp:102
DTVGuardInterval::kGuardInterval_1_8
@ kGuardInterval_1_8
Definition: dtvconfparserhelpers.h:500
UPnpDeviceDesc::m_rootDevice
UPnpDevice m_rootDevice
Definition: upnpdevice.h:155
DTVBandwidth::kBandwidth8MHz
@ kBandwidth8MHz
Definition: dtvconfparserhelpers.h:228
mythlogging.h
SatIP::probeDevices
static QStringList probeDevices(void)
Definition: satiputils.cpp:24
DTVGuardInterval::kGuardInterval_1_4
@ kGuardInterval_1_4
Definition: dtvconfparserhelpers.h:501
DTVRollOff::kRollOff_35
@ kRollOff_35
Definition: dtvconfparserhelpers.h:736
DTVBandwidth::kBandwidth7MHz
@ kBandwidth7MHz
Definition: dtvconfparserhelpers.h:229
DTVModulation::kModulationQAM16
@ kModulationQAM16
Definition: dtvconfparserhelpers.h:359
UPnpDevice::m_lstExtra
NameValues m_lstExtra
Definition: upnpdevice.h:119
DTVTunerType::kTunerTypeUnknown
static const int kTunerTypeUnknown
Definition: dtvconfparserhelpers.h:103
CardUtil::INPUT_TYPES::DVBC
@ DVBC
LOC
#define LOC
Definition: satiputils.cpp:17
SatIP::toTunerType
static int toTunerType(const QString &deviceid)
Definition: satiputils.cpp:203
DTVTransmitMode
Definition: dtvconfparserhelpers.h:424
SatIP::findServers
static QStringList findServers(void)
Definition: satiputils.cpp:139
DTVModulation::kModulationQAM32
@ kModulationQAM32
Definition: dtvconfparserhelpers.h:360
EntryMap
QMap< QString, DeviceLocation * > EntryMap
Key == Unique Service Name (USN)
Definition: ssdpcache.h:31
SatIP::toDVBInputType
static CardUtil::INPUT_TYPES toDVBInputType(const QString &deviceid)
Definition: satiputils.cpp:171
UPnpDeviceDesc::m_hostUrl
QUrl m_hostUrl
Definition: upnpdevice.h:157
SatIP::freq
static QString freq(uint64_t freq)
Definition: satiputils.cpp:270
SatIP::gi
static QString gi(DTVGuardInterval gi)
Definition: satiputils.cpp:363
DTVPolarity::kPolarityVertical
@ kPolarityVertical
Definition: dtvconfparserhelpers.h:614
DTVRollOff::kRollOff_Auto
@ kRollOff_Auto
Definition: dtvconfparserhelpers.h:739
SSDPCacheEntries
Definition: ssdpcache.h:37
DTVCodeRate::kFEC_9_10
@ kFEC_9_10
Definition: dtvconfparserhelpers.h:302
SatIP::pol
static QString pol(DTVPolarity pol)
Definition: satiputils.cpp:462
DTVCodeRate::kFEC_5_6
@ kFEC_5_6
Definition: dtvconfparserhelpers.h:296
DTVTunerType::kTunerTypeDVBS2
static const int kTunerTypeDVBS2
Definition: dtvconfparserhelpers.h:94
DTVModulationSystem::kModulationSystem_DVBS
@ kModulationSystem_DVBS
Definition: dtvconfparserhelpers.h:661
DTVModulation::kModulationQAM128
@ kModulationQAM128
Definition: dtvconfparserhelpers.h:362
DTVCodeRate::kFEC_3_4
@ kFEC_3_4
Definition: dtvconfparserhelpers.h:294
DTVCodeRate::kFEC_4_5
@ kFEC_4_5
Definition: dtvconfparserhelpers.h:295
anonymous_namespace{satiputils.cpp}::SATIP_URI
const QString SATIP_URI
Definition: satiputils.cpp:20
DTVModulationSystem
Definition: dtvconfparserhelpers.h:644
cardutil.h
CardUtil::INPUT_TYPES::DVBT2
@ DVBT2
DTVModulationSystem::kModulationSystem_DVBT2
@ kModulationSystem_DVBT2
Definition: dtvconfparserhelpers.h:672
DTVModulationSystem::kModulationSystem_DVBC_ANNEX_A
@ kModulationSystem_DVBC_ANNEX_A
Definition: dtvconfparserhelpers.h:657
DTVPolarity::kPolarityRight
@ kPolarityRight
Definition: dtvconfparserhelpers.h:616
DTVCodeRate::kFEC_8_9
@ kFEC_8_9
Definition: dtvconfparserhelpers.h:299
SatIP::fec
static QString fec(DTVCodeRate fec)
Definition: satiputils.cpp:396
mythtimer.h
DTVCodeRate::kFEC_6_7
@ kFEC_6_7
Definition: dtvconfparserhelpers.h:297
CardUtil::INPUT_TYPES::ERROR_UNKNOWN
@ ERROR_UNKNOWN
DTVGuardInterval::kGuardInterval_1_32
@ kGuardInterval_1_32
Definition: dtvconfparserhelpers.h:498
DTVTunerType::kTunerTypeDVBT
static const int kTunerTypeDVBT
Definition: dtvconfparserhelpers.h:96
CardUtil::INPUT_TYPES
INPUT_TYPES
all the different inputs
Definition: cardutil.h:49
DTVModulation::kModulationQAM64
@ kModulationQAM64
Definition: dtvconfparserhelpers.h:361
UPnpDevice::GetUDN
QString GetUDN(void) const
Definition: upnpdevice.cpp:782
SSDPCacheEntries::Count
uint Count(void) const
Definition: ssdpcache.h:47
SatIP::msys
static QString msys(DTVModulationSystem msys)
Definition: satiputils.cpp:275
DTVTransmitMode::kTransmissionMode1K
@ kTransmissionMode1K
Definition: dtvconfparserhelpers.h:439
DTVTunerType::kTunerTypeDVBT2
static const int kTunerTypeDVBT2
Definition: dtvconfparserhelpers.h:97
SatIP::mtype
static QString mtype(DTVModulation mtype)
Definition: satiputils.cpp:301
DTVBandwidth::kBandwidth5MHz
@ kBandwidth5MHz
Definition: dtvconfparserhelpers.h:232
DTVModulation::kModulationQPSK
@ kModulationQPSK
Definition: dtvconfparserhelpers.h:358
DTVBandwidth::kBandwidth1712kHz
@ kBandwidth1712kHz
Definition: dtvconfparserhelpers.h:234
DTVModulation::kModulation8PSK
@ kModulation8PSK
Definition: dtvconfparserhelpers.h:367
DTVBandwidth::kBandwidth6MHz
@ kBandwidth6MHz
Definition: dtvconfparserhelpers.h:230
DTVPolarity
Definition: dtvconfparserhelpers.h:605
DTVModulation
Definition: dtvconfparserhelpers.h:347
DTVPolarity::kPolarityHorizontal
@ kPolarityHorizontal
Definition: dtvconfparserhelpers.h:615
DTVRollOff
Definition: dtvconfparserhelpers.h:725
CardUtil::INPUT_TYPES::DVBT
@ DVBT