summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2011-09-17 14:13:31 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2011-09-17 14:13:31 +0200
commitb1f6b586d4116bb46fffe9473d55da22b12563c9 (patch)
tree930977feda28a8ac0af788042f74064dc36be455
parentb40cd95dcccf7a37901d660d49a3ac1ff6bdecc8 (diff)
downloadvdr-b1f6b586d4116bb46fffe9473d55da22b12563c9.tar.gz
vdr-b1f6b586d4116bb46fffe9473d55da22b12563c9.tar.bz2
Added device number selection to scr.conf
-rw-r--r--diseqc.c59
-rw-r--r--diseqc.h6
-rw-r--r--scr.conf4
-rw-r--r--vdr.515
4 files changed, 61 insertions, 23 deletions
diff --git a/diseqc.c b/diseqc.c
index 3c2fb661..54fb7203 100644
--- a/diseqc.c
+++ b/diseqc.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: diseqc.c 2.8 2011/09/17 10:41:00 kls Exp $
+ * $Id: diseqc.c 2.9 2011/09/17 14:13:31 kls Exp $
*/
#include "diseqc.h"
@@ -12,10 +12,30 @@
#include "sources.h"
#include "thread.h"
+static bool ParseDeviceNumbers(const char *s, int &Devices)
+{
+ if (*s && s[strlen(s) - 1] == ':') {
+ const char *p = s;
+ while (*p && *p != ':') {
+ char *t = NULL;
+ int d = strtol(p, &t, 10);
+ p = t;
+ if (0 < d && d < 31)
+ Devices |= (1 << d - 1);
+ else {
+ esyslog("ERROR: invalid device number %d in '%s'", d, s);
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
// --- cScr ------------------------------------------------------------------
cScr::cScr(void)
{
+ devices = 0;
channel = -1;
userBand = 0;
pin = -1;
@@ -24,6 +44,10 @@ cScr::cScr(void)
bool cScr::Parse(const char *s)
{
+ if (!ParseDeviceNumbers(s, devices))
+ return false;
+ if (devices)
+ return true;
bool result = false;
int fields = sscanf(s, "%d %u %d", &channel, &userBand, &pin);
if (fields == 2 || fields == 3) {
@@ -40,15 +64,21 @@ bool cScr::Parse(const char *s)
return result;
}
-
// --- cScrs -----------------------------------------------------------------
cScrs Scrs;
-cScr *cScrs::GetUnused(void)
+cScr *cScrs::GetUnused(int Device)
{
cMutexLock MutexLock(&mutex);
+ int Devices = 0;
for (cScr *p = First(); p; p = Next(p)) {
+ if (p->Devices()) {
+ Devices = p->Devices();
+ continue;
+ }
+ if (Devices && !(Devices & (1 << Device - 1)))
+ continue;
if (!p->Used()) {
p->SetUsed(true);
return p;
@@ -78,23 +108,12 @@ cDiseqc::~cDiseqc()
bool cDiseqc::Parse(const char *s)
{
+ if (!ParseDeviceNumbers(s, devices))
+ return false;
+ if (devices)
+ return true;
bool result = false;
char *sourcebuf = NULL;
- if (*s && s[strlen(s) - 1] == ':') {
- const char *p = s;
- while (*p && *p != ':') {
- char *t = NULL;
- int d = strtol(p, &t, 10);
- p = t;
- if (0 < d && d < 32)
- devices |= (1 << d - 1);
- else {
- esyslog("ERROR: invalid device number %d in '%s'", d, s);
- return false;
- }
- }
- return true;
- }
int fields = sscanf(s, "%a[^ ] %d %c %d %a[^\n]", &sourcebuf, &slof, &polarization, &lof, &commands);
if (fields == 4)
commands = NULL; //XXX Apparently sscanf() doesn't work correctly if the last %a argument results in an empty string
@@ -264,9 +283,9 @@ const cDiseqc *cDiseqcs::Get(int Device, int Source, int Frequency, char Polariz
continue;
if (p->Source() == Source && p->Slof() > Frequency && p->Polarization() == toupper(Polarization)) {
if (p->IsScr() && Scr && !*Scr) {
- *Scr = Scrs.GetUnused();
+ *Scr = Scrs.GetUnused(Device);
if (*Scr)
- dsyslog("SCR %d assigned to device %d", (*Scr)->Index(), Device);
+ dsyslog("SCR %d assigned to device %d", (*Scr)->Channel(), Device);
else
esyslog("ERROR: no free SCR entry available for device %d", Device);
}
diff --git a/diseqc.h b/diseqc.h
index 44b8e51e..6e9058c2 100644
--- a/diseqc.h
+++ b/diseqc.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: diseqc.h 2.4 2011/09/11 13:40:16 kls Exp $
+ * $Id: diseqc.h 2.5 2011/09/17 13:15:17 kls Exp $
*/
#ifndef __DISEQC_H
@@ -15,6 +15,7 @@
class cScr : public cListObject {
private:
+ int devices;
int channel;
uint userBand;
int pin;
@@ -22,6 +23,7 @@ private:
public:
cScr(void);
bool Parse(const char *s);
+ int Devices(void) const { return devices; }
int Channel(void) const { return channel; }
uint UserBand(void) const { return userBand; }
int Pin(void) const { return pin; }
@@ -33,7 +35,7 @@ class cScrs : public cConfig<cScr> {
private:
cMutex mutex;
public:
- cScr *GetUnused(void);
+ cScr *GetUnused(int Device);
};
extern cScrs Scrs;
diff --git a/scr.conf b/scr.conf
index 9d02dc10..61e09f1c 100644
--- a/scr.conf
+++ b/scr.conf
@@ -8,6 +8,10 @@
# frequency: frequency of the SCR channel ("user band")
# pin: optional pin of the SCR channel (0-255)
#
+# A line containing space separated integer numbers, terminated with a ':',
+# defines that any following lines apply only to the given list
+# of device numbers.
+#
# Examples:
# 0 1284
diff --git a/vdr.5 b/vdr.5
index 5608fa17..eb22d2dd 100644
--- a/vdr.5
+++ b/vdr.5
@@ -8,7 +8,7 @@
.\" License as specified in the file COPYING that comes with the
.\" vdr distribution.
.\"
-.\" $Id: vdr.5 2.24 2011/09/10 14:45:00 kls Exp $
+.\" $Id: vdr.5 2.25 2011/09/17 13:27:42 kls Exp $
.\"
.TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files"
.SH NAME
@@ -512,6 +512,19 @@ Examples:
6 1980
.br
7 2096
+
+By default it is assumed that the SCR configurations apply to all devices, and
+each device will pick one. If you have several SCR sat cables connected to one
+VDR machine, or if you want to explicitly assign the SCR channels to your devices,
+lines of the form
+
+\fB1 2 4:\fR
+
+may be inserted in the \fIscr.conf\fR file, defining the devices that are allowed
+to use the SCR channels thereafter. In this case, only the devices
+1, 2 and 4 would be allowed to use the SCR channels following this line and up
+to the next such line, or the end of the file. If a device is listed more than
+once, only its first appearance counts.
.SS REMOTE CONTROL KEYS
The file \fIremote.conf\fR contains the key assignments for all remote control
units. Each line consists of one key assignment in the following format: