12 #include <sys/select.h>
13 #include <sys/ioctl.h>
17 #include <QCoreApplication>
18 #include <QRegularExpression>
32 #define LOC QString("CetonSH[%1](%2): ").arg(m_inputId).arg(m_device)
44 QString devkey = devname.toUpper();
46 QMap<QString,CetonStreamHandler*>::iterator it =
s_handlers.find(devkey);
55 LOG(VB_RECORD, LOG_INFO,
56 QString(
"CetonSH[%1]: Creating new stream handler %2 for %3")
57 .arg(QString::number(inputid), devkey, devname));
63 LOG(VB_RECORD, LOG_INFO,
64 QString(
"CetonSH[%1]: Using existing stream handler %2 for %3")
65 .arg(QString::number(inputid), devkey, devname) +
66 QString(
" (%1 in use)").arg(rcount));
82 QMap<QString,CetonStreamHandler*>::iterator it =
s_handlers.find(devname);
93 LOG(VB_RECORD, LOG_INFO, QString(
"CetonSH[%1]: Closing handler for %2")
94 .arg(inputid).arg(devname));
101 LOG(VB_GENERAL, LOG_ERR,
102 QString(
"CetonSH[%1] Error: Couldn't find handler for %2")
103 .arg(inputid).arg(devname));
112 "", 0,
"", 0), inputid)
116 QStringList parts = device.split(
"-");
117 if (parts.size() != 2)
119 LOG(VB_GENERAL, LOG_ERR,
LOC +
120 QString(
"Invalid device id %1").arg(
m_device));
125 QStringList tuner_parts = parts.at(1).split(
".");
126 if (tuner_parts.size() == 2)
128 m_card = tuner_parts.at(0).toUInt();
129 m_tuner = tuner_parts.at(1).toUInt();
133 LOG(VB_GENERAL, LOG_ERR,
LOC +
134 QString(
"Invalid device id %1").arg(
m_device));
138 if (
GetVar(
"diag",
"Host_IP_Address") ==
"")
140 LOG(VB_GENERAL, LOG_ERR,
LOC +
141 "Ceton tuner does not seem to be available at IP");
146 QString url = QString(
"rtsp://%1:%2/cetonmpeg%3")
153 QString cardstatus =
GetVar(
"cas",
"CardStatus");
158 QString sernum =
GetVar(
"diag",
"Host_Serial_Number");
159 QString firmware_ver =
GetVar(
"diag",
"Host_Firmware");
160 QString hardware_ver =
GetVar(
"diag",
"Hardware_Revision");
162 LOG(VB_RECORD, LOG_INFO,
LOC +
163 QString(
"Ceton device %1 initialized. SN: %2, "
164 "Firmware ver. %3, Hardware ver. %4")
165 .arg(
m_ipAddress, sernum, firmware_ver, hardware_ver));
169 QString brand =
GetVar(
"cas",
"CardManufacturer");
170 QString
auth =
GetVar(
"cas",
"CardAuthorization");
172 LOG(VB_RECORD, LOG_INFO,
LOC +
173 QString(
"Cable card installed (%1) - %2").arg(brand,
auth));
177 LOG(VB_RECORD, LOG_INFO,
LOC +
178 "Cable card NOT installed (operating in QAM tuner mode)");
214 LOG(VB_RECORD, LOG_INFO,
LOC +
215 "Ignoring request - video streaming active");
233 uint prog =
GetVar(
"mux",
"ProgramNumber").toUInt();
236 LOG(VB_RECORD, LOG_WARNING,
LOC +
237 "VerifyTuning detected program = 0");
243 uint frequency =
GetVar(
"tuner",
"Frequency").toUInt();
246 LOG(VB_RECORD, LOG_WARNING,
LOC +
247 "VerifyTuning detected wrong frequency");
251 QString modulation =
GetVar(
"tuner",
"Modulation");
254 LOG(VB_RECORD, LOG_WARNING,
LOC +
255 "VerifyTuning detected wrong modulation");
259 uint program =
GetVar(
"mux",
"ProgramNumber").toUInt();
262 LOG(VB_RECORD, LOG_WARNING,
LOC +
263 "VerifyTuning detected wrong program");
268 QString carrier_lock =
GetVar(
"tuner",
"CarrierLock");
269 if (carrier_lock !=
"1")
271 LOG(VB_RECORD, LOG_WARNING,
LOC +
272 "VerifyTuning detected no carrier lock");
276 QString pcr_lock =
GetVar(
"tuner",
"PCRLock");
279 LOG(VB_RECORD, LOG_WARNING,
LOC +
280 "VerifyTuning detected no PCR lock");
312 uint frequency,
const QString &modulation)
314 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"TuneFrequency(%1, %2)")
315 .arg(frequency).arg(modulation));
317 if (frequency >= 100000000)
320 QString modulation_id;
321 if (modulation ==
"qam_256")
323 else if (modulation ==
"qam_64")
325 else if (modulation ==
"ntsc-m")
327 else if (modulation ==
"8vsb")
336 params.addQueryItem(
"instance_id", QString::number(
m_tuner));
337 params.addQueryItem(
"frequency", QString::number(frequency));
338 params.addQueryItem(
"modulation",modulation_id);
339 params.addQueryItem(
"tuner",
"1");
340 params.addQueryItem(
"demod",
"1");
341 params.addQueryItem(
"rst_chnl",
"0");
342 params.addQueryItem(
"force_tune",
"0");
347 "POST",
"/tune_request.cgi", params, response, status);
351 LOG(VB_GENERAL, LOG_ERR,
LOC +
352 QString(
"TuneFrequency() - HTTP status = %1 - response = %2")
353 .arg(status).arg(response));
361 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"TuneProgram(%1)").arg(program));
364 if (!program_list.contains(QString::number(program)))
366 LOG(VB_GENERAL, LOG_ERR,
LOC +
367 QString(
"TuneProgram(%1) - Requested program not in the program list")
376 params.addQueryItem(
"instance_id", QString::number(
m_tuner));
377 params.addQueryItem(
"program", QString::number(program));
382 "POST",
"/program_request.cgi", params, response, status);
386 LOG(VB_GENERAL, LOG_ERR,
LOC +
387 QString(
"TuneProgram() - HTTP status = %1 - response = %2")
388 .arg(status).arg(response));
396 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"PerformTuneVChannel(%1)")
400 params.addQueryItem(
"instance_id", QString::number(
m_tuner));
401 params.addQueryItem(
"channel", vchannel);
406 "POST",
"/channel_request.cgi", params, response, status);
410 LOG(VB_GENERAL, LOG_ERR,
LOC +
411 QString(
"PerformTuneVChannel() - HTTP status = %1 - response = %2")
412 .arg(status).arg(response));
421 if (
GetVar(
"cas",
"VirtualChannelNumber") == vchannel)
423 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"Not Re-Tuning channel %1")
431 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"TuneVChannel(%1)").arg(vchannel));
440 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"ClearProgramNumber()"));
442 for(
int i=0; i<50; i++)
444 if (
GetVar(
"mux",
"ProgramNumber") ==
"0")
449 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Program number failed to clear");
454 for(
int i = 1; i <= 30; i++)
456 QString prog =
GetVar(
"mux",
"ProgramNumber");
457 LOG(VB_RECORD, LOG_INFO,
LOC +
458 QString(
"GetProgramNumber() got %1 on attempt %2")
461 uint prognum = prog.toUInt();
468 LOG(VB_GENERAL, LOG_ERR,
LOC +
469 "GetProgramNumber() failed to get a non-zero program number");
475 const QString §ion,
const QString &variable)
const
477 QString loc =
LOC + QString(
"DoGetVar(%1,%2,%3,%4) - ")
481 params.addQueryItem(
"i", QString::number(
m_tuner));
482 params.addQueryItem(
"s", section);
483 params.addQueryItem(
"v", variable);
487 if (!
HttpRequest(
"GET",
"/get_var.json", params, response, status))
489 LOG(VB_GENERAL, LOG_ERR, loc +
490 QString(
"HttpRequest failed - %1").arg(response));
494 static const QRegularExpression regex {
"^\\{ \"?result\"?: \"(.*)\" \\}$"};
495 auto match = regex.match(response);
496 if (!match.hasMatch())
498 LOG(VB_GENERAL, LOG_ERR, loc +
499 QString(
"unexpected http response: -->%1<--").arg(response));
503 QString result = match.captured(1);
504 LOG(VB_RECORD, LOG_DEBUG, loc + QString(
"got: -->%1<--").arg(result));
510 QString loc =
LOC + QString(
"CetonHTTP: DoGetProgramList(%1,%2) - ")
514 params.addQueryItem(
"i", QString::number(
m_tuner));
518 if (!
HttpRequest(
"GET",
"/get_pat.json", params, response, status))
520 LOG(VB_GENERAL, LOG_ERR,
521 loc + QString(
"HttpRequest failed - %1").arg(response));
525 static const QRegularExpression regex(
526 R
"(^\{ "?length"?: \d+(, "?results"?: \[ (.*) \])? \}$)");
528 auto match = regex.match(response);
529 if (!match.hasMatch())
531 LOG(VB_GENERAL, LOG_ERR,
532 loc + QString(
"returned unexpected output: -->%1<--")
537 LOG(VB_RECORD, LOG_DEBUG, loc + QString(
"got: -->%1<--")
538 .arg(match.captured(2)));
539 return match.captured(2).split(
", ");
543 const QString &method,
const QString &script,
544 const QUrlQuery ¶ms,
545 QString &response,
uint &status_code)
const
548 auto *request =
new QNetworkRequest();
552 url.setScheme(
"http");
560 request->setAttribute(QNetworkRequest::CacheLoadControlAttribute,
561 QNetworkRequest::AlwaysNetwork);
565 url.setQuery(params);
566 request->setUrl(url);
567 if (
manager->download(request, &data))
569 response = QString(data);
574 response =
"Download failed";
578 if (
"POST" == method)
580 request->setUrl(url);
581 request->setHeader(QNetworkRequest::ContentTypeHeader,
582 "application/x-www-form-urlencoded");
583 data = params.query(QUrl::FullyEncoded).toUtf8();
586 if (
manager->post(request, &data))
588 response = QString(data);
593 response =
"Download failed";
600 response =
"Unsupported HttpRequest method";