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 { 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: