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
12#include "libmythupnp/ssdp.h"
13
14#include "cardutil.h"
15#include "satiputils.h"
16
17#define LOC QString("SatIP: ")
18
19namespace {
20 const QString SATIP_URI = "urn:ses-com:device:SatIPServer:1";
21 constexpr std::chrono::milliseconds SEARCH_TIME_MS { 3s };
22}
23
24QStringList 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
54QStringList 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
139QStringList 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
154QString 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
203int 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
270QString 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{
399 {
400 return "12";
401 }
403 {
404 return "23";
405 }
407 {
408 return "34";
409 }
411 {
412 return "35";
413 }
415 {
416 return "45";
417 }
419 {
420 return "56";
421 }
423 {
424 return "67";
425 }
427 {
428 return "78";
429 }
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}
INPUT_TYPES
all the different inputs
Definition: cardutil.h:50
static const int kTunerTypeDVBS2
static const int kTunerTypeDVBT
static const int kTunerTypeUnknown
static const int kTunerTypeDVBC
static const int kTunerTypeDVBS1
static const int kTunerTypeDVBT2
A QElapsedTimer based timer to replace use of QTime as a timer.
Definition: mythtimer.h:14
std::chrono::milliseconds elapsed(void)
Returns milliseconds elapsed since last start() or restart()
Definition: mythtimer.cpp:91
void start(void)
starts measuring elapsed time.
Definition: mythtimer.cpp:47
virtual int DecrRef(void)
Decrements reference count and deletes on 0.
uint Count(void) const
Definition: ssdpcache.h:50
void GetEntryMap(EntryMap &map)
Returns a copy of the EntryMap.
Definition: ssdpcache.cpp:87
static SSDPCacheEntries * Find(const QString &sURI)
Definition: ssdp.h:137
static SSDP * Instance()
Definition: ssdp.cpp:102
void PerformSearch(const QString &sST, std::chrono::seconds timeout=2s)
Definition: ssdp.cpp:251
static QString freq(uint64_t freq)
Definition: satiputils.cpp:270
static QString bw(DTVBandwidth bw)
Definition: satiputils.cpp:237
static QString msys(DTVModulationSystem msys)
Definition: satiputils.cpp:275
static int toTunerType(const QString &deviceid)
Definition: satiputils.cpp:203
static QStringList doUPNPsearch(bool loginfo)
Definition: satiputils.cpp:54
static QString tmode(DTVTransmitMode tmode)
Definition: satiputils.cpp:334
static QString findDeviceIP(const QString &deviceuuid)
Definition: satiputils.cpp:154
static QString ro(DTVRollOff ro)
Definition: satiputils.cpp:441
static QString gi(DTVGuardInterval gi)
Definition: satiputils.cpp:363
static QString mtype(DTVModulation mtype)
Definition: satiputils.cpp:301
static QStringList findServers(void)
Definition: satiputils.cpp:139
static CardUtil::INPUT_TYPES toDVBInputType(const QString &deviceid)
Definition: satiputils.cpp:171
static QString pol(DTVPolarity pol)
Definition: satiputils.cpp:462
static QString fec(DTVCodeRate fec)
Definition: satiputils.cpp:396
static QStringList probeDevices(void)
Definition: satiputils.cpp:24
UPnpDevice m_rootDevice
Definition: upnpdevice.h:158
NameValues m_lstExtra
Definition: upnpdevice.h:122
QString GetUDN(void) const
Definition: upnpdevice.cpp:780
static const std::array< const uint32_t, 4 > freq
Definition: element.cpp:45
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
constexpr std::chrono::milliseconds SEARCH_TIME_MS
Definition: satiputils.cpp:21
#define LOC
Definition: satiputils.cpp:17
QMap< QString, DeviceLocation * > EntryMap
Key == Unique Service Name (USN)
Definition: ssdpcache.h:34