14 #include <linux/dvb/dmx.h>
15 #include <linux/dvb/frontend.h>
16 #include <sys/ioctl.h>
26 #define DVBS_TUNE_TIMEOUT 9000 //ms
27 #define DVBS_LOCK_TIMEOUT 2000 //ms
28 #define DVBC_TUNE_TIMEOUT 9000 //ms
29 #define DVBC_LOCK_TIMEOUT 2000 //ms
30 #define DVBT_TUNE_TIMEOUT 9000 //ms
31 #define DVBT_LOCK_TIMEOUT 2000 //ms
32 #define ATSC_TUNE_TIMEOUT 9000 //ms
33 #define ATSC_LOCK_TIMEOUT 2000 //ms
35 #define SCR_RANDOM_TIMEOUT 500 // ms (add random value up to this when tuning SCR device to avoid lockups)
40 { 0, PILOT_OFF,
trNOOP(
"off") },
41 { 1, PILOT_ON,
trNOOP(
"on") },
42 { 999, PILOT_AUTO,
trNOOP(
"auto") },
47 { 0, INVERSION_OFF,
trNOOP(
"off") },
48 { 1, INVERSION_ON,
trNOOP(
"on") },
49 { 999, INVERSION_AUTO,
trNOOP(
"auto") },
54 { 5, 5000000,
"5 MHz" },
55 { 6, 6000000,
"6 MHz" },
56 { 7, 7000000,
"7 MHz" },
57 { 8, 8000000,
"8 MHz" },
58 { 10, 10000000,
"10 MHz" },
59 { 1712, 1712000,
"1.712 MHz" },
64 { 0, FEC_NONE,
trNOOP(
"none") },
65 { 12, FEC_1_2,
"1/2" },
66 { 23, FEC_2_3,
"2/3" },
67 { 34, FEC_3_4,
"3/4" },
68 { 35, FEC_3_5,
"3/5" },
69 { 45, FEC_4_5,
"4/5" },
70 { 56, FEC_5_6,
"5/6" },
71 { 67, FEC_6_7,
"6/7" },
72 { 78, FEC_7_8,
"7/8" },
73 { 89, FEC_8_9,
"8/9" },
74 { 910, FEC_9_10,
"9/10" },
75 { 999, FEC_AUTO,
trNOOP(
"auto") },
80 { 16, QAM_16,
"QAM16" },
81 { 32, QAM_32,
"QAM32" },
82 { 64, QAM_64,
"QAM64" },
83 { 128, QAM_128,
"QAM128" },
84 { 256, QAM_256,
"QAM256" },
87 { 6, APSK_16,
"16APSK" },
88 { 7, APSK_32,
"32APSK" },
89 { 10, VSB_8,
"VSB8" },
90 { 11, VSB_16,
"VSB16" },
91 { 12, DQPSK,
"DQPSK" },
92 { 999, QAM_AUTO,
trNOOP(
"auto") },
96 #define DVB_SYSTEM_1 0 // see also nit.c
97 #define DVB_SYSTEM_2 1
113 { 2, TRANSMISSION_MODE_2K,
"2K" },
115 { 8, TRANSMISSION_MODE_8K,
"8K" },
118 { 999, TRANSMISSION_MODE_AUTO,
trNOOP(
"auto") },
123 { 4, GUARD_INTERVAL_1_4,
"1/4" },
124 { 8, GUARD_INTERVAL_1_8,
"1/8" },
125 { 16, GUARD_INTERVAL_1_16,
"1/16" },
126 { 32, GUARD_INTERVAL_1_32,
"1/32" },
130 { 999, GUARD_INTERVAL_AUTO,
trNOOP(
"auto") },
135 { 0, HIERARCHY_NONE,
trNOOP(
"none") },
136 { 1, HIERARCHY_1,
"1" },
137 { 2, HIERARCHY_2,
"2" },
138 { 4, HIERARCHY_4,
"4" },
139 { 999, HIERARCHY_AUTO,
trNOOP(
"auto") },
144 { 0, ROLLOFF_AUTO,
trNOOP(
"auto") },
145 { 20, ROLLOFF_20,
"0.20" },
146 { 25, ROLLOFF_25,
"0.25" },
147 { 35, ROLLOFF_35,
"0.35" },
178 *String =
tr(Map[n].userString);
212 guard = GUARD_INTERVAL_AUTO;
225 return Value >= 0 && Value != 999 ? sprintf(p,
"%c%d", Name, Value) : 0;
230 #define ST(s) if (strchr(s, Type) && (strchr(s, '0' + system + 1) || strchr(s, '*')))
258 int n = strtol(s, &p, 10);
259 if (!errno && p != s) {
265 esyslog(
"ERROR: invalid value for parameter '%c'", *(s - 1));
272 switch (toupper(*s)) {
292 default:
esyslog(
"ERROR: unknown parameter key '%c'", *s);
301 #define TUNER_POLL_TIMEOUT 10 // ms
338 virtual void Action(
void);
350 bool Locked(
int TimeoutMs = 0);
418 while (t->bondedTuner !=
this)
421 t->bondedTuner = NULL;
436 return diseqc->Commands();
440 bool VoltOff = dtp.Polarization() ==
'V' || dtp.Polarization() ==
'R';
452 if (t->device->Priority() >
IDLEPRIORITY || ConsiderOccupied && t->device->Occupied()) {
453 if (strcmp(BondingParams, t->GetBondedMaster()->GetBondingParams()) != 0)
499 if (BondedMaster ==
this) {
529 if (isLocked || !TimeoutMs)
542 dvb_frontend_event Event;
543 while (ioctl(
fd_frontend, FE_GET_EVENT, &Event) == 0)
552 if (ioctl(
fd_frontend, FE_READ_STATUS, &Status) != -1)
568 if (ioctl(
fd_frontend, FE_READ_SIGNAL_STRENGTH, &Signal) != -1)
573 uint16_t MaxSignal = 0xFFFF;
579 MaxSignal = 670;
break;
581 int s = int(Signal) * 100 / MaxSignal;
584 #ifdef DEBUG_SIGNALSTRENGTH
590 #define LOCK_THRESHOLD 5 // indicates that all 5 FE_HAS_* flags are set
597 if ((Status & FE_HAS_LOCK) == 0) {
598 if ((Status & FE_HAS_SIGNAL) == 0)
600 if ((Status & FE_HAS_CARRIER) == 0)
602 if ((Status & FE_HAS_VITERBI) == 0)
604 if ((Status & FE_HAS_SYNC) == 0)
608 #ifdef DEBUG_SIGNALQUALITY
615 if (errno != EINTR) {
617 #ifdef DEBUG_SIGNALQUALITY
623 #ifdef DEBUG_SIGNALQUALITY
630 if (errno != EINTR) {
632 #ifdef DEBUG_SIGNALQUALITY
638 #ifdef DEBUG_SIGNALQUALITY
643 if (ioctl(
fd_frontend, FE_READ_UNCORRECTED_BLOCKS, &Unc) != -1)
645 if (errno != EINTR) {
647 #ifdef DEBUG_SIGNALQUALITY
653 uint16_t MinSnr = 0x0000;
654 uint16_t MaxSnr = 0xFFFF;
671 int a = int(
constrain(Snr, MinSnr, MaxSnr)) * 100 / (MaxSnr - MinSnr);
672 int b = 100 - (Unc * 10 + (Ber / 256) * 5);
678 #ifdef DEBUG_SIGNALQUALITY
679 fprintf(stderr,
"FE %d/%d: %08X Q = %04X %04X %d %5d %5d %3d%%\n",
adapter,
frontend,
subsystemId, MaxSnr, Snr, HasSnr, HasBer ?
int(Ber) : -1, HasUnc ?
int(Unc) : -1, q);
688 while (f && f < 1000000)
711 struct dvb_diseqc_master_cmd cmd;
712 const char *CurrentAction = NULL;
715 for (
int i = 0; !Break; i++) {
716 cmd.msg_len =
sizeof(cmd.msg);
747 default:
esyslog(
"ERROR: unknown diseqc command %d", da);
767 int ds = SYS_UNDEFINED;
771 ds = SYS_DVBC_ANNEX_AC;
772 else if (Channel->
IsSat())
774 else if (Channel->
IsTerr())
777 esyslog(
"ERROR: can't determine frontend type for channel %d (%s)", Channel->
Number(), Channel->
Name());
783 #define MAXFRONTENDCMDS 16
784 #define SETCMD(c, d) { Frontend[CmdSeq.num].cmd = (c);\
785 Frontend[CmdSeq.num].u.data = (d);\
786 if (CmdSeq.num++ > MAXFRONTENDCMDS) {\
787 esyslog("ERROR: too many tuning commands on frontend %d/%d", adapter, frontend);\
792 memset(&Frontend, 0,
sizeof(Frontend));
793 dtv_properties CmdSeq;
794 memset(&CmdSeq, 0,
sizeof(CmdSeq));
795 CmdSeq.props = Frontend;
797 if (ioctl(
fd_frontend, FE_SET_PROPERTY, &CmdSeq) < 0) {
807 if (frontendType == SYS_UNDEFINED)
810 SETCMD(DTV_DELIVERY_SYSTEM, frontendType);
811 if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2) {
815 frequency -= diseqc->Lof();
834 int tone = SEC_TONE_OFF;
843 int volt = (dtp.Polarization() ==
'V' || dtp.Polarization() ==
'R') ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18;
846 volt = SEC_VOLTAGE_13;
851 frequency = abs(frequency);
854 SETCMD(DTV_FREQUENCY, frequency * 1000UL);
855 SETCMD(DTV_MODULATION, dtp.Modulation());
857 SETCMD(DTV_INNER_FEC, dtp.CoderateH());
858 SETCMD(DTV_INVERSION, dtp.Inversion());
859 if (frontendType == SYS_DVBS2) {
861 SETCMD(DTV_PILOT, dtp.Pilot());
862 SETCMD(DTV_ROLLOFF, dtp.RollOff());
868 SETCMD(DTV_ROLLOFF, ROLLOFF_35);
874 else if (frontendType == SYS_DVBC_ANNEX_AC || frontendType == SYS_DVBC_ANNEX_B) {
877 SETCMD(DTV_INVERSION, dtp.Inversion());
879 SETCMD(DTV_INNER_FEC, dtp.CoderateH());
880 SETCMD(DTV_MODULATION, dtp.Modulation());
885 else if (frontendType == SYS_DVBT || frontendType ==
SYS_DVBT2) {
888 SETCMD(DTV_INVERSION, dtp.Inversion());
889 SETCMD(DTV_BANDWIDTH_HZ, dtp.Bandwidth());
890 SETCMD(DTV_CODE_RATE_HP, dtp.CoderateH());
891 SETCMD(DTV_CODE_RATE_LP, dtp.CoderateL());
892 SETCMD(DTV_MODULATION, dtp.Modulation());
893 SETCMD(DTV_TRANSMISSION_MODE, dtp.Transmission());
894 SETCMD(DTV_GUARD_INTERVAL, dtp.Guard());
895 SETCMD(DTV_HIERARCHY, dtp.Hierarchy());
908 else if (frontendType == SYS_ATSC) {
911 SETCMD(DTV_INVERSION, dtp.Inversion());
912 SETCMD(DTV_MODULATION, dtp.Modulation());
918 esyslog(
"ERROR: attempt to set channel with unknown DVB frontend type");
922 if (ioctl(
fd_frontend, FE_SET_PROPERTY, &CmdSeq) < 0) {
932 bool LostLock =
false;
933 fe_status_t Status = (fe_status_t)0;
935 fe_status_t NewStatus;
975 if (Status & FE_REINIT) {
983 else if (Status & FE_HAS_LOCK) {
1045 #define ST(s) if (strchr(s, type))
1063 default:
return NULL;
1123 if (fd_frontend >= 0) {
1151 int fd = open(FileName, Mode);
1152 if (fd < 0 && ReportError)
1160 if (access(FileName, F_OK) == 0) {
1161 int f = open(FileName, O_RDONLY);
1166 else if (errno != ENODEV && errno != EINVAL)
1169 else if (errno != ENOENT)
1177 dsyslog(
"probing %s", *FileName);
1179 if (dp->Probe(Adapter, Frontend))
1182 dsyslog(
"creating cDvbDevice");
1213 while ((a = DvbDir.
Next()) != NULL) {
1217 if (AdapterDir.
Ok()) {
1219 while ((f = AdapterDir.
Next()) != NULL) {
1231 if (Nodes.
Size() > 0) {
1233 for (
int i = 0; i < Nodes.
Size(); i++) {
1236 if (2 == sscanf(Nodes[i],
"%d %d", &Adapter, &Frontend)) {
1237 if (
Exists(Adapter, Frontend)) {
1241 if (
Probe(Adapter, Frontend))
1252 isyslog(
"found %d DVB device%s", Found, Found > 1 ?
"s" :
"");
1254 isyslog(
"using only %d DVB device%s", Used, Used > 1 ?
"s" :
"");
1257 isyslog(
"no DVB device found");
1264 if (ioctl(fd_frontend, FE_GET_INFO, &
frontendInfo) < 0) {
1269 dtv_properties CmdSeq;
1272 memset(&Frontend, 0,
sizeof(Frontend));
1273 memset(&CmdSeq, 0,
sizeof(CmdSeq));
1275 SETCMD(DTV_API_VERSION, 0);
1276 if (ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq) != 0) {
1284 bool LegacyMode =
true;
1286 memset(&Frontend, 0,
sizeof(Frontend));
1287 memset(&CmdSeq, 0,
sizeof(CmdSeq));
1290 int Result = ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq);
1292 for (uint i = 0; i < Frontend[0].u.buffer.len; i++) {
1302 esyslog(
"ERROR: can't query delivery systems on frontend %d/%d - falling back to legacy mode",
adapter,
frontend);
1336 ms =
"unknown modulations";
1353 int ErrorDevice = 0;
1356 if (
cDvbDevice *DvbDevice1 = dynamic_cast<cDvbDevice *>(Device1)) {
1357 if (
cDvbDevice *DvbDevice2 = dynamic_cast<cDvbDevice *>(Device2)) {
1358 if (!DvbDevice1->Bond(DvbDevice2))
1362 ErrorDevice = d + 1;
1365 ErrorDevice = i + 1;
1367 esyslog(
"ERROR: device '%d' in device bondings '%s' is not a cDvbDevice", ErrorDevice, Bondings);
1372 ErrorDevice = d + 1;
1375 ErrorDevice = i + 1;
1377 esyslog(
"ERROR: unknown device '%d' in device bondings '%s'", ErrorDevice, Bondings);
1398 if (Device !=
this) {
1408 esyslog(
"ERROR: can't bond device %d with device %d (only DVB-S(2) devices can be bonded)",
CardIndex() + 1, Device->
CardIndex() + 1);
1425 while (d->bondedDevice !=
this)
1426 d = d->bondedDevice;
1428 d->bondedDevice = NULL;
1451 dmx_pes_filter_params pesFilterParams;
1452 memset(&pesFilterParams, 0,
sizeof(pesFilterParams));
1454 if (Handle->
handle < 0) {
1456 if (Handle->
handle < 0) {
1461 pesFilterParams.pid = Handle->
pid;
1462 pesFilterParams.input = DMX_IN_FRONTEND;
1463 pesFilterParams.output = DMX_OUT_TS_TAP;
1464 pesFilterParams.pes_type= DMX_PES_OTHER;
1465 pesFilterParams.flags = DMX_IMMEDIATE_START;
1466 if (ioctl(Handle->
handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
1471 else if (!Handle->
used) {
1474 pesFilterParams.pid = 0x1FFF;
1475 pesFilterParams.input = DMX_IN_FRONTEND;
1476 pesFilterParams.output = DMX_OUT_DECODER;
1477 pesFilterParams.pes_type= DMX_PES_OTHER;
1478 pesFilterParams.flags = DMX_IMMEDIATE_START;
1479 CHECK(ioctl(Handle->
handle, DMX_SET_PES_FILTER, &pesFilterParams));
1491 int f = open(FileName, O_RDWR | O_NONBLOCK);
1493 dmx_sct_filter_params sctFilterParams;
1494 memset(&sctFilterParams, 0,
sizeof(sctFilterParams));
1495 sctFilterParams.pid = Pid;
1496 sctFilterParams.timeout = 0;
1497 sctFilterParams.flags = DMX_IMMEDIATE_START;
1498 sctFilterParams.filter.filter[0] = Tid;
1499 sctFilterParams.filter.mask[0] = Mask;
1500 if (ioctl(f, DMX_SET_FILTER, &sctFilterParams) >= 0)
1503 esyslog(
"ERROR: can't set filter (pid=%d, tid=%02X, mask=%02X): %m", Pid, Tid, Mask);
1508 esyslog(
"ERROR: can't open filter handle on '%s'", *FileName);
1543 dtp.Modulation() == QPSK && !(
frontendInfo.caps & FE_CAN_QPSK) ||
1544 dtp.Modulation() == QAM_16 && !(
frontendInfo.caps & FE_CAN_QAM_16) ||
1545 dtp.Modulation() == QAM_32 && !(
frontendInfo.caps & FE_CAN_QAM_32) ||
1546 dtp.Modulation() == QAM_64 && !(
frontendInfo.caps & FE_CAN_QAM_64) ||
1547 dtp.Modulation() == QAM_128 && !(
frontendInfo.caps & FE_CAN_QAM_128) ||
1548 dtp.Modulation() == QAM_256 && !(
frontendInfo.caps & FE_CAN_QAM_256) ||
1549 dtp.Modulation() == QAM_AUTO && !(
frontendInfo.caps & FE_CAN_QAM_AUTO) ||
1550 dtp.Modulation() == VSB_8 && !(
frontendInfo.caps & FE_CAN_8VSB) ||
1551 dtp.Modulation() == VSB_16 && !(
frontendInfo.caps & FE_CAN_16VSB) ||
1562 bool result =
false;
1564 bool needsDetachReceivers =
false;
1568 result = hasPriority;
1577 needsDetachReceivers =
true;
1597 needsDetachReceivers |= d->Receiving();
1605 if (NeedsDetachReceivers)
1606 *NeedsDetachReceivers = needsDetachReceivers;
1690 if (cs->WantsTsData()) {
1694 Data = cs->Decrypt(Data, Available);
1711 d->cDevice::DetachAllReceivers();
1723 DvbDeviceProbes.
Add(
this);
1728 DvbDeviceProbes.
Del(
this,
false);
1733 uint32_t SubsystemId = 0;
1736 if (stat(FileName, &st) == 0) {
1740 while ((e = d.
Next()) != NULL) {
1741 if (strstr(e->d_name,
"frontend")) {
1743 if (FILE *f = fopen(FileName,
"r")) {
1745 char *s = ReadLine.
Read(f);
1749 if (s && 2 == sscanf(s,
"%u:%u", &Major, &Minor)) {
1750 if (((Major << 8) | Minor) == st.st_rdev) {
1751 FileName =
cString::sprintf(
"/sys/class/dvb/%s/device/subsystem_vendor", e->d_name);
1752 if ((f = fopen(FileName,
"r")) != NULL) {
1753 if (
char *s = ReadLine.
Read(f))
1754 SubsystemId = strtoul(s, NULL, 0) << 16;
1758 FileName =
cString::sprintf(
"/sys/class/dvb/%s/device/idVendor", e->d_name);
1759 if ((f = fopen(FileName,
"r")) != NULL) {
1760 if (
char *s = ReadLine.
Read(f))
1761 SubsystemId = strtoul(s, NULL, 16) << 16;
1765 FileName =
cString::sprintf(
"/sys/class/dvb/%s/device/subsystem_device", e->d_name);
1766 if ((f = fopen(FileName,
"r")) != NULL) {
1767 if (
char *s = ReadLine.
Read(f))
1768 SubsystemId |= strtoul(s, NULL, 0);
1772 FileName =
cString::sprintf(
"/sys/class/dvb/%s/device/idProduct", e->d_name);
1773 if ((f = fopen(FileName,
"r")) != NULL) {
1774 if (
char *s = ReadLine.
Read(f))
1775 SubsystemId |= strtoul(s, NULL, 16);
static unsigned int FrequencyToHz(unsigned int f)
struct dirent * Next(void)
virtual ~cDvbDeviceProbe()
static bool UseDevice(int n)
Tells whether the device with the given card index shall be used in this instance of VDR...
const char * DeliverySystemNames[]
cDvbTransponderParameters(const char *Parameters=NULL)
virtual bool ProvidesSource(int Source) const
Returns true if this device can provide the given source.
int PrintParameter(char *p, char Name, int Value) const
virtual cString DeviceType(void) const
Returns a string identifying the type of this device (like "DVB-S").
bool IsBondedMaster(void) const
uchar * Get(int *Available=NULL)
Returns a pointer to the first TS packet in the buffer.
static bool Exists(int Adapter, int Frontend)
Checks whether the given adapter/frontend exists.
bool IsScr(void) const
Returns true if this DiSEqC sequence uses Satellite Channel Routing.
void ResetToneAndVoltage(void)
#define SCR_RANDOM_TIMEOUT
bool Receiving(bool Dummy=false) const
Returns true if we are currently receiving. The parameter has no meaning (for backwards compatibility...
const char * ParseParameter(const char *s, int &Value, const tDvbParameterMap *Map=NULL)
virtual bool IsTunedToTransponder(const cChannel *Channel) const
Returns true if this device is currently tuned to the given Channel's transponder.
int Position(void) const
Indicates which positioning mode to use in order to move the dish to a given satellite position...
static bool Initialize(void)
Initializes the DVB devices.
void SetDescription(const char *Description,...) __attribute__((format(printf
virtual bool GetTSPacket(uchar *&Data)
Gets exactly one TS packet from the DVR of this device and returns a pointer to it in Data...
#define DVBT_TUNE_TIMEOUT
int UserIndex(int Value, const tDvbParameterMap *Map)
void Add(cListObject *Object, cListObject *After=NULL)
virtual const cPositioner * Positioner(void) const
Returns a pointer to the positioner (if any) this device has used to move the satellite dish to the r...
void UnBond(void)
Removes this device from any bonding it might have with other devices.
cTSBuffer * tsBuffer
< Controls how the DVB device handles Transfer Mode when replaying Dolby Digital audio.
#define DVBC_TUNE_TIMEOUT
int Ca(int Index=0) const
void ClearEventQueue(void) const
bool DeviceHooksProvidesTransponder(const cChannel *Channel) const
virtual int SignalQuality(void) const
Returns the "quality" of the currently received signal.
virtual cOsdItem * GetOsdItem(void)
Returns all the OSD items necessary for editing the source specific parameters of the channel that wa...
#define DVBS_LOCK_TIMEOUT
virtual void GotoPosition(uint Number, int Longitude)
Move the dish to the satellite position stored under the given Number.
void ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency)
static cString sprintf(const char *fmt,...) __attribute__((format(printf
#define DVBC_LOCK_TIMEOUT
const tDvbParameterMap SystemValuesSat[]
virtual void Append(T Data)
void SetFrontend(int Frontend)
This function is called whenever the positioner is connected to a DVB frontend.
#define DVBT_LOCK_TIMEOUT
static uint32_t GetSubsystemId(int Adapter, int Frontend)
const tDvbParameterMap InversionValues[]
bool Parse(const char *s)
static cDevice * GetDevice(int Index)
Gets the device with the given Index.
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView)
Sets the device to the given channel (actual physical setup).
eDiseqcActions Execute(const char **CurrentAction, uchar *Codes, uint8_t *MaxCodes, const cScr *Scr, uint *Frequency) const
Parses the DiSEqC commands and returns the appropriate action code with every call.
static int NumDevices(void)
Returns the total number of devices.
bool IsTunedTo(const cChannel *Channel) const
#define TUNER_POLL_TIMEOUT
void DelLivePids(void)
Deletes the live viewing PIDs.
int GetSignalStrength(void) const
int Transponder(void) const
Returns the transponder frequency in MHz, plus the polarization in case of sat.
cDvbTuner * GetBondedMaster(void)
cString ToString(char Type) const
bool Poll(int TimeoutMs=0)
int MapToDriver(int Value, const tDvbParameterMap *Map)
bool QueryDeliverySystems(int fd_frontend)
cPositioner * GetPositioner(void)
const char * Parameters(void) const
bool needsDetachBondedReceivers
static int NextCardIndex(int n=0)
Calculates the next card index.
bool SetTransponderData(int Source, int Frequency, int Srate, const char *Parameters, bool Quiet=false)
static cPositioner * GetPositioner(void)
Returns a previously created positioner.
bool IsPrimaryDevice(void) const
A steerable satellite dish generally points to the south on the northern hemisphere, and to the north on the southern hemisphere (unless you're located directly on the equator, in which case the general direction is "up").
virtual void GotoAngle(int Longitude)
Move the dish to the given angular position.
cCamSlot * CamSlot(void) const
Returns the CAM slot that is currently used with this device, or NULL if no CAM slot is in use...
virtual bool MaySwitchTransponder(const cChannel *Channel) const
Returns true if it is ok to switch to the Channel's transponder on this device, without disturbing an...
const tDvbParameterMap HierarchyValues[]
const char * Name(void) const
void StartSectionHandler(void)
A derived device that provides section data must call this function (typically in its constructor) to...
static bool BondDevices(const char *Bondings)
Bonds the devices as defined in the given Bondings string.
static bool Probe(int Adapter, int Frontend)
Probes for existing DVB devices.
virtual bool SetPid(cPidHandle *Handle, int Type, bool On)
Does the actual PID setting on this device.
uint32_t SubsystemId(void) const
void StopSectionHandler(void)
A device that has called StartSectionHandler() must call this function (typically in its destructor) ...
#define MAXDELIVERYSYSTEMS
virtual bool CanDecrypt(const cChannel *Channel)
Returns true if there is a CAM in this slot that is able to decrypt the given Channel (or at least cl...
virtual void SetData(cChannel *Channel)
Sets all source specific parameters to those of the given Channel.
cDvbDevice * bondedDevice
cDvbSourceParam(char Source, const char *Description)
int MapToUser(int Value, const tDvbParameterMap *Map, const char **String)
bool TimedOut(void) const
virtual bool IsMoving(void) const
Returns true if the dish is currently moving as a result of a call to GotoPosition() or GotoAngle()...
static cDvbCiAdapter * CreateCiAdapter(cDevice *Device, int Fd)
cList< cDvbDeviceProbe > DvbDeviceProbes
virtual cString DeviceName(void) const
Returns a string identifying the name of this device.
void bool Start(void)
Sets the description of this thread, which will be used when logging starting or stopping of the thre...
virtual void CloseDvr(void)
Shuts down the DVR.
#define DVBS_TUNE_TIMEOUT
virtual void CloseFilter(int Handle)
Closes a file handle that has previously been opened by OpenFilter().
static bool IsSat(int Code)
int DriverIndex(int Value, const tDvbParameterMap *Map)
#define ATSC_LOCK_TIMEOUT
const tDvbParameterMap ModulationValues[]
bool Running(void)
Returns false if a derived cThread object shall leave its Action() function.
int deliverySystems[MAXDELIVERYSYSTEMS]
bool TimedWait(cMutex &Mutex, int TimeoutMs)
bool Locked(int TimeoutMs=0)
int Frequency(void) const
Returns the actual frequency, as given in 'channels.conf'.
void Skip(int Count)
If after a call to Get() more or less than TS_SIZE of the available data has been processed...
virtual bool OpenDvr(void)
Opens the DVR of this device and prepares it to deliver a Transport Stream for use in a cReceiver...
int GetSignalQuality(void) const
bool Bond(cDvbTuner *Tuner)
virtual void DetachAllReceivers(void)
Detaches all receivers from this device.
static void UnBondDevices(void)
Unbonds all devices.
const char * MapToUserString(int Value, const tDvbParameterMap *Map)
virtual const cChannel * GetCurrentlyTunedTransponder(void) const
Returns a pointer to the currently tuned transponder.
virtual bool HasCi(void)
Returns true if this device has a Common Interface.
int CardIndex(void) const
Returns the card index of this device (0 ... MAXDEVICES - 1).
const tDvbParameterMap PilotValues[]
int Priority(void) const
Returns the priority of the current receiving session (-MAXPRIORITY..MAXPRIORITY), or IDLEPRIORITY if no receiver is currently active.
virtual bool HasLock(int TimeoutMs=0) const
Returns true if the device has a lock on the requested transponder.
virtual int NumProvidedSystems(void) const
Returns the number of individual "delivery systems" this device provides.
dvb_frontend_info frontendInfo
int FrontendType(void) const
const cDiseqc * lastDiseqc
static int GetRequiredDeliverySystem(const cChannel *Channel, const cDvbTransponderParameters *Dtp)
void Del(cListObject *Object, bool DeleteObject=true)
cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend)
int FirstDeviceIndex(int DeviceIndex) const
Returns the first device index (starting at 0) that uses the same sat cable number as the device with...
virtual bool ProvidesDeliverySystem(int DeliverySystem) const
const tDvbParameterMap RollOffValues[]
static cDevice * PrimaryDevice(void)
Returns the primary device.
static int setTransferModeForDolbyDigital
const tDvbParameterMap CoderateValues[]
bool Bond(cDvbDevice *Device)
Bonds this device with the given Device, making both of them use the same satellite cable and LNB...
const cPositioner * Positioner(void) const
const cChannel * GetTransponder(void) const
virtual bool ProvidesTransponder(const cChannel *Channel) const
Returns true if this device can provide the transponder of the given Channel (which implies that it c...
const cDiseqc * Get(int Device, int Source, int Frequency, char Polarization, const cScr **Scr) const
Selects a DiSEqC entry suitable for the given Device and tuning parameters.
virtual bool ProvidesChannel(const cChannel *Channel, int Priority=IDLEPRIORITY, bool *NeedsDetachReceivers=NULL) const
Returns true if this device can provide the given channel.
void Sort(bool IgnoreCase=false)
bool BondingOk(const cChannel *Channel, bool ConsiderOccupied=false) const
The cDvbDevice implements a DVB device which can be accessed through the Linux DVB driver API...
void SetChannel(const cChannel *Channel)
int Position(void)
Returns the orbital position of the satellite in case this is a DVB-S source (zero otherwise)...
bool HasPid(int Pid) const
Returns true if this device is currently receiving the given PID.
bool GetFrontendStatus(fe_status_t &Status) const
#define DTV_DVBT2_PLP_ID_LEGACY
const tDvbParameterMap SystemValuesTerr[]
virtual void Action(void)
A derived cThread class must implement the code it wants to execute as a separate thread in this func...
const tDvbParameterMap BandwidthValues[]
bool BondingOk(const cChannel *Channel, bool ConsiderOccupied=false) const
Returns true if this device is either not bonded to any other device, or the given Channel is on the ...
Derived cDevice classes that can receive channels will have to provide Transport Stream (TS) packets ...
virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask)
Opens a file handle for the given filter data.
cDvbDevice(int Adapter, int Frontend)
void Cancel(int WaitSeconds=0)
Cancels the thread by first setting 'running' to false, so that the Action() loop can finish in an or...
virtual int SignalStrength(void) const
Returns the "strength" of the currently received signal.
cString GetBondingParams(const cChannel *Channel=NULL) const
bool SetFrontendType(const cChannel *Channel)
#define ATSC_TUNE_TIMEOUT
virtual bool MaySwitchTransponder(const cChannel *Channel) const
Returns true if it is ok to switch to the Channel's transponder on this device, without disturbing an...
cDvbTransponderParameters dtp
static cString DvbName(const char *Name, int Adapter, int Frontend)
The cDevice class is the base from which actual devices can be derived.
static int DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError=false)
const cDvbDevice * device
const tDvbParameterMap GuardValues[]
virtual void GetData(cChannel *Channel)
Copies all source specific parameters to the given Channel.
const tDvbParameterMap TransmissionValues[]
static void SetTransferModeForDolbyDigital(int Mode)
virtual bool ProvidesEIT(void) const
Returns true if this device provides EIT data and thus wants to be tuned to the channels it can recei...