diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2011-09-17 14:13:31 +0200 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2011-09-17 14:13:31 +0200 |
commit | b1f6b586d4116bb46fffe9473d55da22b12563c9 (patch) | |
tree | 930977feda28a8ac0af788042f74064dc36be455 | |
parent | b40cd95dcccf7a37901d660d49a3ac1ff6bdecc8 (diff) | |
download | vdr-b1f6b586d4116bb46fffe9473d55da22b12563c9.tar.gz vdr-b1f6b586d4116bb46fffe9473d55da22b12563c9.tar.bz2 |
Added device number selection to scr.conf
-rw-r--r-- | diseqc.c | 59 | ||||
-rw-r--r-- | diseqc.h | 6 | ||||
-rw-r--r-- | scr.conf | 4 | ||||
-rw-r--r-- | vdr.5 | 15 |
4 files changed, 61 insertions, 23 deletions
@@ -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); } @@ -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; @@ -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 @@ -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: |