12 #include <sys/select.h>
13 #include <sys/ioctl.h>
17 #include <QCoreApplication>
31 #define LOC QString("CetonSH[%1](%2): ").arg(m_inputId).arg(m_device)
43 QString devkey = devname.toUpper();
45 QMap<QString,CetonStreamHandler*>::iterator it =
s_handlers.find(devkey);
54 LOG(VB_RECORD, LOG_INFO,
55 QString(
"CetonSH[%1]: Creating new stream handler %2 for %3")
56 .arg(QString::number(inputid), devkey, devname));
62 LOG(VB_RECORD, LOG_INFO,
63 QString(
"CetonSH[%1]: Using existing stream handler %2 for %3")
64 .arg(QString::number(inputid), devkey, devname) +
65 QString(
" (%1 in use)").arg(rcount));
81 QMap<QString,CetonStreamHandler*>::iterator it =
s_handlers.find(devname);
92 LOG(VB_RECORD, LOG_INFO, QString(
"CetonSH[%1]: Closing handler for %2")
93 .arg(inputid).arg(devname));
100 LOG(VB_GENERAL, LOG_ERR,
101 QString(
"CetonSH[%1] Error: Couldn't find handler for %2")
102 .arg(inputid).arg(devname));
111 "", 0,
"", 0), inputid)
115 QStringList parts = device.split(
"-");
116 if (parts.size() != 2)
118 LOG(VB_GENERAL, LOG_ERR,
LOC +
119 QString(
"Invalid device id %1").arg(
m_device));
124 QStringList tuner_parts = parts.at(1).split(
".");
125 if (tuner_parts.size() == 2)
127 m_card = tuner_parts.at(0).toUInt();
128 m_tuner = tuner_parts.at(1).toUInt();
132 LOG(VB_GENERAL, LOG_ERR,
LOC +
133 QString(
"Invalid device id %1").arg(
m_device));
137 if (
GetVar(
"diag",
"Host_IP_Address") ==
"")
139 LOG(VB_GENERAL, LOG_ERR,
LOC +
140 "Ceton tuner does not seem to be available at IP");
145 QString url = QString(
"rtsp://%1:%2/cetonmpeg%3")
152 QString cardstatus =
GetVar(
"cas",
"CardStatus");
157 QString sernum =
GetVar(
"diag",
"Host_Serial_Number");
158 QString firmware_ver =
GetVar(
"diag",
"Host_Firmware");
159 QString hardware_ver =
GetVar(
"diag",
"Hardware_Revision");
161 LOG(VB_RECORD, LOG_INFO,
LOC +
162 QString(
"Ceton device %1 initialized. SN: %2, "
163 "Firmware ver. %3, Hardware ver. %4")
164 .arg(
m_ipAddress, sernum, firmware_ver, hardware_ver));
168 QString brand =
GetVar(
"cas",
"CardManufacturer");
169 QString
auth =
GetVar(
"cas",
"CardAuthorization");
171 LOG(VB_RECORD, LOG_INFO,
LOC +
172 QString(
"Cable card installed (%1) - %2").arg(brand,
auth));
176 LOG(VB_RECORD, LOG_INFO,
LOC +
177 "Cable card NOT installed (operating in QAM tuner mode)");
213 LOG(VB_RECORD, LOG_INFO,
LOC +
214 "Ignoring request - video streaming active");
232 uint prog =
GetVar(
"mux",
"ProgramNumber").toUInt();
235 LOG(VB_RECORD, LOG_WARNING,
LOC +
236 "VerifyTuning detected program = 0");
242 uint frequency =
GetVar(
"tuner",
"Frequency").toUInt();
245 LOG(VB_RECORD, LOG_WARNING,
LOC +
246 "VerifyTuning detected wrong frequency");
250 QString modulation =
GetVar(
"tuner",
"Modulation");
253 LOG(VB_RECORD, LOG_WARNING,
LOC +
254 "VerifyTuning detected wrong modulation");
258 uint program =
GetVar(
"mux",
"ProgramNumber").toUInt();
261 LOG(VB_RECORD, LOG_WARNING,
LOC +
262 "VerifyTuning detected wrong program");
267 QString carrier_lock =
GetVar(
"tuner",
"CarrierLock");
268 if (carrier_lock !=
"1")
270 LOG(VB_RECORD, LOG_WARNING,
LOC +
271 "VerifyTuning detected no carrier lock");
275 QString pcr_lock =
GetVar(
"tuner",
"PCRLock");
278 LOG(VB_RECORD, LOG_WARNING,
LOC +
279 "VerifyTuning detected no PCR lock");
311 uint frequency,
const QString &modulation)
313 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"TuneFrequency(%1, %2)")
314 .arg(frequency).arg(modulation));
316 if (frequency >= 100000000)
319 QString modulation_id = (modulation ==
"qam_256") ?
"2" :
320 (modulation ==
"qam_64") ?
"0" :
321 (modulation ==
"ntsc-m") ?
"4" :
322 (modulation ==
"8vsb") ?
"6" :
324 if (modulation_id ==
"")
331 params.addQueryItem(
"instance_id", QString::number(
m_tuner));
332 params.addQueryItem(
"frequency", QString::number(frequency));
333 params.addQueryItem(
"modulation",modulation_id);
334 params.addQueryItem(
"tuner",
"1");
335 params.addQueryItem(
"demod",
"1");
336 params.addQueryItem(
"rst_chnl",
"0");
337 params.addQueryItem(
"force_tune",
"0");
342 "POST",
"/tune_request.cgi", params, response, status);
346 LOG(VB_GENERAL, LOG_ERR,
LOC +
347 QString(
"TuneFrequency() - HTTP status = %1 - response = %2")
348 .arg(status).arg(response));
356 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"TuneProgram(%1)").arg(program));
359 if (!program_list.contains(QString::number(program)))
361 LOG(VB_GENERAL, LOG_ERR,
LOC +
362 QString(
"TuneProgram(%1) - Requested program not in the program list")
371 params.addQueryItem(
"instance_id", QString::number(
m_tuner));
372 params.addQueryItem(
"program", QString::number(program));
377 "POST",
"/program_request.cgi", params, response, status);
381 LOG(VB_GENERAL, LOG_ERR,
LOC +
382 QString(
"TuneProgram() - HTTP status = %1 - response = %2")
383 .arg(status).arg(response));
391 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"PerformTuneVChannel(%1)")
395 params.addQueryItem(
"instance_id", QString::number(
m_tuner));
396 params.addQueryItem(
"channel", vchannel);
401 "POST",
"/channel_request.cgi", params, response, status);
405 LOG(VB_GENERAL, LOG_ERR,
LOC +
406 QString(
"PerformTuneVChannel() - HTTP status = %1 - response = %2")
407 .arg(status).arg(response));
416 if (
GetVar(
"cas",
"VirtualChannelNumber") == vchannel)
418 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"Not Re-Tuning channel %1")
426 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"TuneVChannel(%1)").arg(vchannel));
435 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"ClearProgramNumber()"));
437 for(
int i=0; i<50; i++)
439 if (
GetVar(
"mux",
"ProgramNumber") ==
"0")
444 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Program number failed to clear");
449 for(
int i = 1; i <= 30; i++)
451 QString prog =
GetVar(
"mux",
"ProgramNumber");
452 LOG(VB_RECORD, LOG_INFO,
LOC +
453 QString(
"GetProgramNumber() got %1 on attempt %2")
456 uint prognum = prog.toUInt();
463 LOG(VB_GENERAL, LOG_ERR,
LOC +
464 "GetProgramNumber() failed to get a non-zero program number");
470 const QString §ion,
const QString &variable)
const
472 QString loc =
LOC + QString(
"DoGetVar(%1,%2,%3,%4) - ")
476 params.addQueryItem(
"i", QString::number(
m_tuner));
477 params.addQueryItem(
"s", section);
478 params.addQueryItem(
"v", variable);
482 if (!
HttpRequest(
"GET",
"/get_var.json", params, response, status))
484 LOG(VB_GENERAL, LOG_ERR, loc +
485 QString(
"HttpRequest failed - %1").arg(response));
489 static const QRegularExpression regex {
"^\\{ \"?result\"?: \"(.*)\" \\}$"};
490 auto match = regex.match(response);
491 if (!match.hasMatch())
493 LOG(VB_GENERAL, LOG_ERR, loc +
494 QString(
"unexpected http response: -->%1<--").arg(response));
498 QString result = match.captured(1);
499 LOG(VB_RECORD, LOG_DEBUG, loc + QString(
"got: -->%1<--").arg(result));
505 QString loc =
LOC + QString(
"CetonHTTP: DoGetProgramList(%1,%2) - ")
509 params.addQueryItem(
"i", QString::number(
m_tuner));
513 if (!
HttpRequest(
"GET",
"/get_pat.json", params, response, status))
515 LOG(VB_GENERAL, LOG_ERR,
516 loc + QString(
"HttpRequest failed - %1").arg(response));
520 static const QRegularExpression regex(
521 R
"(^\{ "?length"?: \d+(, "?results"?: \[ (.*) \])? \}$)");
523 auto match = regex.match(response);
524 if (!match.hasMatch())
526 LOG(VB_GENERAL, LOG_ERR,
527 loc + QString(
"returned unexpected output: -->%1<--")
532 LOG(VB_RECORD, LOG_DEBUG, loc + QString(
"got: -->%1<--")
533 .arg(match.captured(2)));
534 return match.captured(2).split(
", ");
538 const QString &method,
const QString &script,
539 const QUrlQuery ¶ms,
540 QString &response,
uint &status_code)
const
543 auto *request =
new QNetworkRequest();
547 url.setScheme(
"http");
555 request->setAttribute(QNetworkRequest::CacheLoadControlAttribute,
556 QNetworkRequest::AlwaysNetwork);
560 url.setQuery(params);
561 request->setUrl(url);
562 if (
manager->download(request, &data))
564 response = QString(data);
569 response =
"Download failed";
573 if (
"POST" == method)
575 request->setUrl(url);
576 request->setHeader(QNetworkRequest::ContentTypeHeader,
577 "application/x-www-form-urlencoded");
578 data = params.query(QUrl::FullyEncoded).toUtf8();
581 if (
manager->post(request, &data))
583 response = QString(data);
588 response =
"Download failed";
595 response =
"Unsupported HttpRequest method";