16#include "libmythbase/mythconfig.h"
20#if CONFIG_FIREWIRE_OSX
25#define LOC QString("FireDev(%1): ").arg(guid_to_string(m_guid))
27static void fw_init(QMap<uint64_t,QString> &id_to_model);
33 m_guid(guid), m_subunitid(subunitid),
47 LOG(VB_RECORD, LOG_INFO,
LOC +
48 QString(
"AddListener() %1").arg(
m_listeners.size()));
63 LOG(VB_RECORD, LOG_INFO,
LOC +
64 QString(
"RemoveListener() %1").arg(
m_listeners.size()));
69 QMutexLocker locker(&
m_lock);
71 std::vector<uint8_t> cmd;
72 std::vector<uint8_t> ret;
79 QString cmdStr = (on) ?
"on" :
"off";
80 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"Powering %1").arg(cmdStr));
84 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Power on cmd failed (no response)");
90 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Power %1 failed").arg(cmdStr));
95 LOG(VB_RECORD, LOG_INFO,
LOC +
96 QString(
"Power %1 cmd sent successfully").arg(cmdStr));
103 QMutexLocker locker(&
m_lock);
105 std::vector<uint8_t> cmd;
106 std::vector<uint8_t> ret;
113 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Requesting STB Power State");
117 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Power cmd failed (no response)");
121 QString loc =
LOC +
"STB Power State: ";
125 LOG(VB_CHANNEL, LOG_INFO, loc +
"Query not implemented");
132 LOG(VB_CHANNEL, LOG_INFO, loc +
"On");
138 LOG(VB_CHANNEL, LOG_INFO, loc +
"Off");
142 LOG(VB_GENERAL, LOG_ERR,
LOC +
"STB Power State: Unknown Response");
150 LOG(VB_CHANNEL, LOG_INFO, QString(
"SetChannel(model %1, alt %2, chan %3)")
151 .arg(panel_model).arg(alt_method).arg(channel));
153 QMutexLocker locker(&
m_lock);
154 LOG(VB_CHANNEL, LOG_INFO,
"SetChannel() -- locked");
158 LOG(VB_GENERAL, LOG_ERR,
LOC +
159 QString(
"Model: '%1' ").arg(panel_model) +
160 "is not supported by internal channel changer.");
164 std::array<uint,3> digit {
165 (channel % 1000) / 100,
166 (channel % 100) / 10,
172 LOG(VB_GENERAL, LOG_ERR,
LOC +
173 "SetChannel: Extended subunits are not supported.");
178 std::vector<uint8_t> cmd;
179 std::vector<uint8_t> ret;
181 if ((panel_model.toUpper() ==
"SA GENERIC") ||
182 (panel_model.toUpper() ==
"SA4200HD") ||
183 (panel_model.toUpper() ==
"SA4250HDC"))
185 if (panel_model.toUpper() ==
"SA4250HDC")
187 LOG(VB_GENERAL, LOG_ERR,
LOC +
188 "The Scientific Atlanta 4250 HDC is not supported "
189 "\n\t\t\tby any MythTV Firewire channel changer."
190 "At the moment you must use an IR blaster.");
199 cmd.push_back((channel>>8) & 0x0f);
200 cmd.push_back(channel & 0xff);
215 if (!press_ok && !release_ok)
217 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Tuning failed");
227 bool is_mot = ((panel_model.startsWith(
"DCT-", Qt::CaseInsensitive)) ||
228 (panel_model.startsWith(
"DCH-", Qt::CaseInsensitive)) ||
229 (panel_model.startsWith(
"DCX-", Qt::CaseInsensitive)) ||
230 (panel_model.startsWith(
"QIP-", Qt::CaseInsensitive)) ||
231 (panel_model.startsWith(
"MOTO", Qt::CaseInsensitive)) ||
232 (panel_model.startsWith(
"PACE-", Qt::CaseInsensitive)));
234 if (is_mot && !alt_method)
251 std::this_thread::sleep_for(500ms);
258 if (is_mot && alt_method)
266 cmd.push_back((channel>>8) & 0x0f);
267 cmd.push_back(channel & 0xff);
278 if (panel_model.toUpper() ==
"SA3250HD")
286 cmd.push_back(0x30 | digit[2]);
287 cmd.push_back(0x30 | digit[1]);
288 cmd.push_back(0x30 | digit[0]);
294 cmd[5] = 0x30 | digit[0];
295 cmd[6] = 0x30 | digit[1];
296 cmd[7] = 0x30 | digit[2];
309 const unsigned char *data,
uint dataSize)
312 ((data[1] & 0x1f) == 0) && (data[2] == 0))
318 listener->AddData(data, dataSize);
326 LOG(VB_GENERAL, LOG_INFO, QString(
"SetLastChannel(%1): cleared: %2")
340 LOG(VB_RECORD, LOG_DEBUG,
LOC +
341 QString(
"ProcessPATPacket: CRC 0x%1 cleared: %2")
347 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Can't handle large PAT's");
357 QString ret =
s_idToModel[(((uint64_t) vendor_id) << 32) | model_id];
360 return "MOTO GENERIC";
366 std::vector<AVCInfo> list;
368#if CONFIG_FIREWIRE_LINUX
370#elif CONFIG_FIREWIRE_OSX
377 info.m_guid = 0x0016928a7b600001ULL;
379 info.m_vendorid = 0x000014f8;
380 info.m_modelid = 0x00001072;
381 info.m_firmware_revision = 0x0;
382 info.m_product_name =
"Explorer 4200 HD";
383 list.push_back(
info);
385 info.m_guid = 0xff2145a850e39810ULL;
387 info.m_vendorid = 0x000014f8;
388 info.m_modelid = 0x00000be0;
389 info.m_firmware_revision = 0x0;
390 info.m_product_name =
"Explorer 3250 HD";
391 list.push_back(
info);
397static void fw_init(QMap<uint64_t,QString> &id_to_model)
399 const std::array<const uint64_t,16> sa_vendor_ids
401 0x0a73, 0x0f21, 0x11e6, 0x14f8, 0x1692, 0x1868,
402 0x1947, 0x1ac3, 0x1bd7, 0x1cea, 0x1e6b, 0x21be,
403 0x223a, 0x22ce, 0x23be, 0x252e,
406 for (uint64_t vendor_id : sa_vendor_ids)
408 id_to_model[vendor_id << 32 | 0x0be0] =
"SA3250HD";
409 id_to_model[vendor_id << 32 | 0x1072] =
"SA4200HD";
410 id_to_model[vendor_id << 32 | 0x10cc] =
"SA4250HDC";
411 id_to_model[vendor_id << 32 | 0x22ce] =
"SA8300HD";
414 const std::array<uint64_t,59> motorola_vendor_ids
417 0x1c11, 0x1cfb, 0x1fc4, 0x23a3, 0x23ee, 0x25f1,
418 0xfa01, 0x25f1, 0x25f2, 0xcc7d37, 0x946269, 0x6455b1,
428 0x0ce5, 0x0e5c, 0x1225, 0x0f9f, 0x1180,
429 0x12c9, 0x11ae, 0x152f, 0x14e8, 0x16b5, 0x1371,
430 0x19a6, 0x1aad, 0x0b06, 0x195e, 0x10dc,
440 0x04db, 0x0406, 0x0ce5, 0x111a, 0x1225, 0x1404,
441 0x1626, 0x18c0, 0x1ade, 0x1cfb, 0x2040, 0x2180,
442 0x2210, 0x230b, 0x2375, 0x2395, 0x23a2, 0x23ed,
443 0x23ee, 0x23a0, 0x23a1,
446 for (uint64_t vendor_id : motorola_vendor_ids)
448 id_to_model[vendor_id << 32 | 0xf740] =
"DCX-3200";
449 id_to_model[vendor_id << 32 | 0xf804] =
"DCX-3200";
450 id_to_model[vendor_id << 32 | 0xfa03] =
"DCX-3200";
451 id_to_model[vendor_id << 32 | 0xfa05] =
"DCX-3200";
452 id_to_model[vendor_id << 32 | 0xfa07] =
"DCX-3200";
453 id_to_model[vendor_id << 32 | 0x24a1] =
"DCX-3200";
454 id_to_model[vendor_id << 32 | 0x2322] =
"DCX-3200";
455 id_to_model[vendor_id << 32 | 0xea05] =
"DCX-3432";
456 id_to_model[vendor_id << 32 | 0xd330] =
"DCH-3200";
457 id_to_model[vendor_id << 32 | 0xb630] =
"DCH-3416";
458 id_to_model[vendor_id << 32 | 0x34cb] =
"DCT-3412";
459 id_to_model[vendor_id << 32 | 0x346b] =
"DCT-3416";
460 id_to_model[vendor_id << 32 | 0xb630] =
"DCT-3416";
461 id_to_model[vendor_id << 32 | 0x6200] =
"DCT-6200";
462 id_to_model[vendor_id << 32 | 0x620a] =
"DCT-6200";
463 id_to_model[vendor_id << 32 | 0x64ca] =
"DCT-6212";
464 id_to_model[vendor_id << 32 | 0x64cb] =
"DCT-6212";
465 id_to_model[vendor_id << 32 | 0x646b] =
"DCT-6216";
466 id_to_model[vendor_id << 32 | 0x8100] =
"QIP-7100";
467 id_to_model[vendor_id << 32 | 0x7100] =
"QIP-6200";
468 id_to_model[vendor_id << 32 | 0x0001] =
"QIP-7100";
471 const std::array<const uint64_t,2> pace_vendor_ids
477 for (uint64_t vendor_id : pace_vendor_ids)
479 id_to_model[vendor_id << 32 | 0x10551] =
"PACE-550";
480 id_to_model[vendor_id << 32 | 0x10755] =
"PACE-779";
486 QString model = panel_model.toUpper();
487 return ((model ==
"DCH-3200") ||
488 (model ==
"DCH-3416") ||
489 (model ==
"DCT-3412") ||
490 (model ==
"DCT-3416") ||
491 (model ==
"DCT-6200") ||
492 (model ==
"DCT-6212") ||
493 (model ==
"DCT-6216") ||
494 (model ==
"DCX-3200") ||
495 (model ==
"SA3250HD") ||
496 (model ==
"SA4200HD") ||
497 (model ==
"SA4250HDC") ||
498 (model ==
"SA8300HD") ||
499 (model ==
"PACE-550") ||
500 (model ==
"PACE-779") ||
501 (model ==
"QIP-6200") ||
502 (model ==
"QIP-7100") ||
503 (model ==
"SA GENERIC") ||
504 (model ==
"MOTO GENERIC"));
static std::vector< AVCInfo > GetSTBList(void)
virtual void AddListener(TSDataListener *listener)
void ProcessPATPacket(const TSPacket &tspacket)
static QMap< uint64_t, QString > s_idToModel
Vendor ID + Model ID to FirewireDevice STB model string.
virtual void RemoveListener(TSDataListener *listener)
void SetLastChannel(uint channel)
static QMutex s_staticLock
FirewireDevice(uint64_t guid, uint subunitid, uint speed)
virtual PowerState GetPowerState(void)
static std::vector< AVCInfo > GetSTBList(void)
std::vector< TSDataListener * > m_listeners
virtual bool SendAVCCommand(const std::vector< uint8_t > &cmd, std::vector< uint8_t > &result, int retry_cnt)=0
virtual bool SetChannel(const QString &panel_model, uint alt_method, uint channel)
static bool IsSTBSupported(const QString &model)
@ kAVCPanelKeyTuneFunction
static QString GetModelName(uint vendor_id, uint model_id)
virtual bool SetPowerState(bool on)
virtual void BroadcastToListeners(const unsigned char *data, uint dataSize)
@ kAVCResponseImplemented
@ kAVCStatusInquiryCommand
static std::vector< AVCInfo > GetSTBList(void)
A PSIP table is a variant of a PES packet containing an MPEG, ATSC or DVB table.
Used to access the data of a Transport Stream packet.
static constexpr unsigned int kSize
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
#define LOC
FirewireDevice Copyright (c) 2005 by Jim Westfall Distributed as part of MythTV under GPL v2 and late...
static void fw_init(QMap< uint64_t, QString > &id_to_model)
static const iso6937table * d
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
static constexpr uint8_t SYNC_BYTE