mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Added basic support for positioners to control steerable satellite dishes
This commit is contained in:
parent
5b76eec1af
commit
cd10b439d0
@ -2696,6 +2696,7 @@ Ales Jurik <ajurik@quick.cz>
|
||||
for reporting broken SI data on Czech/Slovak channels after changing the default
|
||||
character set to ISO-8859-9
|
||||
for adding MPEG 1 handling to remux.c
|
||||
for a patch that was used as a base for implementing support for positioners
|
||||
|
||||
Magnus Andersson <svankan@bahnhof.se>
|
||||
for translating OSD texts to the Swedish language
|
||||
@ -3155,3 +3156,6 @@ Jochen Dolze <vdr@dolze.de>
|
||||
|
||||
Dominique Dumont <domi.dumont@free.fr>
|
||||
for reporting a crash in the LCARS skin's main menu in case there is no current channel
|
||||
|
||||
Seppo Ingalsuo <seppo.ingalsuo@iki.fi>
|
||||
for a patch that was used as a base for implementing support for positioners
|
||||
|
28
HISTORY
28
HISTORY
@ -7144,7 +7144,7 @@ Video Disk Recorder Revision History
|
||||
Christian Richter).
|
||||
- Added DeleteEvent() to the EPG handler interface, so that an EPG handler can trigger
|
||||
deleting of an event (thanks to Christian Kaiser).
|
||||
- Speeded up opening menus on systems with many (several thousands) of recordings, by
|
||||
- Speeded up opening menus on systems with many (several thousands of) recordings, by
|
||||
caching the information whether a recording is stored on the video directory file
|
||||
system within the cRecording data (based on a patch from Torsten Lang).
|
||||
|
||||
@ -7813,7 +7813,7 @@ Video Disk Recorder Revision History
|
||||
- Fixed a crash in the LCARS skin's main menu in case there is no current channel
|
||||
(reported by Dominique Dumont).
|
||||
|
||||
2013-05-19: Version 2.1.1
|
||||
2013-08-21: Version 2.1.1
|
||||
|
||||
- Fixed initializing cDevice::keepTracks.
|
||||
- Fixed an endless loop in cTextWrapper::Set() in case the given Width is smaller than
|
||||
@ -7844,3 +7844,27 @@ Video Disk Recorder Revision History
|
||||
by Stefan Braun).
|
||||
- Fixed a crash in the LCARS skin's main menu in case there is no current channel
|
||||
(reported by Dominique Dumont).
|
||||
- Added basic support for positioners to control steerable satellite dishes (based on
|
||||
a patch from Seppo Ingalsuo and Ales Jurik).
|
||||
+ Supports GotoN (aka "DiSEqC 1.2") and GotoX (aka "USALS").
|
||||
+ The new DiSEqC command code 'P' can be used to instruct a positioner to move the
|
||||
dish to the required satellite position. When a 'P' code is processed, further
|
||||
execution of the remaining DiSEqC sequence (if any) is postponed until the positioner
|
||||
has reached the new satellite position.
|
||||
+ The new special source value of "S360E" can be used in diseqc.conf to indicate that
|
||||
an entry using a positioner can move the dish to any requested position within its
|
||||
range. Think of it as "full circle".
|
||||
+ The devices a particular cDiseqc or cScr applies to are now stored directly in each
|
||||
cDiseqc or cScr, respectively.
|
||||
+ A plugin can implement a custom positioner control (see PLUGINS.html, section "Positioners").
|
||||
+ The new function cSkinDisplayChannel::SetPositioner() can be implemented by skins to
|
||||
show the user a progress display when the dish is being moved. The default implementation
|
||||
calls SetMessage() with a string indicating the new position the dish is being moved to.
|
||||
The LCARS skin shows a progress bar indicating the movement of the dish.
|
||||
+ The new parameters "Site latitude", "Site longitude", "Positioner speed", and
|
||||
"Positioner swing" in the "Setup/LNB" menu can be used to configure the necessary
|
||||
values for a steerable dish.
|
||||
+ The cDvbTuner now has a new status tsPositioning, in which it waits until a steerable
|
||||
dish has reached its target position. Parsing SI data is paused until the target
|
||||
position has been reached.
|
||||
- The LCARS skin now shows the source value of the current channel in its channel display.
|
||||
|
22
MANUAL
22
MANUAL
@ -776,6 +776,28 @@ Version 2.0
|
||||
are connected to the same sat cable must be set to the same
|
||||
number here.
|
||||
|
||||
Use dish positioner = no
|
||||
By default, the 'P' command code in DiSEqC command sequences
|
||||
is ignored. Set this parameter to 'yes' if you are using a
|
||||
satellite dish positioner.
|
||||
|
||||
Site latitude (degrees) = 0
|
||||
Site longitude (degrees) = 0
|
||||
Set these to the latitude and longitude of your dish's
|
||||
location if you use a satellite dish positioner. Use the
|
||||
"Green" key to switch between north/south and east/west,
|
||||
respectively.
|
||||
|
||||
Max. positioner swing (degrees) = 65
|
||||
Defines the maximum angle by which the positioner can move
|
||||
the dish away from due south (or north) in either direction.
|
||||
The valid range is 0...90.
|
||||
|
||||
Positioner speed (degrees/s) = 1.5
|
||||
Defines the speed at which the positioner moves the dish.
|
||||
The valid range is 0.1...180. This value is used to calculate
|
||||
how long it takes the positioner to reach the target position.
|
||||
|
||||
CAM:
|
||||
|
||||
n CAM Name Shows the CAM slots that are present in this system, where
|
||||
|
4
Makefile
4
Makefile
@ -4,7 +4,7 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Makefile 2.54 2013/03/11 15:01:01 kls Exp $
|
||||
# $Id: Makefile 3.1 2013/05/23 10:10:00 kls Exp $
|
||||
|
||||
.DELETE_ON_ERROR:
|
||||
|
||||
@ -68,7 +68,7 @@ SILIB = $(LSIDIR)/libsi.a
|
||||
|
||||
OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
|
||||
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
|
||||
lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o\
|
||||
lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o positioner.o\
|
||||
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
|
||||
skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\
|
||||
timers.o tools.o transfer.o vdr.o videodir.o
|
||||
|
44
PLUGINS.html
44
PLUGINS.html
@ -99,6 +99,7 @@ structures and allows it to hook itself into specific areas to perform special a
|
||||
<li><a href="#Skins">Skins</a>
|
||||
<li><a href="#Themes">Themes</a>
|
||||
<li><a href="#Devices">Devices</a>
|
||||
<li><modified><a href="#Positioners">Positioners</a></modified>
|
||||
<li><a href="#Audio">Audio</a>
|
||||
<li><a href="#Remote Control">Remote Control</a>
|
||||
<li><a href="#Conditional Access">Conditional Access</a>
|
||||
@ -2024,6 +2025,49 @@ new cMyDeviceHook;
|
||||
|
||||
and shall not delete this object. It will be automatically deleted when the program ends.
|
||||
|
||||
<div class="modified">
|
||||
<hr><h2><a name="Positioners">Positioners</a></h2>
|
||||
|
||||
<div class="blurb">Now you see me - now you don't!</div><p>
|
||||
|
||||
If you are using a positioner (also known as "motor" or "rotor") to move your
|
||||
satellite dish to receive various satellites, you will be using the 'P' command
|
||||
in the <tt>diseqc.conf</tt> file. This command sends the necessary data to the
|
||||
positioner to move the dish to the satellite's orbital position. By default VDR
|
||||
uses its builtin DiSEqC positioner control. If your positioner requires a different
|
||||
method of controlling (like maybe via a serial link), you can derive a class
|
||||
from <tt>cPositioner</tt>, as in
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
#include <vdr/positioner.h>
|
||||
|
||||
class cMyPositioner : public cPositioner {
|
||||
private:
|
||||
void SendDiseqc(uint8_t *Codes, int NumCodes);
|
||||
public:
|
||||
cMyPositioner(void);
|
||||
virtual void Drive(ePositionerDirection Direction);
|
||||
virtual void Step(ePositionerDirection Direction, uint Steps = 1);
|
||||
virtual void Halt(void);
|
||||
virtual void SetLimit(ePositionerDirection Direction);
|
||||
virtual void DisableLimits(void);
|
||||
virtual void EnableLimits(void);
|
||||
virtual void StorePosition(uint Number);
|
||||
virtual void RecalcPositions(uint Number);
|
||||
virtual void GotoPosition(uint Number, int Longitude);
|
||||
virtual void GotoAngle(int Longitude);
|
||||
};
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
See the implementation of <tt>cDiseqcPositioner</tt> in <tt>diseqc.c</tt> for details.
|
||||
<p>
|
||||
You should create your derived positioner object in the
|
||||
<a href="#Getting started"><tt>Start()</tt></a> function of your plugin.
|
||||
Note that the object has to be created on the heap (using <tt>new</tt>),
|
||||
and you shall not delete it at any point (it will be deleted automatically
|
||||
when the program ends).
|
||||
</div modified>
|
||||
|
||||
<hr><h2><a name="Audio">Audio</a></h2>
|
||||
|
||||
<div class="blurb">"The stereo effect may only be experienced if stereo equipment is used!"</div><p>
|
||||
|
20
config.c
20
config.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.c 2.38 2013/03/18 08:57:50 kls Exp $
|
||||
* $Id: config.c 3.1 2013/05/23 12:41:06 kls Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
@ -389,6 +389,12 @@ cSetup::cSetup(void)
|
||||
LnbFrequLo = 9750;
|
||||
LnbFrequHi = 10600;
|
||||
DiSEqC = 0;
|
||||
UsePositioner = 0;
|
||||
SiteLat = 0;
|
||||
SiteLon = 0;
|
||||
PositionerSpeed = 15;
|
||||
PositionerSwing = 65;
|
||||
PositionerLastLon = 0;
|
||||
SetSystemTime = 0;
|
||||
TimeSource = 0;
|
||||
TimeTransponder = 0;
|
||||
@ -594,6 +600,12 @@ bool cSetup::Parse(const char *Name, const char *Value)
|
||||
else if (!strcasecmp(Name, "LnbFrequLo")) LnbFrequLo = atoi(Value);
|
||||
else if (!strcasecmp(Name, "LnbFrequHi")) LnbFrequHi = atoi(Value);
|
||||
else if (!strcasecmp(Name, "DiSEqC")) DiSEqC = atoi(Value);
|
||||
else if (!strcasecmp(Name, "UsePositioner")) UsePositioner = atoi(Value);
|
||||
else if (!strcasecmp(Name, "SiteLat")) SiteLat = atoi(Value);
|
||||
else if (!strcasecmp(Name, "SiteLon")) SiteLon = atoi(Value);
|
||||
else if (!strcasecmp(Name, "PositionerSpeed")) PositionerSpeed = atoi(Value);
|
||||
else if (!strcasecmp(Name, "PositionerSwing")) PositionerSwing = atoi(Value);
|
||||
else if (!strcasecmp(Name, "PositionerLastLon")) PositionerLastLon = atoi(Value);
|
||||
else if (!strcasecmp(Name, "SetSystemTime")) SetSystemTime = atoi(Value);
|
||||
else if (!strcasecmp(Name, "TimeSource")) TimeSource = cSource::FromString(Value);
|
||||
else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value);
|
||||
@ -703,6 +715,12 @@ bool cSetup::Save(void)
|
||||
Store("LnbFrequLo", LnbFrequLo);
|
||||
Store("LnbFrequHi", LnbFrequHi);
|
||||
Store("DiSEqC", DiSEqC);
|
||||
Store("UsePositioner", UsePositioner);
|
||||
Store("SiteLat", SiteLat);
|
||||
Store("SiteLon", SiteLon);
|
||||
Store("PositionerSpeed", PositionerSpeed);
|
||||
Store("PositionerSwing", PositionerSwing);
|
||||
Store("PositionerLastLon", PositionerLastLon);
|
||||
Store("SetSystemTime", SetSystemTime);
|
||||
Store("TimeSource", cSource::ToString(TimeSource));
|
||||
Store("TimeTransponder", TimeTransponder);
|
||||
|
12
config.h
12
config.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.h 3.1 2013/04/05 10:27:16 kls Exp $
|
||||
* $Id: config.h 3.2 2013/05/23 12:40:19 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
@ -27,8 +27,8 @@
|
||||
|
||||
// The plugin API's version number:
|
||||
|
||||
#define APIVERSION "2.0.0"
|
||||
#define APIVERSNUM 20000 // Version * 10000 + Major * 100 + Minor
|
||||
#define APIVERSION "2.1.1"
|
||||
#define APIVERSNUM 20101 // Version * 10000 + Major * 100 + Minor
|
||||
|
||||
// When loading plugins, VDR searches them by their APIVERSION, which
|
||||
// may be smaller than VDRVERSION in case there have been no changes to
|
||||
@ -266,6 +266,12 @@ public:
|
||||
int LnbFrequLo;
|
||||
int LnbFrequHi;
|
||||
int DiSEqC;
|
||||
int UsePositioner;
|
||||
int SiteLat;
|
||||
int SiteLon;
|
||||
int PositionerSpeed;
|
||||
int PositionerSwing;
|
||||
int PositionerLastLon;
|
||||
int SetSystemTime;
|
||||
int TimeSource;
|
||||
int TimeTransponder;
|
||||
|
7
device.c
7
device.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: device.c 3.1 2013/04/05 10:05:33 kls Exp $
|
||||
* $Id: device.c 3.2 2013/06/01 11:34:11 kls Exp $
|
||||
*/
|
||||
|
||||
#include "device.h"
|
||||
@ -665,6 +665,11 @@ int cDevice::NumProvidedSystems(void) const
|
||||
return 0;
|
||||
}
|
||||
|
||||
const cPositioner *cDevice::Positioner(void) const
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int cDevice::SignalStrength(void) const
|
||||
{
|
||||
return -1;
|
||||
|
8
device.h
8
device.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: device.h 2.47 2013/02/16 15:20:01 kls Exp $
|
||||
* $Id: device.h 3.1 2013/06/01 11:35:23 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DEVICE_H
|
||||
@ -17,6 +17,7 @@
|
||||
#include "filter.h"
|
||||
#include "nit.h"
|
||||
#include "pat.h"
|
||||
#include "positioner.h"
|
||||
#include "remux.h"
|
||||
#include "ringbuffer.h"
|
||||
#include "sdt.h"
|
||||
@ -273,6 +274,11 @@ public:
|
||||
///< actually provide channels must implement this function.
|
||||
///< The result of this function is used when selecting a device, in order
|
||||
///< to avoid devices that provide more than one system.
|
||||
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 requested position (only applies to DVB-S
|
||||
///< devices). If no positioner is involved, or this is not a DVB-S device,
|
||||
///< NULL will be returned.
|
||||
virtual int SignalStrength(void) const;
|
||||
///< Returns the "strength" of the currently received signal.
|
||||
///< This is a value in the range 0 (no signal at all) through
|
||||
|
200
diseqc.c
200
diseqc.c
@ -4,24 +4,37 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: diseqc.c 3.1 2013/05/02 09:30:33 kls Exp $
|
||||
* $Id: diseqc.c 3.2 2013/08/21 09:26:11 kls Exp $
|
||||
*/
|
||||
|
||||
#include "diseqc.h"
|
||||
#include <ctype.h>
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include "sources.h"
|
||||
#include "thread.h"
|
||||
|
||||
static bool ParseDeviceNumbers(const char *s, int &Devices)
|
||||
#define ALL_DEVICES (~0) // all bits set to '1'
|
||||
#define MAX_DEVICES 32 // each bit in a 32-bit integer represents one device
|
||||
|
||||
static int CurrentDevices = 0;
|
||||
|
||||
static bool IsDeviceNumbers(const char *s)
|
||||
{
|
||||
if (*s && s[strlen(s) - 1] == ':') {
|
||||
return *s && s[strlen(s) - 1] == ':';
|
||||
}
|
||||
|
||||
static bool ParseDeviceNumbers(const char *s)
|
||||
{
|
||||
if (IsDeviceNumbers(s)) {
|
||||
CurrentDevices = 0;
|
||||
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);
|
||||
if (0 < d && d <= MAX_DEVICES)
|
||||
CurrentDevices |= (1 << d - 1);
|
||||
else {
|
||||
esyslog("ERROR: invalid device number %d in '%s'", d, s);
|
||||
return false;
|
||||
@ -31,6 +44,107 @@ static bool ParseDeviceNumbers(const char *s, int &Devices)
|
||||
return true;
|
||||
}
|
||||
|
||||
// --- cDiseqcPositioner -----------------------------------------------------
|
||||
|
||||
// See http://www.eutelsat.com/files/live/sites/eutelsatv2/files/contributed/satellites/pdf/Diseqc/associated%20docs/positioner_appli_notice.pdf
|
||||
|
||||
cDiseqcPositioner::cDiseqcPositioner(void)
|
||||
{
|
||||
SetCapabilities(pcCanDrive |
|
||||
pcCanStep |
|
||||
pcCanHalt |
|
||||
pcCanSetLimits |
|
||||
pcCanDisableLimits |
|
||||
pcCanEnableLimits |
|
||||
pcCanStorePosition |
|
||||
pcCanRecalcPositions |
|
||||
pcCanGotoPosition |
|
||||
pcCanGotoAngle
|
||||
);
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::SendDiseqc(uint8_t *Codes, int NumCodes)
|
||||
{
|
||||
struct dvb_diseqc_master_cmd cmd;
|
||||
NumCodes = min(NumCodes, int(sizeof(cmd.msg) - 2));
|
||||
cmd.msg_len = 0;
|
||||
cmd.msg[cmd.msg_len++] = 0xE0;
|
||||
cmd.msg[cmd.msg_len++] = 0x31;
|
||||
for (int i = 0; i < NumCodes; i++)
|
||||
cmd.msg[cmd.msg_len++] = Codes[i];
|
||||
CHECK(ioctl(Frontend(), FE_DISEQC_SEND_MASTER_CMD, &cmd));
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::Drive(ePositionerDirection Direction)
|
||||
{
|
||||
uint8_t Code[] = { uint8_t(Direction == pdLeft ? 0x68 : 0x69), 0x00 };
|
||||
SendDiseqc(Code, 2);
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::Step(ePositionerDirection Direction, uint Steps)
|
||||
{
|
||||
if (Steps == 0)
|
||||
return;
|
||||
uint8_t Code[] = { uint8_t(Direction == pdLeft ? 0x68 : 0x69), 0xFF };
|
||||
Code[1] -= min(Steps, uint(0x7F)) - 1;
|
||||
SendDiseqc(Code, 2);
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::Halt(void)
|
||||
{
|
||||
uint8_t Code[] = { 0x60 };
|
||||
SendDiseqc(Code, 1);
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::SetLimit(ePositionerDirection Direction)
|
||||
{
|
||||
uint8_t Code[] = { uint8_t(Direction == pdLeft ? 0x66 : 0x67) };
|
||||
SendDiseqc(Code, 1);
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::DisableLimits(void)
|
||||
{
|
||||
uint8_t Code[] = { 0x63 };
|
||||
SendDiseqc(Code, 1);
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::EnableLimits(void)
|
||||
{
|
||||
uint8_t Code[] = { 0x6A, 0x00 };
|
||||
SendDiseqc(Code, 2);
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::StorePosition(uint Number)
|
||||
{
|
||||
uint8_t Code[] = { 0x6A, uint8_t(Number) };
|
||||
SendDiseqc(Code, 2);
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::RecalcPositions(uint Number)
|
||||
{
|
||||
uint8_t Code[] = { 0x6F, uint8_t(Number), 0x00, 0x00 };
|
||||
SendDiseqc(Code, 4);
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::GotoPosition(uint Number, int Longitude)
|
||||
{
|
||||
uint8_t Code[] = { 0x6B, uint8_t(Number) };
|
||||
SendDiseqc(Code, 2);
|
||||
cPositioner::GotoPosition(Number, Longitude);
|
||||
}
|
||||
|
||||
void cDiseqcPositioner::GotoAngle(int Longitude)
|
||||
{
|
||||
uint8_t Code[] = { 0x6E, 0x00, 0x00 };
|
||||
int Angle = CalcHourAngle(Longitude);
|
||||
int a = abs(Angle);
|
||||
Code[1] = a / 10 / 16;
|
||||
Code[2] = a / 10 % 16 * 16 + a % 10 * 16 / 10;
|
||||
Code[1] |= (Angle < 0) ? 0xE0 : 0xD0;
|
||||
SendDiseqc(Code, 3);
|
||||
cPositioner::GotoAngle(Longitude);
|
||||
}
|
||||
|
||||
// --- cScr ------------------------------------------------------------------
|
||||
|
||||
cScr::cScr(void)
|
||||
@ -44,10 +158,9 @@ cScr::cScr(void)
|
||||
|
||||
bool cScr::Parse(const char *s)
|
||||
{
|
||||
if (!ParseDeviceNumbers(s, devices))
|
||||
return false;
|
||||
if (devices)
|
||||
return true;
|
||||
if (IsDeviceNumbers(s))
|
||||
return ParseDeviceNumbers(s);
|
||||
devices = CurrentDevices;
|
||||
bool result = false;
|
||||
int fields = sscanf(s, "%d %u %d", &channel, &userBand, &pin);
|
||||
if (fields == 2 || fields == 3) {
|
||||
@ -68,16 +181,17 @@ bool cScr::Parse(const char *s)
|
||||
|
||||
cScrs Scrs;
|
||||
|
||||
bool cScrs::Load(const char *FileName, bool AllowComments, bool MustExist)
|
||||
{
|
||||
CurrentDevices = ALL_DEVICES;
|
||||
return cConfig<cScr>::Load(FileName, AllowComments, MustExist);
|
||||
}
|
||||
|
||||
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)))
|
||||
if (!IsBitSet(p->Devices(), Device - 1))
|
||||
continue;
|
||||
if (!p->Used()) {
|
||||
p->SetUsed(true);
|
||||
@ -96,6 +210,7 @@ cDiseqc::cDiseqc(void)
|
||||
slof = 0;
|
||||
polarization = 0;
|
||||
lof = 0;
|
||||
position = -1;
|
||||
scrBank = -1;
|
||||
commands = NULL;
|
||||
parsing = false;
|
||||
@ -108,10 +223,9 @@ cDiseqc::~cDiseqc()
|
||||
|
||||
bool cDiseqc::Parse(const char *s)
|
||||
{
|
||||
if (!ParseDeviceNumbers(s, devices))
|
||||
return false;
|
||||
if (devices)
|
||||
return true;
|
||||
if (IsDeviceNumbers(s))
|
||||
return ParseDeviceNumbers(s);
|
||||
devices = CurrentDevices;
|
||||
bool result = false;
|
||||
char *sourcebuf = NULL;
|
||||
int fields = sscanf(s, "%a[^ ] %d %c %d %a[^\n]", &sourcebuf, &slof, &polarization, &lof, &commands);
|
||||
@ -178,6 +292,28 @@ const char *cDiseqc::Wait(const char *s) const
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *cDiseqc::GetPosition(const char *s) const
|
||||
{
|
||||
if (!*s || !isdigit(*s)) {
|
||||
position = 0;
|
||||
return s;
|
||||
}
|
||||
char *p = NULL;
|
||||
errno = 0;
|
||||
int n = strtol(s, &p, 10);
|
||||
if (!errno && p != s && n >= 0 && n < 0xFF) {
|
||||
if (parsing) {
|
||||
if (position < 0)
|
||||
position = n;
|
||||
else
|
||||
esyslog("ERROR: more than one position in '%s'", s - 1);
|
||||
}
|
||||
return p;
|
||||
}
|
||||
esyslog("ERROR: invalid satellite position in '%s'", s - 1);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *cDiseqc::GetScrBank(const char *s) const
|
||||
{
|
||||
char *p = NULL;
|
||||
@ -250,8 +386,12 @@ cDiseqc::eDiseqcActions cDiseqc::Execute(const char **CurrentAction, uchar *Code
|
||||
case 'V': return daVoltage18;
|
||||
case 'A': return daMiniA;
|
||||
case 'B': return daMiniB;
|
||||
case 'W': *CurrentAction = Wait(*CurrentAction); break;
|
||||
case 'S': *CurrentAction = GetScrBank(*CurrentAction); break;
|
||||
case 'W': *CurrentAction = Wait(*CurrentAction); return daWait;
|
||||
case 'P': *CurrentAction = GetPosition(*CurrentAction);
|
||||
if (Setup.UsePositioner)
|
||||
return position ? daPositionN : daPositionA;
|
||||
break;
|
||||
case 'S': *CurrentAction = GetScrBank(*CurrentAction); return daScr;
|
||||
case '[': *CurrentAction = GetCodes(*CurrentAction, Codes, MaxCodes);
|
||||
if (*CurrentAction) {
|
||||
if (Scr && Frequency) {
|
||||
@ -261,7 +401,8 @@ cDiseqc::eDiseqcActions cDiseqc::Execute(const char **CurrentAction, uchar *Code
|
||||
return daCodes;
|
||||
}
|
||||
break;
|
||||
default: return daNone;
|
||||
default: esyslog("ERROR: unknown diseqc code '%c'", *(*CurrentAction - 1));
|
||||
return daNone;
|
||||
}
|
||||
}
|
||||
return daNone;
|
||||
@ -271,17 +412,18 @@ cDiseqc::eDiseqcActions cDiseqc::Execute(const char **CurrentAction, uchar *Code
|
||||
|
||||
cDiseqcs Diseqcs;
|
||||
|
||||
bool cDiseqcs::Load(const char *FileName, bool AllowComments, bool MustExist)
|
||||
{
|
||||
CurrentDevices = ALL_DEVICES;
|
||||
return cConfig<cDiseqc>::Load(FileName, AllowComments, MustExist);
|
||||
}
|
||||
|
||||
const cDiseqc *cDiseqcs::Get(int Device, int Source, int Frequency, char Polarization, const cScr **Scr) const
|
||||
{
|
||||
int Devices = 0;
|
||||
for (const cDiseqc *p = First(); p; p = Next(p)) {
|
||||
if (p->Devices()) {
|
||||
Devices = p->Devices();
|
||||
if (!IsBitSet(p->Devices(), Device - 1))
|
||||
continue;
|
||||
}
|
||||
if (Devices && !(Devices & (1 << Device - 1)))
|
||||
continue;
|
||||
if (p->Source() == Source && p->Slof() > Frequency && p->Polarization() == toupper(Polarization)) {
|
||||
if (cSource::Matches(p->Source(), Source) && p->Slof() > Frequency && p->Polarization() == toupper(Polarization)) {
|
||||
if (p->IsScr() && Scr && !*Scr) {
|
||||
*Scr = Scrs.GetUnused(Device);
|
||||
if (*Scr)
|
||||
|
14
diseqc.conf
14
diseqc.conf
@ -5,6 +5,9 @@
|
||||
# satellite slof polarization lof command...
|
||||
#
|
||||
# satellite: one of the 'S' codes defined in sources.conf
|
||||
# the special value 'S360E' means that this entry uses a positioner
|
||||
# (command 'P') that can move the dish to any requested satellite
|
||||
# position withing its range
|
||||
# slof: switch frequency of LNB; the first entry with
|
||||
# an slof greater than the actual transponder
|
||||
# frequency will be used
|
||||
@ -18,7 +21,9 @@
|
||||
# V voltage high (18V)
|
||||
# A mini A
|
||||
# B mini B
|
||||
# Sn Satellite channel routing code sequence for bank n follows
|
||||
# Pn use positioner to move dish to satellite position n (or to the
|
||||
# satellite's orbital position, if no position number is given)
|
||||
# Sn satellite channel routing code sequence for bank n follows
|
||||
# Wnn wait nn milliseconds (nn may be any positive integer number)
|
||||
# [xx ...] hex code sequence (max. 6)
|
||||
#
|
||||
@ -88,3 +93,10 @@ S13.0E 99999 H 10600 t V W15 [E0 10 38 F7] W15 B W15 T
|
||||
# S13.0E 99999 V 10600 t V W10 S5 [E0 10 5A 00 00] W10 v
|
||||
# S13.0E 11700 H 9750 t V W10 S6 [E0 10 5A 00 00] W10 v
|
||||
# S13.0E 99999 H 10600 t V W10 S7 [E0 10 5A 00 00] W10 v
|
||||
#
|
||||
# Positioner for steerable dish:
|
||||
#
|
||||
# S360E 11700 V 9750 t V W20 P W20 t v
|
||||
# S360E 99999 V 10600 t V W20 P W20 T v
|
||||
# S360E 11700 H 9750 t V W20 P W20 t V
|
||||
# S360E 99999 H 10600 t V W20 P W20 T V
|
||||
|
43
diseqc.h
43
diseqc.h
@ -4,15 +4,33 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: diseqc.h 2.5 2011/09/17 13:15:17 kls Exp $
|
||||
* $Id: diseqc.h 3.1 2013/06/12 11:52:17 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DISEQC_H
|
||||
#define __DISEQC_H
|
||||
|
||||
#include "config.h"
|
||||
#include "positioner.h"
|
||||
#include "thread.h"
|
||||
|
||||
class cDiseqcPositioner : public cPositioner {
|
||||
private:
|
||||
void SendDiseqc(uint8_t *Codes, int NumCodes);
|
||||
public:
|
||||
cDiseqcPositioner(void);
|
||||
virtual void Drive(ePositionerDirection Direction);
|
||||
virtual void Step(ePositionerDirection Direction, uint Steps = 1);
|
||||
virtual void Halt(void);
|
||||
virtual void SetLimit(ePositionerDirection Direction);
|
||||
virtual void DisableLimits(void);
|
||||
virtual void EnableLimits(void);
|
||||
virtual void StorePosition(uint Number);
|
||||
virtual void RecalcPositions(uint Number);
|
||||
virtual void GotoPosition(uint Number, int Longitude);
|
||||
virtual void GotoAngle(int Longitude);
|
||||
};
|
||||
|
||||
class cScr : public cListObject {
|
||||
private:
|
||||
int devices;
|
||||
@ -35,6 +53,7 @@ class cScrs : public cConfig<cScr> {
|
||||
private:
|
||||
cMutex mutex;
|
||||
public:
|
||||
bool Load(const char *FileName, bool AllowComments = false, bool MustExist = false);
|
||||
cScr *GetUnused(int Device);
|
||||
};
|
||||
|
||||
@ -50,8 +69,11 @@ public:
|
||||
daVoltage18,
|
||||
daMiniA,
|
||||
daMiniB,
|
||||
daPositionN,
|
||||
daPositionA,
|
||||
daScr,
|
||||
daCodes,
|
||||
daWait,
|
||||
};
|
||||
enum { MaxDiseqcCodes = 6 };
|
||||
private:
|
||||
@ -60,12 +82,14 @@ private:
|
||||
int slof;
|
||||
char polarization;
|
||||
int lof;
|
||||
mutable int position;
|
||||
mutable int scrBank;
|
||||
char *commands;
|
||||
bool parsing;
|
||||
uint SetScrFrequency(uint SatFrequency, const cScr *Scr, uint8_t *Codes) const;
|
||||
int SetScrPin(const cScr *Scr, uint8_t *Codes) const;
|
||||
const char *Wait(const char *s) const;
|
||||
const char *GetPosition(const char *s) const;
|
||||
const char *GetScrBank(const char *s) const;
|
||||
const char *GetCodes(const char *s, uchar *Codes = NULL, uint8_t *MaxCodes = NULL) const;
|
||||
public:
|
||||
@ -89,16 +113,31 @@ public:
|
||||
///< Frequency must be the frequency the tuner will be tuned to, and will be
|
||||
///< set to the proper SCR frequency upon return (if SCR is used).
|
||||
int Devices(void) const { return devices; }
|
||||
///< Returns an integer where each bit represents one of the system's devices.
|
||||
///< If a bit is set, this DiSEqC sequence applies to the corresponding device.
|
||||
int Source(void) const { return source; }
|
||||
///< Returns the satellite source this DiSEqC sequence applies to.
|
||||
int Slof(void) const { return slof; }
|
||||
///< Returns the switch frequency of the LNB this DiSEqC sequence applies to.
|
||||
char Polarization(void) const { return polarization; }
|
||||
///< Returns the signal polarization this DiSEqC sequence applies to.
|
||||
int Lof(void) const { return lof; }
|
||||
bool IsScr() const { return scrBank >= 0; }
|
||||
///< Returns the local oscillator frequency of the LNB this DiSEqC sequence applies to.
|
||||
int Position(void) const { return position; }
|
||||
///< Indicates which positioning mode to use in order to move the dish to a given
|
||||
///< satellite position. -1 means "no positioning" (i.e. fixed dish); 0 means the
|
||||
///< positioner can be moved to any arbitrary satellite position (within its
|
||||
///< limits); and a positive number means "move the dish to the position stored
|
||||
///< under the given number".
|
||||
bool IsScr(void) const { return scrBank >= 0; }
|
||||
///< Returns true if this DiSEqC sequence uses Satellite Channel Routing.
|
||||
const char *Commands(void) const { return commands; }
|
||||
///< Returns a pointer to the actual commands of this DiSEqC sequence.
|
||||
};
|
||||
|
||||
class cDiseqcs : public cConfig<cDiseqc> {
|
||||
public:
|
||||
bool Load(const char *FileName, bool AllowComments = false, bool MustExist = false);
|
||||
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.
|
||||
///< If this DiSEqC entry requires SCR and the given *Scr is NULL
|
||||
|
99
dvbdevice.c
99
dvbdevice.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: dvbdevice.c 3.1 2013/04/08 22:13:35 kls Exp $
|
||||
* $Id: dvbdevice.c 3.2 2013/08/17 13:52:05 kls Exp $
|
||||
*/
|
||||
|
||||
#include "dvbdevice.h"
|
||||
@ -284,7 +284,7 @@ bool cDvbTransponderParameters::Parse(const char *s)
|
||||
class cDvbTuner : public cThread {
|
||||
private:
|
||||
static cMutex bondMutex;
|
||||
enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked };
|
||||
enum eTunerStatus { tsIdle, tsSet, tsPositioning, tsTuned, tsLocked };
|
||||
int frontendType;
|
||||
const cDvbDevice *device;
|
||||
int fd_frontend;
|
||||
@ -295,6 +295,9 @@ private:
|
||||
time_t lastTimeoutReport;
|
||||
cChannel channel;
|
||||
const cDiseqc *lastDiseqc;
|
||||
int diseqcOffset;
|
||||
int lastSource;
|
||||
cPositioner *positioner;
|
||||
const cScr *scr;
|
||||
bool lnbPowerTurnedOn;
|
||||
eTunerStatus tunerStatus;
|
||||
@ -309,6 +312,7 @@ private:
|
||||
bool IsBondedMaster(void) const { return !bondedTuner || bondedMaster; }
|
||||
void ClearEventQueue(void) const;
|
||||
bool GetFrontendStatus(fe_status_t &Status) const;
|
||||
cPositioner *GetPositioner(void);
|
||||
void ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency);
|
||||
void ResetToneAndVoltage(void);
|
||||
bool SetFrontend(void);
|
||||
@ -325,6 +329,7 @@ public:
|
||||
bool IsTunedTo(const cChannel *Channel) const;
|
||||
void SetChannel(const cChannel *Channel);
|
||||
bool Locked(int TimeoutMs = 0);
|
||||
const cPositioner *Positioner(void) const { return positioner; }
|
||||
int GetSignalStrength(void) const;
|
||||
int GetSignalQuality(void) const;
|
||||
};
|
||||
@ -343,6 +348,9 @@ cDvbTuner::cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int
|
||||
lockTimeout = 0;
|
||||
lastTimeoutReport = 0;
|
||||
lastDiseqc = NULL;
|
||||
diseqcOffset = 0;
|
||||
lastSource = 0;
|
||||
positioner = NULL;
|
||||
scr = NULL;
|
||||
lnbPowerTurnedOn = false;
|
||||
tunerStatus = tsIdle;
|
||||
@ -482,6 +490,7 @@ void cDvbTuner::SetChannel(const cChannel *Channel)
|
||||
cMutexLock MutexLock(&mutex);
|
||||
if (!IsTunedTo(Channel))
|
||||
tunerStatus = tsSet;
|
||||
diseqcOffset = 0;
|
||||
channel = *Channel;
|
||||
lastTimeoutReport = 0;
|
||||
newSet.Broadcast();
|
||||
@ -662,6 +671,15 @@ static unsigned int FrequencyToHz(unsigned int f)
|
||||
return f;
|
||||
}
|
||||
|
||||
cPositioner *cDvbTuner::GetPositioner(void)
|
||||
{
|
||||
if (!positioner) {
|
||||
positioner = cPositioner::GetPositioner();
|
||||
positioner->SetFrontend(fd_frontend);
|
||||
}
|
||||
return positioner;
|
||||
}
|
||||
|
||||
void cDvbTuner::ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency)
|
||||
{
|
||||
if (!lnbPowerTurnedOn) {
|
||||
@ -673,23 +691,47 @@ void cDvbTuner::ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency)
|
||||
Mutex.Lock();
|
||||
struct dvb_diseqc_master_cmd cmd;
|
||||
const char *CurrentAction = NULL;
|
||||
for (;;) {
|
||||
cPositioner *Positioner = NULL;
|
||||
bool Break = false;
|
||||
for (int i = 0; !Break; i++) {
|
||||
cmd.msg_len = sizeof(cmd.msg);
|
||||
cDiseqc::eDiseqcActions da = Diseqc->Execute(&CurrentAction, cmd.msg, &cmd.msg_len, scr, Frequency);
|
||||
if (da == cDiseqc::daNone)
|
||||
if (da == cDiseqc::daNone) {
|
||||
diseqcOffset = 0;
|
||||
break;
|
||||
}
|
||||
bool d = i >= diseqcOffset;
|
||||
switch (da) {
|
||||
case cDiseqc::daToneOff: CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_OFF)); break;
|
||||
case cDiseqc::daToneOn: CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_ON)); break;
|
||||
case cDiseqc::daVoltage13: CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); break;
|
||||
case cDiseqc::daVoltage18: CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_18)); break;
|
||||
case cDiseqc::daMiniA: CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_BURST, SEC_MINI_A)); break;
|
||||
case cDiseqc::daMiniB: CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_BURST, SEC_MINI_B)); break;
|
||||
case cDiseqc::daCodes: CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_MASTER_CMD, &cmd)); break;
|
||||
case cDiseqc::daToneOff: if (d) CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_OFF)); break;
|
||||
case cDiseqc::daToneOn: if (d) CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_ON)); break;
|
||||
case cDiseqc::daVoltage13: if (d) CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); break;
|
||||
case cDiseqc::daVoltage18: if (d) CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_18)); break;
|
||||
case cDiseqc::daMiniA: if (d) CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_BURST, SEC_MINI_A)); break;
|
||||
case cDiseqc::daMiniB: if (d) CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_BURST, SEC_MINI_B)); break;
|
||||
case cDiseqc::daCodes: if (d) CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_MASTER_CMD, &cmd)); break;
|
||||
case cDiseqc::daPositionN: if ((Positioner = GetPositioner()) != NULL) {
|
||||
if (d) {
|
||||
Positioner->GotoPosition(Diseqc->Position(), cSource::Position(channel.Source()));
|
||||
Break = Positioner->IsMoving();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case cDiseqc::daPositionA: if ((Positioner = GetPositioner()) != NULL) {
|
||||
if (d) {
|
||||
Positioner->GotoAngle(cSource::Position(channel.Source()));
|
||||
Break = Positioner->IsMoving();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case cDiseqc::daScr:
|
||||
case cDiseqc::daWait: break;
|
||||
default: esyslog("ERROR: unknown diseqc command %d", da);
|
||||
}
|
||||
if (Break)
|
||||
diseqcOffset = i + 1;
|
||||
}
|
||||
if (scr)
|
||||
positioner = Positioner;
|
||||
if (scr && !Break)
|
||||
ResetToneAndVoltage(); // makes sure we don't block the bus!
|
||||
if (Diseqc->IsScr())
|
||||
Mutex.Unlock();
|
||||
@ -752,7 +794,7 @@ bool cDvbTuner::SetFrontend(void)
|
||||
if (Setup.DiSEqC) {
|
||||
if (const cDiseqc *diseqc = Diseqcs.Get(device->CardIndex() + 1, channel.Source(), frequency, dtp.Polarization(), &scr)) {
|
||||
frequency -= diseqc->Lof();
|
||||
if (diseqc != lastDiseqc || diseqc->IsScr()) {
|
||||
if (diseqc != lastDiseqc || diseqc->IsScr() || diseqc->Position() >= 0 && channel.Source() != lastSource) {
|
||||
if (IsBondedMaster()) {
|
||||
ExecuteDiseqc(diseqc, &frequency);
|
||||
if (frequency == 0)
|
||||
@ -761,6 +803,7 @@ bool cDvbTuner::SetFrontend(void)
|
||||
else
|
||||
ResetToneAndVoltage();
|
||||
lastDiseqc = diseqc;
|
||||
lastSource = channel.Source();
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -877,15 +920,30 @@ void cDvbTuner::Action(void)
|
||||
int WaitTime = 1000;
|
||||
switch (tunerStatus) {
|
||||
case tsIdle:
|
||||
break;
|
||||
break; // we want the TimedWait() below!
|
||||
case tsSet:
|
||||
tunerStatus = SetFrontend() ? tsTuned : tsIdle;
|
||||
Timer.Set(tuneTimeout + (scr ? rand() % SCR_RANDOM_TIMEOUT : 0));
|
||||
tunerStatus = SetFrontend() ? tsPositioning : tsIdle;
|
||||
continue;
|
||||
case tsPositioning:
|
||||
if (positioner) {
|
||||
if (positioner->IsMoving())
|
||||
break; // we want the TimedWait() below!
|
||||
else if (diseqcOffset) {
|
||||
lastDiseqc = NULL;
|
||||
tunerStatus = tsSet; // have it process the rest of the DiSEqC sequence
|
||||
continue;
|
||||
}
|
||||
}
|
||||
tunerStatus = tsTuned;
|
||||
Timer.Set(tuneTimeout + (scr ? rand() % SCR_RANDOM_TIMEOUT : 0));
|
||||
if (positioner)
|
||||
continue;
|
||||
// otherwise run directly into tsTuned...
|
||||
case tsTuned:
|
||||
if (Timer.TimedOut()) {
|
||||
tunerStatus = tsSet;
|
||||
lastDiseqc = NULL;
|
||||
lastSource = 0;
|
||||
if (time(NULL) - lastTimeoutReport > 60) { // let's not get too many of these
|
||||
isyslog("frontend %d/%d timed out while tuning to channel %d, tp %d", adapter, frontend, channel.Number(), channel.Transponder());
|
||||
lastTimeoutReport = time(NULL);
|
||||
@ -893,10 +951,12 @@ void cDvbTuner::Action(void)
|
||||
continue;
|
||||
}
|
||||
WaitTime = 100; // allows for a quick change from tsTuned to tsLocked
|
||||
// run into tsLocked...
|
||||
case tsLocked:
|
||||
if (Status & FE_REINIT) {
|
||||
tunerStatus = tsSet;
|
||||
lastDiseqc = NULL;
|
||||
lastSource = 0;
|
||||
isyslog("frontend %d/%d was reinitialized", adapter, frontend);
|
||||
lastTimeoutReport = 0;
|
||||
continue;
|
||||
@ -1357,7 +1417,7 @@ void cDvbDevice::UnBond(void)
|
||||
bool cDvbDevice::BondingOk(const cChannel *Channel, bool ConsiderOccupied) const
|
||||
{
|
||||
cMutexLock MutexLock(&bondMutex);
|
||||
if (bondedDevice)
|
||||
if (bondedDevice || Positioner())
|
||||
return dvbTuner && dvbTuner->BondingOk(Channel, ConsiderOccupied);
|
||||
return true;
|
||||
}
|
||||
@ -1539,6 +1599,11 @@ int cDvbDevice::NumProvidedSystems(void) const
|
||||
return numDeliverySystems + numModulations;
|
||||
}
|
||||
|
||||
const cPositioner *cDvbDevice::Positioner(void) const
|
||||
{
|
||||
return dvbTuner ? dvbTuner->Positioner() : NULL;
|
||||
}
|
||||
|
||||
int cDvbDevice::SignalStrength(void) const
|
||||
{
|
||||
return dvbTuner ? dvbTuner->GetSignalStrength() : -1;
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: dvbdevice.h 3.1 2013/04/08 22:13:35 kls Exp $
|
||||
* $Id: dvbdevice.h 3.2 2013/06/01 11:36:18 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DVBDEVICE_H
|
||||
@ -233,6 +233,7 @@ public:
|
||||
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = IDLEPRIORITY, bool *NeedsDetachReceivers = NULL) const;
|
||||
virtual bool ProvidesEIT(void) const;
|
||||
virtual int NumProvidedSystems(void) const;
|
||||
virtual const cPositioner *Positioner(void) const;
|
||||
virtual int SignalStrength(void) const;
|
||||
virtual int SignalQuality(void) const;
|
||||
virtual const cChannel *GetCurrentlyTunedTransponder(void) const;
|
||||
|
30
menu.c
30
menu.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.c 3.2 2013/04/27 10:25:51 kls Exp $
|
||||
* $Id: menu.c 3.3 2013/08/21 10:45:11 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
@ -2971,6 +2971,14 @@ void cMenuSetupLNB::Setup(void)
|
||||
}
|
||||
}
|
||||
|
||||
Add(new cMenuEditBoolItem(tr("Setup.LNB$Use dish positioner"), &data.UsePositioner));
|
||||
if (data.UsePositioner) {
|
||||
Add(new cMenuEditIntxItem(tr("Setup.LNB$Site latitude (degrees)"), &data.SiteLat, -900, 900, 10, tr("South"), tr("North")));
|
||||
Add(new cMenuEditIntxItem(tr("Setup.LNB$Site longitude (degrees)"), &data.SiteLon, -1800, 1800, 10, tr("West"), tr("East")));
|
||||
Add(new cMenuEditIntxItem(tr("Setup.LNB$Max. positioner swing (degrees)"), &data.PositionerSwing, 0, 900, 10));
|
||||
Add(new cMenuEditIntxItem(tr("Setup.LNB$Positioner speed (degrees/s)"), &data.PositionerSpeed, 1, 1800, 10));
|
||||
}
|
||||
|
||||
SetCurrent(Get(current));
|
||||
Display();
|
||||
}
|
||||
@ -2978,6 +2986,7 @@ void cMenuSetupLNB::Setup(void)
|
||||
eOSState cMenuSetupLNB::ProcessKey(eKeys Key)
|
||||
{
|
||||
int oldDiSEqC = data.DiSEqC;
|
||||
int oldUsePositioner = data.UsePositioner;
|
||||
bool DeviceBondingsChanged = false;
|
||||
if (Key == kOk) {
|
||||
cString NewDeviceBondings = satCableNumbers.ToString();
|
||||
@ -2986,7 +2995,7 @@ eOSState cMenuSetupLNB::ProcessKey(eKeys Key)
|
||||
}
|
||||
eOSState state = cMenuSetupBase::ProcessKey(Key);
|
||||
|
||||
if (Key != kNone && data.DiSEqC != oldDiSEqC)
|
||||
if (Key != kNone && (data.DiSEqC != oldDiSEqC || data.UsePositioner != oldUsePositioner))
|
||||
Setup();
|
||||
else if (DeviceBondingsChanged)
|
||||
cDvbDevice::BondDevices(data.DeviceBondings);
|
||||
@ -3625,6 +3634,7 @@ cDisplayChannel::cDisplayChannel(int Number, bool Switched)
|
||||
displayChannel = Skins.Current()->DisplayChannel(withInfo);
|
||||
number = 0;
|
||||
timeout = Switched || Setup.TimeoutRequChInfo;
|
||||
positioner = NULL;
|
||||
channel = Channels.GetByNumber(Number);
|
||||
lastPresent = lastFollowing = NULL;
|
||||
if (channel) {
|
||||
@ -3646,6 +3656,7 @@ cDisplayChannel::cDisplayChannel(eKeys FirstKey)
|
||||
lastTime.Set();
|
||||
withInfo = Setup.ShowInfoOnChSwitch;
|
||||
displayChannel = Skins.Current()->DisplayChannel(withInfo);
|
||||
positioner = NULL;
|
||||
channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
ProcessKey(FirstKey);
|
||||
}
|
||||
@ -3853,7 +3864,7 @@ eOSState cDisplayChannel::ProcessKey(eKeys Key)
|
||||
return osEnd;
|
||||
}
|
||||
};
|
||||
if (!timeout || lastTime.Elapsed() < (uint64_t)(Setup.ChannelInfoTime * 1000)) {
|
||||
if (positioner || !timeout || lastTime.Elapsed() < (uint64_t)(Setup.ChannelInfoTime * 1000)) {
|
||||
if (Key == kNone && !number && group < 0 && !NewChannel && channel && channel->Number() != cDevice::CurrentChannel()) {
|
||||
// makes sure a channel switch through the SVDRP CHAN command is displayed
|
||||
channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
@ -3861,13 +3872,24 @@ eOSState cDisplayChannel::ProcessKey(eKeys Key)
|
||||
lastTime.Set();
|
||||
}
|
||||
DisplayInfo();
|
||||
displayChannel->Flush();
|
||||
if (NewChannel) {
|
||||
SetTrackDescriptions(NewChannel->Number()); // to make them immediately visible in the channel display
|
||||
Channels.SwitchTo(NewChannel->Number());
|
||||
SetTrackDescriptions(NewChannel->Number()); // switching the channel has cleared them
|
||||
channel = NewChannel;
|
||||
}
|
||||
const cPositioner *Positioner = cDevice::ActualDevice()->Positioner();
|
||||
bool PositionerMoving = Positioner && Positioner->IsMoving();
|
||||
SetNeedsFastResponse(PositionerMoving);
|
||||
if (!PositionerMoving) {
|
||||
if (positioner)
|
||||
lastTime.Set(); // to keep the channel display up a few seconds after the target position has been reached
|
||||
Positioner = NULL;
|
||||
}
|
||||
if (Positioner || positioner) // making sure we call SetPositioner(NULL) if there is a switch from "with" to "without" positioner
|
||||
displayChannel->SetPositioner(Positioner);
|
||||
positioner = Positioner;
|
||||
displayChannel->Flush();
|
||||
return osContinue;
|
||||
}
|
||||
return osEnd;
|
||||
|
3
menu.h
3
menu.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.h 2.13 2012/12/07 13:44:13 kls Exp $
|
||||
* $Id: menu.h 3.1 2013/06/01 13:44:57 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __MENU_H
|
||||
@ -120,6 +120,7 @@ private:
|
||||
cTimeMs lastTime;
|
||||
int number;
|
||||
bool timeout;
|
||||
const cPositioner *positioner;
|
||||
cChannel *channel;
|
||||
const cEvent *lastPresent;
|
||||
const cEvent *lastFollowing;
|
||||
|
52
menuitems.c
52
menuitems.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menuitems.c 2.16 2013/02/15 14:20:29 kls Exp $
|
||||
* $Id: menuitems.c 3.1 2013/05/24 10:26:01 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menuitems.h"
|
||||
@ -51,14 +51,14 @@ void cMenuEditItem::SetHelp(const char *Red, const char *Green, const char *Yell
|
||||
helpDisplayed = false;
|
||||
}
|
||||
|
||||
bool cMenuEditItem::DisplayHelp(void)
|
||||
bool cMenuEditItem::DisplayHelp(bool Current)
|
||||
{
|
||||
bool HasHelp = helpRed || helpGreen || helpYellow || helpBlue;
|
||||
if (HasHelp && !helpDisplayed) {
|
||||
if (HasHelp && !helpDisplayed && Current) {
|
||||
cSkinDisplay::Current()->SetButtons(helpRed, helpGreen, helpYellow, helpBlue);
|
||||
cStatus::MsgOsdHelpKeys(helpRed, helpGreen, helpYellow, helpBlue);
|
||||
helpDisplayed = true;
|
||||
}
|
||||
helpDisplayed = Current;
|
||||
return HasHelp;
|
||||
}
|
||||
|
||||
@ -223,6 +223,50 @@ eOSState cMenuEditNumItem::ProcessKey(eKeys Key)
|
||||
return state;
|
||||
}
|
||||
|
||||
// --- cMenuEditIntxItem -----------------------------------------------------
|
||||
|
||||
cMenuEditIntxItem::cMenuEditIntxItem(const char *Name, int *Value, int Min, int Max, int Factor, const char *NegString, const char *PosString)
|
||||
:cMenuEditIntItem(Name, Value, Min, Max)
|
||||
{
|
||||
factor = ::max(Factor, 1);
|
||||
negString = NegString;
|
||||
posString = PosString;
|
||||
Set();
|
||||
}
|
||||
|
||||
void cMenuEditIntxItem::SetHelpKeys(void)
|
||||
{
|
||||
if (negString && posString)
|
||||
SetHelp(NULL, (*value < 0) ? posString : negString);
|
||||
}
|
||||
|
||||
void cMenuEditIntxItem::Set(void)
|
||||
{
|
||||
const char *s = (*value < 0) ? negString : posString;
|
||||
int v = *value;
|
||||
if (negString && posString)
|
||||
v = abs(v);
|
||||
SetValue(cString::sprintf(s ? "%.*f %s" : "%.*f", factor / 10, double(v) / factor, s));
|
||||
SetHelpKeys();
|
||||
}
|
||||
|
||||
eOSState cMenuEditIntxItem::ProcessKey(eKeys Key)
|
||||
{
|
||||
eOSState state = cMenuEditIntItem::ProcessKey(Key);
|
||||
if (state == osUnknown) {
|
||||
switch (Key) {
|
||||
case kGreen: if (negString && posString) {
|
||||
*value = -*value;
|
||||
Set();
|
||||
state = osContinue;
|
||||
}
|
||||
break;
|
||||
default: ;
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
// --- cMenuEditPrcItem ------------------------------------------------------
|
||||
|
||||
cMenuEditPrcItem::cMenuEditPrcItem(const char *Name, double *Value, double Min, double Max, int Decimals)
|
||||
|
15
menuitems.h
15
menuitems.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menuitems.h 2.8 2012/03/13 11:19:11 kls Exp $
|
||||
* $Id: menuitems.h 3.1 2013/05/24 10:19:55 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __MENUITEMS_H
|
||||
@ -27,7 +27,7 @@ public:
|
||||
cMenuEditItem(const char *Name);
|
||||
~cMenuEditItem();
|
||||
void SetValue(const char *Value);
|
||||
bool DisplayHelp(void);
|
||||
bool DisplayHelp(bool Current);
|
||||
};
|
||||
|
||||
class cMenuEditIntItem : public cMenuEditItem {
|
||||
@ -70,6 +70,17 @@ public:
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
};
|
||||
|
||||
class cMenuEditIntxItem : public cMenuEditIntItem {
|
||||
private:
|
||||
int factor;
|
||||
const char *negString, *posString;
|
||||
void SetHelpKeys(void);
|
||||
virtual void Set(void);
|
||||
public:
|
||||
cMenuEditIntxItem(const char *Name, int *Value, int Min = INT_MIN, int Max = INT_MAX, int Factor = 1, const char *NegString = NULL, const char *PosString = NULL);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
};
|
||||
|
||||
class cMenuEditPrcItem : public cMenuEditItem {
|
||||
protected:
|
||||
double *value;
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: osdbase.c 2.7 2012/12/07 09:50:47 kls Exp $
|
||||
* $Id: osdbase.c 3.1 2013/05/24 10:19:31 kls Exp $
|
||||
*/
|
||||
|
||||
#include "osdbase.h"
|
||||
@ -286,7 +286,7 @@ void cOsdMenu::DisplayCurrent(bool Current)
|
||||
if (!Current)
|
||||
item->SetFresh(true); // leaving the current item resets 'fresh'
|
||||
if (cMenuEditItem *MenuEditItem = dynamic_cast<cMenuEditItem *>(item)) {
|
||||
if (!MenuEditItem->DisplayHelp())
|
||||
if (!MenuEditItem->DisplayHelp(Current))
|
||||
DisplayHelp();
|
||||
else
|
||||
helpDisplayed = false;
|
||||
|
33
po/ar.po
33
po/ar.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-02-03 16:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2008-10-16 11:16-0400\n"
|
||||
"Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n"
|
||||
"Language-Team: Arabic <ar@li.org>\n"
|
||||
@ -997,6 +997,33 @@ msgstr "Device %d connected to sat cable"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "own"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "اعادة تشغيل الكامة"
|
||||
|
||||
@ -1334,6 +1361,10 @@ msgstr "بث حى"
|
||||
msgid "PLAY"
|
||||
msgstr "عرض"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG شاشة "
|
||||
|
||||
|
33
po/ca_ES.po
33
po/ca_ES.po
@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2008-03-02 19:02+0100\n"
|
||||
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
|
||||
"Language-Team: Catalan <vdr@linuxtv.org>\n"
|
||||
@ -996,6 +996,33 @@ msgstr "Dispositiu %d connectat a cable sat
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "propi"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Reiniciar CAM"
|
||||
|
||||
@ -1333,6 +1360,10 @@ msgstr "EN DIRECTE"
|
||||
msgid "PLAY"
|
||||
msgstr "REPRODUIR"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "Quadres ST:TNG"
|
||||
|
||||
|
33
po/cs_CZ.po
33
po/cs_CZ.po
@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2010-05-06 11:00+0200\n"
|
||||
"Last-Translator: Aleš Juřík <ajurik@quick.cz>\n"
|
||||
"Language-Team: Czech <vdr@linuxtv.org>\n"
|
||||
@ -996,6 +996,33 @@ msgstr "Zařízení %d připojeno k sat. kabelu"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "vlastní"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Reset CAMu"
|
||||
|
||||
@ -1333,6 +1360,10 @@ msgstr "ŽIVĚ"
|
||||
msgid "PLAY"
|
||||
msgstr "PŘEHRÁVÁNÍ"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG konzola"
|
||||
|
||||
|
33
po/da_DK.po
33
po/da_DK.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
|
||||
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
|
||||
"Language-Team: Danish <vdr@linuxtv.org>\n"
|
||||
@ -993,6 +993,33 @@ msgstr ""
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM nulstil"
|
||||
|
||||
@ -1330,6 +1357,10 @@ msgstr ""
|
||||
msgid "PLAY"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG konsol"
|
||||
|
||||
|
33
po/de_DE.po
33
po/de_DE.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2010-01-16 16:46+0100\n"
|
||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||
@ -993,6 +993,33 @@ msgstr "Device %d angeschlossen an Sat-Kabel"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "eigenes"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr "Antennen-Positionierer benutzen"
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr "Standort Längengrad"
|
||||
|
||||
msgid "South"
|
||||
msgstr "Süd"
|
||||
|
||||
msgid "North"
|
||||
msgstr "Nord"
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr "Standort Breitengrad"
|
||||
|
||||
msgid "West"
|
||||
msgstr "West"
|
||||
|
||||
msgid "East"
|
||||
msgstr "Ost"
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr "Max. Positionier-Winkel (Grad)"
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr "Max. Positionier-Geschwindigkeit (Grad/s)"
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM zurückgesetzt"
|
||||
|
||||
@ -1330,6 +1357,10 @@ msgstr "LIVE"
|
||||
msgid "PLAY"
|
||||
msgstr "WIEDERGABE"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr "Antenne wird auf %.1f gedreht..."
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG-Konsolen"
|
||||
|
||||
|
33
po/el_GR.po
33
po/el_GR.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
|
||||
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
|
||||
"Language-Team: Greek <vdr@linuxtv.org>\n"
|
||||
@ -993,6 +993,33 @@ msgstr ""
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr ""
|
||||
|
||||
@ -1330,6 +1357,10 @@ msgstr ""
|
||||
msgid "PLAY"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ÌïñöÝò ST:TNG"
|
||||
|
||||
|
33
po/es_ES.po
33
po/es_ES.po
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2008-03-02 19:02+0100\n"
|
||||
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
|
||||
"Language-Team: Spanish <vdr@linuxtv.org>\n"
|
||||
@ -994,6 +994,33 @@ msgstr "Dispositivo %d conectado a cable sat
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "propio"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Reset CAM"
|
||||
|
||||
@ -1331,6 +1358,10 @@ msgstr "EN DIRECTO"
|
||||
msgid "PLAY"
|
||||
msgstr "REPRODUCIR"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "Paneles ST:TNG"
|
||||
|
||||
|
33
po/et_EE.po
33
po/et_EE.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
|
||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||
@ -993,6 +993,33 @@ msgstr "DVB seade %d ühendatud SAT-kaabliga"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "oma"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM taaskäivitamine"
|
||||
|
||||
@ -1330,6 +1357,10 @@ msgstr "LIVE"
|
||||
msgid "PLAY"
|
||||
msgstr "ESITUS"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG Panels"
|
||||
|
||||
|
33
po/fi_FI.po
33
po/fi_FI.po
@ -11,7 +11,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2007-08-15 15:52+0200\n"
|
||||
"Last-Translator: Matti Lehtimäki <matti.lehtimaki@gmail.com>\n"
|
||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||
@ -997,6 +997,33 @@ msgstr "DVB-sovitin %d kytketty SAT-kaapeliin"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "oma"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM nollaus"
|
||||
|
||||
@ -1334,6 +1361,10 @@ msgstr "LIVE"
|
||||
msgid "PLAY"
|
||||
msgstr "TOISTO"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG konsoli"
|
||||
|
||||
|
33
po/fr_FR.po
33
po/fr_FR.po
@ -17,7 +17,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-02-24 12:56+0100\n"
|
||||
"Last-Translator: Dominique Plu <dplu@free.fr>\n"
|
||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
||||
@ -1003,6 +1003,33 @@ msgstr "Le périphérique %d est connecté au câble satellite"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "Propriétaire"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM réinitialisé"
|
||||
|
||||
@ -1340,6 +1367,10 @@ msgstr "DIRECT"
|
||||
msgid "PLAY"
|
||||
msgstr "LECTURE"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "Consoles ST:TNG"
|
||||
|
||||
|
33
po/hr_HR.po
33
po/hr_HR.po
@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2008-03-17 19:00+0100\n"
|
||||
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
|
||||
"Language-Team: Croatian <vdr@linuxtv.org>\n"
|
||||
@ -995,6 +995,33 @@ msgstr ""
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Ponovno pokreni CAM"
|
||||
|
||||
@ -1332,6 +1359,10 @@ msgstr ""
|
||||
msgid "PLAY"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG Panele"
|
||||
|
||||
|
33
po/hu_HU.po
33
po/hu_HU.po
@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-03-01 19:22+0200\n"
|
||||
"Last-Translator: István Füley <ifuley@tigercomp.ro>\n"
|
||||
"Language-Team: Hungarian <vdr@linuxtv.org>\n"
|
||||
@ -997,6 +997,33 @@ msgstr "Fejkábel a %d. tunerhez"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "saját"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM újraindítás"
|
||||
|
||||
@ -1334,6 +1361,10 @@ msgstr "ÉLŐ"
|
||||
msgid "PLAY"
|
||||
msgstr "LEJÁTSZÁS"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG Konzol"
|
||||
|
||||
|
33
po/it_IT.po
33
po/it_IT.po
@ -11,7 +11,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-02-11 23:46+0100\n"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||
@ -1000,6 +1000,33 @@ msgstr "Periferica %d connessa al cavo sat"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "propria"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Reimposta la CAM"
|
||||
|
||||
@ -1337,6 +1364,10 @@ msgstr "DAL VIVO"
|
||||
msgid "PLAY"
|
||||
msgstr "RIPRODUCI"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "Consolle ST:TNG"
|
||||
|
||||
|
33
po/lt_LT.po
33
po/lt_LT.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2010-10-30 11:55+0200\n"
|
||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||
@ -993,6 +993,33 @@ msgstr "Įrenginys %d prijungtas prie sat kabelio"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "savas"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Dekodavimo modulis (CAM) perkrautas"
|
||||
|
||||
@ -1330,6 +1357,10 @@ msgstr "GYVAI"
|
||||
msgid "PLAY"
|
||||
msgstr "GROTI"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG Skydeliai"
|
||||
|
||||
|
33
po/mk_MK.po
33
po/mk_MK.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2012-11-19 15:18+0100\n"
|
||||
"Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n"
|
||||
"Language-Team: Macedonian <en@li.org>\n"
|
||||
@ -994,6 +994,33 @@ msgstr "Уред %d поврзан со сателитски кабел"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "свој"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Рестартирај CAM"
|
||||
|
||||
@ -1331,6 +1358,10 @@ msgstr "ЖИВО"
|
||||
msgid "PLAY"
|
||||
msgstr "ПУШТИ"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG Панели"
|
||||
|
||||
|
33
po/nl_NL.po
33
po/nl_NL.po
@ -12,7 +12,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2008-02-26 17:20+0100\n"
|
||||
"Last-Translator: Cedric Dewijs <cedric.dewijs@telfort.nl>\n"
|
||||
"Language-Team: Dutch <vdr@linuxtv.org>\n"
|
||||
@ -998,6 +998,33 @@ msgstr "Apparaat %d verbionden met sat. kabel"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "eigen"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM herstarten"
|
||||
|
||||
@ -1335,6 +1362,10 @@ msgstr "LIVE"
|
||||
msgid "PLAY"
|
||||
msgstr "AFSPELEN"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG Consoles"
|
||||
|
||||
|
33
po/nn_NO.po
33
po/nn_NO.po
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
|
||||
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
|
||||
"Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
|
||||
@ -994,6 +994,33 @@ msgstr ""
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr ""
|
||||
|
||||
@ -1331,6 +1358,10 @@ msgstr ""
|
||||
msgid "PLAY"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr ""
|
||||
|
||||
|
33
po/pl_PL.po
33
po/pl_PL.po
@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2008-03-09 12:59+0100\n"
|
||||
"Last-Translator: Marek Nazarko <mnazarko@gmail.com>\n"
|
||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||
@ -995,6 +995,33 @@ msgstr "Urz
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "W³asny"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM zresetowany"
|
||||
|
||||
@ -1332,6 +1359,10 @@ msgstr "NA
|
||||
msgid "PLAY"
|
||||
msgstr "ODTWARZA"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "Panel ST:TNG"
|
||||
|
||||
|
33
po/pt_PT.po
33
po/pt_PT.po
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2010-03-28 22:49+0100\n"
|
||||
"Last-Translator: Cris Silva <hudokkow@gmail.com>\n"
|
||||
"Language-Team: Portuguese <vdr@linuxtv.org>\n"
|
||||
@ -994,6 +994,33 @@ msgstr ""
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Reiniciar CAM"
|
||||
|
||||
@ -1331,6 +1358,10 @@ msgstr ""
|
||||
msgid "PLAY"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "Consola ST:TNG"
|
||||
|
||||
|
33
po/ro_RO.po
33
po/ro_RO.po
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-02-09 23:01+0100\n"
|
||||
"Last-Translator: Lucian Muresan <lucianm@users.sorceforge.net>\n"
|
||||
"Language-Team: Romanian <vdr@linuxtv.org>\n"
|
||||
@ -995,6 +995,33 @@ msgstr "Receptorul %d conectat la cablul de satelit"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "propriu"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Resetare CAM"
|
||||
|
||||
@ -1332,6 +1359,10 @@ msgstr "LIVE"
|
||||
msgid "PLAY"
|
||||
msgstr "REDARE"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "Cons. ST:TNG"
|
||||
|
||||
|
33
po/ru_RU.po
33
po/ru_RU.po
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-03-10 17:13+0100\n"
|
||||
"Last-Translator: Oleg Roitburd <oroitburd@gmail.com>\n"
|
||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||
@ -994,6 +994,33 @@ msgstr "
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "áÒÞÙ"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM ßÕàÕÓàãÖÕÝ"
|
||||
|
||||
@ -1331,6 +1358,10 @@ msgstr "LIVE"
|
||||
msgid "PLAY"
|
||||
msgstr "²ÞáßàÞØ×ÒÕÔÕÝØÕ"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG ßÐÝÕÛØ"
|
||||
|
||||
|
33
po/sk_SK.po
33
po/sk_SK.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-02-03 16:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-03-04 21:24+0100\n"
|
||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||
@ -993,6 +993,33 @@ msgstr "Zariadenie %d je pripojen
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "vlastný"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Resetnutie CAMu"
|
||||
|
||||
@ -1330,6 +1357,10 @@ msgstr "NA
|
||||
msgid "PLAY"
|
||||
msgstr "PREHRÁVA SA"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG panely"
|
||||
|
||||
|
33
po/sl_SI.po
33
po/sl_SI.po
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-03-04 12:46+0100\n"
|
||||
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
|
||||
"Language-Team: Slovenian <vdr@linuxtv.org>\n"
|
||||
@ -994,6 +994,33 @@ msgstr "Naprava %d priklju
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "lastni"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Reset CAM-a"
|
||||
|
||||
@ -1331,6 +1358,10 @@ msgstr "V
|
||||
msgid "PLAY"
|
||||
msgstr "PREDVAJAJ"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG Konsola"
|
||||
|
||||
|
33
po/sr_RS.po
33
po/sr_RS.po
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-03-16 15:05+0100\n"
|
||||
"Last-Translator: Zoran Turalija <zoran.turalija@gmail.com>\n"
|
||||
"Language-Team: Serbian <vdr@linuxtv.org>\n"
|
||||
@ -994,6 +994,33 @@ msgstr "Ure
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "sopstven"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Ponovno pokreni CAM"
|
||||
|
||||
@ -1331,6 +1358,10 @@ msgstr "U
|
||||
msgid "PLAY"
|
||||
msgstr "REPRODUKCIJA"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG paneli"
|
||||
|
||||
|
33
po/sv_SE.po
33
po/sv_SE.po
@ -11,7 +11,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-02-18 17:04+0100\n"
|
||||
"Last-Translator: Richard Lithvall <r-vdr@boomer.se>\n"
|
||||
"Language-Team: Swedish <vdr@linuxtv.org>\n"
|
||||
@ -997,6 +997,33 @@ msgstr "Enhet %d ansluten till satellitkabel"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "ägare"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM omstart"
|
||||
|
||||
@ -1334,6 +1361,10 @@ msgstr "LIVE"
|
||||
msgid "PLAY"
|
||||
msgstr "SPELA"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG"
|
||||
|
||||
|
33
po/tr_TR.po
33
po/tr_TR.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2008-02-28 00:33+0100\n"
|
||||
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
|
||||
"Language-Team: Turkish <vdr@linuxtv.org>\n"
|
||||
@ -993,6 +993,33 @@ msgstr ""
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM sýfýrlandý"
|
||||
|
||||
@ -1330,6 +1357,10 @@ msgstr ""
|
||||
msgid "PLAY"
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG paneli"
|
||||
|
||||
|
33
po/uk_UA.po
33
po/uk_UA.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-03-04 14:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-02-09 16:00+0100\n"
|
||||
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
|
||||
"Language-Team: Ukrainian <vdr@linuxtv.org>\n"
|
||||
@ -994,6 +994,33 @@ msgstr "Пристрій %d під’єднано до сателітарног
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "власне"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Перезавантаження CAM"
|
||||
|
||||
@ -1331,6 +1358,10 @@ msgstr "ЕФІР"
|
||||
msgid "PLAY"
|
||||
msgstr "ПРОГРАВАННЯ"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG панелі"
|
||||
|
||||
|
33
po/zh_CN.po
33
po/zh_CN.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 2.0.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
|
||||
"POT-Creation-Date: 2013-02-03 16:46+0100\n"
|
||||
"POT-Creation-Date: 2013-06-10 12:16+0200\n"
|
||||
"PO-Revision-Date: 2013-03-04 14:52+0800\n"
|
||||
"Last-Translator: NFVDR <nfvdr@live.com>\n"
|
||||
"Language-Team: Chinese (simplified) <nfvdr@live.com>\n"
|
||||
@ -995,6 +995,33 @@ msgstr "设备%d卫星连接线"
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr "所有"
|
||||
|
||||
msgid "Setup.LNB$Use dish positioner"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site latitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "South"
|
||||
msgstr ""
|
||||
|
||||
msgid "North"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Site longitude (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "West"
|
||||
msgstr ""
|
||||
|
||||
msgid "East"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Max. positioner swing (degrees)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$Positioner speed (degrees/s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM重置"
|
||||
|
||||
@ -1332,6 +1359,10 @@ msgstr "现场"
|
||||
msgid "PLAY"
|
||||
msgstr "播放"
|
||||
|
||||
#, c-format
|
||||
msgid "Moving dish to %.1f..."
|
||||
msgstr ""
|
||||
|
||||
msgid "ST:TNG Panels"
|
||||
msgstr "ST:TNG 面板"
|
||||
|
||||
|
140
positioner.c
Normal file
140
positioner.c
Normal file
@ -0,0 +1,140 @@
|
||||
/*
|
||||
* positioner.c: Steerable dish positioning
|
||||
*
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* For an explanation (in German) of the theory behind the calculations see
|
||||
* http://www.vdr-portal.de/board17-developer/board97-vdr-core/p1154305-grundlagen-und-winkelberechnungen-f%C3%BCr-h-h-diseqc-motor-antennenanlagen
|
||||
*
|
||||
* $Id: positioner.c 3.1 2013/08/21 11:02:52 kls Exp $
|
||||
*/
|
||||
|
||||
#include "positioner.h"
|
||||
#include <math.h>
|
||||
#include "config.h"
|
||||
|
||||
#define SAT_EARTH_RATIO 0.1513 // the Earth's radius, divided by the distance from the Earth's center to the satellite
|
||||
#define SAT_VISIBILITY_LAT 810 // the absolute latitude beyond which no satellite can be seen (degrees * 10)
|
||||
|
||||
#define RAD(x) ((x) * M_PI / 1800)
|
||||
#define DEG(x) ((x) * 1800 / M_PI)
|
||||
|
||||
cPositioner *cPositioner::positioner = NULL;
|
||||
|
||||
cPositioner::cPositioner(void)
|
||||
{
|
||||
capabilities = pcCanNothing;
|
||||
frontend = -1;
|
||||
targetLongitude = lastLongitude = Setup.PositionerLastLon;
|
||||
targetHourAngle = lastHourAngle = CalcHourAngle(lastLongitude);
|
||||
swingTime = 0;
|
||||
delete positioner;
|
||||
positioner = this;
|
||||
}
|
||||
|
||||
cPositioner::~cPositioner()
|
||||
{
|
||||
positioner = NULL;
|
||||
}
|
||||
|
||||
int cPositioner::NormalizeAngle(int Angle)
|
||||
{
|
||||
while (Angle < -1800)
|
||||
Angle += 3600;
|
||||
while (Angle > 1800)
|
||||
Angle -= 3600;
|
||||
return Angle;
|
||||
}
|
||||
|
||||
int cPositioner::CalcHourAngle(int Longitude)
|
||||
{
|
||||
double Delta = RAD(Longitude - Setup.SiteLon);
|
||||
double Lat = RAD(Setup.SiteLat);
|
||||
int Sign = Setup.SiteLat >= 0 ? -1 : 1; // angles to the right are positive, angles to the left are negative
|
||||
return Sign * round(DEG(atan2(sin(Delta), cos(Delta) - cos(Lat) * SAT_EARTH_RATIO)));
|
||||
}
|
||||
|
||||
int cPositioner::CalcLongitude(int HourAngle)
|
||||
{
|
||||
double Lat = RAD(Setup.SiteLat);
|
||||
double Lon = RAD(Setup.SiteLon);
|
||||
double Alpha = RAD(HourAngle);
|
||||
double Delta = Alpha - asin(sin(M_PI - Alpha) * cos(Lat) * SAT_EARTH_RATIO);
|
||||
int Sign = Setup.SiteLat >= 0 ? 1 : -1;
|
||||
return NormalizeAngle(round(DEG(Lon - Sign * Delta)));
|
||||
}
|
||||
|
||||
int cPositioner::HorizonLongitude(ePositionerDirection Direction)
|
||||
{
|
||||
double Delta;
|
||||
if (abs(Setup.SiteLat) < SAT_VISIBILITY_LAT)
|
||||
Delta = acos(SAT_EARTH_RATIO / cos(RAD(Setup.SiteLat)));
|
||||
else
|
||||
Delta = RAD(145);
|
||||
if ((Setup.SiteLat >= 0) != (Direction == pdLeft))
|
||||
Delta = -Delta;
|
||||
return NormalizeAngle(round(DEG(RAD(Setup.SiteLon) + Delta)));
|
||||
}
|
||||
|
||||
int cPositioner::HardLimitLongitude(ePositionerDirection Direction) const
|
||||
{
|
||||
return CalcLongitude(Direction == pdLeft ? -Setup.PositionerSwing : Setup.PositionerSwing);
|
||||
}
|
||||
|
||||
void cPositioner::StartMovementTimer(int Longitude)
|
||||
{
|
||||
if (Setup.PositionerSpeed <= 0)
|
||||
return;
|
||||
cMutexLock MutexLock(&mutex);
|
||||
lastLongitude = CurrentLongitude(); // in case the dish was already in motion
|
||||
targetLongitude = Longitude;
|
||||
lastHourAngle = CalcHourAngle(lastLongitude);
|
||||
targetHourAngle = CalcHourAngle(targetLongitude);
|
||||
swingTime = abs(targetHourAngle - lastHourAngle) * 1000 / Setup.PositionerSpeed; // time (ms) it takes to move the dish from lastHourAngle to targetHourAngle
|
||||
movementStart.Set();
|
||||
Setup.PositionerLastLon = targetLongitude;
|
||||
}
|
||||
|
||||
void cPositioner::GotoPosition(uint Number, int Longitude)
|
||||
{
|
||||
if (Longitude != targetLongitude)
|
||||
dsyslog("moving positioner to position %d, longitude %d", Number, Longitude);
|
||||
StartMovementTimer(Longitude);
|
||||
}
|
||||
|
||||
void cPositioner::GotoAngle(int Longitude)
|
||||
{
|
||||
if (Longitude != targetLongitude)
|
||||
dsyslog("moving positioner to longitude %d", Longitude);
|
||||
StartMovementTimer(Longitude);
|
||||
}
|
||||
|
||||
int cPositioner::CurrentLongitude(void) const
|
||||
{
|
||||
cMutexLock MutexLock(&mutex);
|
||||
if (targetLongitude != lastLongitude) {
|
||||
int Elapsed = movementStart.Elapsed(); // it's important to make this 'int', otherwise the expression below yields funny results
|
||||
if (swingTime <= Elapsed)
|
||||
lastLongitude = targetLongitude;
|
||||
else
|
||||
return CalcLongitude(lastHourAngle + (targetHourAngle - lastHourAngle) * Elapsed / swingTime);
|
||||
}
|
||||
return lastLongitude;
|
||||
}
|
||||
|
||||
bool cPositioner::IsMoving(void) const
|
||||
{
|
||||
cMutexLock MutexLock(&mutex);
|
||||
return CurrentLongitude() != targetLongitude;
|
||||
}
|
||||
|
||||
cPositioner *cPositioner::GetPositioner(void)
|
||||
{
|
||||
return positioner;
|
||||
}
|
||||
|
||||
void cPositioner::DestroyPositioner(void)
|
||||
{
|
||||
delete positioner;
|
||||
}
|
171
positioner.h
Normal file
171
positioner.h
Normal file
@ -0,0 +1,171 @@
|
||||
/*
|
||||
* positioner.h: Steerable dish positioning
|
||||
*
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: positioner.h 3.1 2013/06/10 14:27:14 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __POSITIONER_H
|
||||
#define __POSITIONER_H
|
||||
|
||||
#include "thread.h"
|
||||
#include "tools.h"
|
||||
|
||||
/// 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"). Therefore, moving the dish
|
||||
/// "east" or "west" means something different on either hemisphere. From the local dish
|
||||
/// motor's point of view, it makes more sense to speak of turning the dish "left" or
|
||||
/// "right", which is independent of the actual hemisphere the dish is located in.
|
||||
/// In the cPositioner class context, when a dish on the northern hemisphere moves "east",
|
||||
/// it is considered to be moving "left". Imagine standing behind the dish and looking
|
||||
/// towards the satellites, and clearly "east" is "left". On the southern hemisphere
|
||||
/// the same move to the "left" would go to the "west". So on the hardware level it is
|
||||
/// clear what "left" and "right" means. The user interface may present different labels
|
||||
/// to the viewer, depending on the hemisphere the dish is on.
|
||||
/// All angles in this context are given in "degrees * 10", which allows for an angular
|
||||
/// resolution of 0.1 degrees.
|
||||
|
||||
class cPositioner {
|
||||
private:
|
||||
mutable cMutex mutex;
|
||||
static cPositioner *positioner;
|
||||
int capabilities;
|
||||
int frontend; // file descriptor of the DVB frontend
|
||||
mutable int lastLongitude; // the longitude the dish has last been moved to
|
||||
int targetLongitude; // the longitude the dish is supposed to be moved to
|
||||
mutable int lastHourAngle; // the hour angle the positioner has last been moved to
|
||||
int targetHourAngle; // the hour angle the positioner is supposed to be moved to
|
||||
int swingTime;
|
||||
cTimeMs movementStart;
|
||||
protected:
|
||||
cPositioner(void);
|
||||
virtual ~cPositioner();
|
||||
void SetCapabilities(int Capabilities) { capabilities = Capabilities; }
|
||||
///< A derived class shall call this function in its constructor to set the
|
||||
///< capability flags it supports.
|
||||
int Frontend(void) const { return frontend; }
|
||||
///< Returns the file descriptor of the DVB frontend the positioner is
|
||||
///< connected to. If the positioner is not connected to any DVB device,
|
||||
///< -1 will be returned.
|
||||
static int CalcHourAngle(int Longitude);
|
||||
///< Takes the longitude and latitude of the dish location from the system
|
||||
///< setup and the given Longitude to calculate the "hour angle" to which to move
|
||||
///< the dish to in order to point to the satellite at orbital position Longitude.
|
||||
///< An hour angle of zero means the dish shall point directly towards the
|
||||
///< celestial equator (which is south on the northern hemisphere, and north on
|
||||
///< the southern hemisphere). Negative values mean that the dish needs to be
|
||||
///< moved to the left (as seen from behind the dish), while positive values
|
||||
///< require a movement to the right.
|
||||
static int CalcLongitude(int HourAngle);
|
||||
///< Returns the longitude of the satellite position the dish points at when the
|
||||
///< positioner is moved to the given HourAngle.
|
||||
void StartMovementTimer(int Longitude);
|
||||
///< Starts a timer that estimates how long it will take to move the dish from
|
||||
///< the current position to the one given by Longitude. The default implementation
|
||||
///< of CurrentLongitude() uses this timer.
|
||||
public:
|
||||
enum ePositionerCapabilities {
|
||||
pcCanNothing = 0x0000,
|
||||
pcCanDrive = 0x0001,
|
||||
pcCanStep = 0x0002,
|
||||
pcCanHalt = 0x0004,
|
||||
pcCanSetLimits = 0x0008,
|
||||
pcCanDisableLimits = 0x0010,
|
||||
pcCanEnableLimits = 0x0020,
|
||||
pcCanStorePosition = 0x0040,
|
||||
pcCanRecalcPositions = 0x0080,
|
||||
pcCanGotoPosition = 0x0100,
|
||||
pcCanGotoAngle = 0x0200,
|
||||
};
|
||||
enum ePositionerDirection { pdLeft, pdRight };
|
||||
static int NormalizeAngle(int Angle);
|
||||
///< Normalizes the given Angle into the range -1800...1800.
|
||||
int Capabilities(void) const { return capabilities; }
|
||||
///< Returns a flag word defining all the things this positioner is
|
||||
///< capable of.
|
||||
void SetFrontend(int Frontend) { frontend = Frontend; }
|
||||
///< This function is called whenever the positioner is connected to
|
||||
///< a DVB frontend.
|
||||
static int HorizonLongitude(ePositionerDirection Direction);
|
||||
///< Returns the longitude of the satellite position that is just at the
|
||||
///< horizon when looking in the given Direction. Note that this function
|
||||
///< only delivers reasonable values for site latitudes between +/-81 degrees.
|
||||
///< Beyond these limits (i.e. near the north or south pole) a constant value
|
||||
///< of +/-14.5 degrees (integer value 145) will be returned.
|
||||
int HardLimitLongitude(ePositionerDirection Direction) const;
|
||||
///< Returns the longitude of the positioner's hard limit in the given
|
||||
///< Direction. Note that the value returned here may be larger (or smaller,
|
||||
///< depending on the Direction) than that returned by HorizonLongitude(),
|
||||
///< which would mean that it lies below that horizon.
|
||||
int LastLongitude(void) const { return lastLongitude; }
|
||||
///< Returns the longitude the dish has last been moved to.
|
||||
int TargetLongitude(void) const { return targetLongitude; }
|
||||
///< Returns the longitude the dish is supposed to be moved to. Once the target
|
||||
///< longitude has been reached, this is the same as the value returned by
|
||||
///< CurrentLongitude().
|
||||
virtual cString Error(void) const { return NULL; }
|
||||
///< Returns a short, single line string indicating an error condition (if
|
||||
///< the positioner is able to report any errors).
|
||||
///< NULL means there is no error.
|
||||
virtual void Drive(ePositionerDirection Direction) {}
|
||||
///< Continuously move the dish to the given Direction until Halt() is
|
||||
///< called or it hits the soft or hard limit.
|
||||
virtual void Step(ePositionerDirection Direction, uint Steps = 1) {}
|
||||
///< Move the dish the given number of Steps in the given Direction.
|
||||
///< The maximum number of steps a particular positioner can do in a single
|
||||
///< call may be limited.
|
||||
///< A "step" is the smallest possible movement the positioner can make, which
|
||||
///< is typically 0.1 degrees.
|
||||
virtual void Halt(void) {}
|
||||
///< Stop any ongoing motion of the dish.
|
||||
virtual void SetLimit(ePositionerDirection Direction) {}
|
||||
///< Set the soft limit of the dish movement in the given Direction to the
|
||||
///< current position.
|
||||
virtual void DisableLimits(void) {}
|
||||
///< Disables the soft limits for the dish movement.
|
||||
virtual void EnableLimits(void) {}
|
||||
///< Enables the soft limits for the dish movement.
|
||||
virtual void StorePosition(uint Number) {}
|
||||
///< Store the current position as a satellite position with the given Number.
|
||||
///< Number can be in the range 1...255. However, a particular positioner
|
||||
///< may only have a limited number of satellite positions it can store.
|
||||
virtual void RecalcPositions(uint Number) {}
|
||||
///< Take the difference betwen the current actual position of the dish and
|
||||
///< the position stored with teh given Number, and apply the difference to
|
||||
///< all stored positions.
|
||||
virtual void GotoPosition(uint Number, int Longitude);
|
||||
///< Move the dish to the satellite position stored under the given Number.
|
||||
///< Number must be one of the values previously used with StorePosition().
|
||||
///< The special value 0 shall move the dish to a "reference position",
|
||||
///< which usually is due south (or north, if you're on the southern hemisphere).
|
||||
///< Longitude will be used to calculate how long it takes to move the dish
|
||||
///< from its current position to the given Longitude.
|
||||
///< A derived class must call the base class function to have the target
|
||||
///< longitude stored.
|
||||
virtual void GotoAngle(int Longitude);
|
||||
///< Move the dish to the given angular position. Longitude can be in the range
|
||||
///< -1800...+1800. A positive sign indicates a position east of Greenwich,
|
||||
///< while western positions have a negative sign. The absolute value is in
|
||||
///< "degrees * 10", which allows for a resolution of 1/10 of a degree.
|
||||
///< A derived class must call the base class function to have the target
|
||||
///< longitude stored.
|
||||
virtual int CurrentLongitude(void) const;
|
||||
///< Returns the longitude the dish currently points to. If the dish is in motion,
|
||||
///< this may be an estimate based on the angular speed of the positioner.
|
||||
///< The default implementation takes the last and target longitude as well as
|
||||
///< the rotation speed of the positioner to calculate the estimated current
|
||||
///< longitude the dish points to.
|
||||
virtual bool IsMoving(void) const;
|
||||
///< Returns true if the dish is currently moving as a result of a call to
|
||||
///< GotoPosition() or GotoAngle().
|
||||
static cPositioner *GetPositioner(void);
|
||||
///< Returns a previously created positioner. If no plugin has created
|
||||
///< a positioner, there will always be the default DiSEqC positioner.
|
||||
static void DestroyPositioner(void);
|
||||
///< Destroys a previously created positioner.
|
||||
};
|
||||
|
||||
#endif //__POSITIONER_H
|
69
skinlcars.c
69
skinlcars.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: skinlcars.c 3.2 2013/05/19 12:04:09 kls Exp $
|
||||
* $Id: skinlcars.c 3.3 2013/08/18 13:45:36 kls Exp $
|
||||
*/
|
||||
|
||||
// "Star Trek: The Next Generation"(R) is a registered trademark of Paramount Pictures,
|
||||
@ -27,6 +27,7 @@
|
||||
#include "font.h"
|
||||
#include "menu.h"
|
||||
#include "osd.h"
|
||||
#include "positioner.h"
|
||||
#include "themes.h"
|
||||
#include "videodir.h"
|
||||
|
||||
@ -299,6 +300,44 @@ static void DrawDeviceSignal(cOsd *Osd, const cDevice *Device, int x0, int y0, i
|
||||
}
|
||||
}
|
||||
|
||||
static void DrawDevicePosition(cOsd *Osd, const cPositioner *Positioner, int x0, int y0, int x1, int y1, int &LastCurrent)
|
||||
{
|
||||
int HorizonLeft = Positioner->HorizonLongitude(cPositioner::pdLeft);
|
||||
int HorizonRight = Positioner->HorizonLongitude(cPositioner::pdRight);
|
||||
int HardLimitLeft = cPositioner::NormalizeAngle(HorizonLeft - Positioner->HardLimitLongitude(cPositioner::pdLeft));
|
||||
int HardLimitRight = cPositioner::NormalizeAngle(Positioner->HardLimitLongitude(cPositioner::pdRight) - HorizonRight);
|
||||
int HorizonDelta = cPositioner::NormalizeAngle(HorizonLeft - HorizonRight);
|
||||
int Current = cPositioner::NormalizeAngle(HorizonLeft - Positioner->CurrentLongitude());
|
||||
int Target = cPositioner::NormalizeAngle(HorizonLeft - Positioner->TargetLongitude());
|
||||
int d = (y1 - y0) / 2;
|
||||
int w = x1 - x0 - 2 * d;
|
||||
int l = max(x0 + d, x0 + d + w * HardLimitLeft / HorizonDelta);
|
||||
int r = min(x1 - d, x1 - d - w * HardLimitRight / HorizonDelta) - 1;
|
||||
int c = constrain(x0 + d + w * Current / HorizonDelta, l, r);
|
||||
int t = constrain(x0 + d + w * Target / HorizonDelta, l, r);
|
||||
if (c == LastCurrent)
|
||||
return;
|
||||
if (c > t)
|
||||
swap(c, t);
|
||||
tColor ColorRange, ColorMove;
|
||||
if (TwoColors) {
|
||||
ColorRange = Theme.Color(clrChannelFrameBg);
|
||||
ColorMove = Theme.Color(clrBackground);
|
||||
}
|
||||
else {
|
||||
ColorRange = Theme.Color(clrChannelFrameBg);
|
||||
ColorMove = Theme.Color(clrDeviceBg);
|
||||
}
|
||||
Osd->DrawRectangle(x0, y0, x1 - 1, y1 - 1, Theme.Color(clrBackground));
|
||||
Osd->DrawEllipse(l - d, y0, l, y1 - 1, ColorRange, 7);
|
||||
Osd->DrawRectangle(l, y0, r, y1 - 1, ColorRange);
|
||||
Osd->DrawEllipse(r, y0, r + d, y1 - 1, ColorRange, 5);
|
||||
Osd->DrawEllipse(c - d, y0, c, y1 - 1, ColorMove, 7);
|
||||
Osd->DrawRectangle(c, y0, t, y1 - 1, ColorMove);
|
||||
Osd->DrawEllipse(t, y0, t + d, y1 - 1, ColorMove, 5);
|
||||
LastCurrent = c;
|
||||
}
|
||||
|
||||
// --- cSkinLCARSDisplayChannel ----------------------------------------------
|
||||
|
||||
class cSkinLCARSDisplayChannel : public cSkinDisplayChannel {
|
||||
@ -317,6 +356,7 @@ private:
|
||||
bool initial;
|
||||
cString lastDate;
|
||||
int lastSeen;
|
||||
int lastCurrentPosition;
|
||||
int lastDeviceNumber;
|
||||
cString lastDeviceType;
|
||||
cCamSlot *lastCamSlot;
|
||||
@ -336,6 +376,7 @@ public:
|
||||
virtual void SetChannel(const cChannel *Channel, int Number);
|
||||
virtual void SetEvents(const cEvent *Present, const cEvent *Following);
|
||||
virtual void SetMessage(eMessageType Type, const char *Text);
|
||||
virtual void SetPositioner(const cPositioner *Positioner);
|
||||
virtual void Flush(void);
|
||||
};
|
||||
|
||||
@ -352,6 +393,7 @@ cSkinLCARSDisplayChannel::cSkinLCARSDisplayChannel(bool WithInfo)
|
||||
initial = true;
|
||||
present = NULL;
|
||||
lastSeen = -1;
|
||||
lastCurrentPosition = -1;
|
||||
lastDeviceNumber = -1;
|
||||
lastCamSlot = NULL;
|
||||
lastSignalStrength = -1;
|
||||
@ -458,6 +500,8 @@ void cSkinLCARSDisplayChannel::DrawTrack(void)
|
||||
|
||||
void cSkinLCARSDisplayChannel::DrawSeen(int Current, int Total)
|
||||
{
|
||||
if (lastCurrentPosition >= 0)
|
||||
return; // to not interfere with SetPositioner()
|
||||
int Seen = (Total > 0) ? min(xc07 - xc06, int((xc07 - xc06) * double(Current) / Total)) : 0;
|
||||
if (initial || Seen != lastSeen) {
|
||||
int y0 = yc11 - ShowSeenExtent;
|
||||
@ -532,9 +576,14 @@ void cSkinLCARSDisplayChannel::SetChannel(const cChannel *Channel, int Number)
|
||||
osd->DrawText(xc00, yc00, ChNumber, Theme.Color(clrChannelFrameFg), frameColor, tallFont, xc02 - xc00, yc02 - yc00, taTop | taRight | taBorder);
|
||||
osd->DrawText(xc03, yc00, ChName, Theme.Color(clrChannelName), Theme.Color(clrBackground), tallFont, xi - xc03 - lineHeight, 0, taTop | taLeft);
|
||||
lastSignalDisplay = 0;
|
||||
if (withInfo)
|
||||
if (withInfo) {
|
||||
if (Channel) {
|
||||
int x = xc00 + (yc10 - yc09); // compensate for the arc
|
||||
osd->DrawText(x, yc07, cSource::ToString(Channel->Source()), Theme.Color(clrChannelFrameFg), frameColor, cFont::GetFont(fontOsd), xc02 - x, yc10 - yc07, taTop | taRight | taBorder);
|
||||
}
|
||||
DrawDevice();
|
||||
}
|
||||
}
|
||||
|
||||
void cSkinLCARSDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following)
|
||||
{
|
||||
@ -587,6 +636,20 @@ void cSkinLCARSDisplayChannel::SetMessage(eMessageType Type, const char *Text)
|
||||
}
|
||||
}
|
||||
|
||||
void cSkinLCARSDisplayChannel::SetPositioner(const cPositioner *Positioner)
|
||||
{
|
||||
if (Positioner) {
|
||||
int y0 = yc11 - ShowSeenExtent;
|
||||
int y1 = yc11 + lineHeight / 2 - Gap / 2;
|
||||
DrawDevicePosition(osd, Positioner, xc06, y0, xc07, y1, lastCurrentPosition);
|
||||
}
|
||||
else {
|
||||
lastCurrentPosition = -1;
|
||||
initial = true; // to have DrawSeen() refresh the progress bar
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void cSkinLCARSDisplayChannel::Flush(void)
|
||||
{
|
||||
if (withInfo) {
|
||||
@ -1345,6 +1408,8 @@ void cSkinLCARSDisplayMenu::DrawLive(const cChannel *Channel)
|
||||
if (initial || Channel != lastChannel) {
|
||||
osd->DrawText(xa00, yt00, itoa(Channel->Number()), Theme.Color(clrChannelFrameFg), Theme.Color(clrChannelFrameBg), tallFont, xa02 - xa00, yt02 - yt00, taTop | taRight | taBorder);
|
||||
osd->DrawText(xa03, yt00, Channel->Name(), Theme.Color(clrChannelName), Theme.Color(clrBackground), tallFont, xd00 - xa03, yd01 - yd00, taTop | taLeft);
|
||||
int x = xa00 + (yc03 - yc02); // compensate for the arc
|
||||
osd->DrawText(x, yc00, cSource::ToString(Channel->Source()), Theme.Color(clrChannelFrameFg), Theme.Color(clrChannelFrameBg), cFont::GetFont(fontOsd), xa02 - x, yc03 - yc00, taTop | taRight | taBorder);
|
||||
lastChannel = Channel;
|
||||
DrawSeen(0, 0);
|
||||
}
|
||||
|
18
skins.c
18
skins.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: skins.c 2.10 2012/06/02 11:44:14 kls Exp $
|
||||
* $Id: skins.c 3.1 2013/08/18 12:07:22 kls Exp $
|
||||
*/
|
||||
|
||||
#include "skins.h"
|
||||
@ -63,6 +63,22 @@ cSkinDisplay::~cSkinDisplay()
|
||||
current = NULL;
|
||||
}
|
||||
|
||||
// --- cSkinDisplayChannel ---------------------------------------------------
|
||||
|
||||
cSkinDisplayChannel::cSkinDisplayChannel(void)
|
||||
{
|
||||
positioner = NULL;
|
||||
}
|
||||
|
||||
void cSkinDisplayChannel::SetPositioner(const cPositioner *Positioner)
|
||||
{
|
||||
if (positioner && Positioner != positioner)
|
||||
SetMessage(mtInfo, NULL);
|
||||
positioner = Positioner;
|
||||
if (positioner)
|
||||
SetMessage(mtInfo, cString::sprintf(tr("Moving dish to %.1f..."), double(positioner->TargetLongitude()) / 10));
|
||||
}
|
||||
|
||||
// --- cSkinDisplayMenu ------------------------------------------------------
|
||||
|
||||
cSkinDisplayMenu::cSkinDisplayMenu(void)
|
||||
|
17
skins.h
17
skins.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: skins.h 2.9 2012/12/21 11:09:13 kls Exp $
|
||||
* $Id: skins.h 3.1 2013/08/21 10:29:10 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __SKINS_H
|
||||
@ -14,6 +14,7 @@
|
||||
#include "epg.h"
|
||||
#include "keys.h"
|
||||
#include "osd.h"
|
||||
#include "positioner.h"
|
||||
#include "recording.h"
|
||||
#include "themes.h"
|
||||
#include "thread.h"
|
||||
@ -52,7 +53,10 @@ class cSkinDisplayChannel : public cSkinDisplay {
|
||||
///< This class is used to display the current channel, together with
|
||||
///< the present and following EPG event. How and to what extent this
|
||||
///< is done is totally up to the derived class.
|
||||
private:
|
||||
const cPositioner *positioner;
|
||||
public:
|
||||
cSkinDisplayChannel(void);
|
||||
virtual void SetChannel(const cChannel *Channel, int Number) = 0;
|
||||
///< Sets the current channel to Channel. If Number is not 0, the
|
||||
///< user is in the process of entering a channel number, which must
|
||||
@ -65,6 +69,17 @@ public:
|
||||
///< to determine, e.g., the colors for displaying the Text.
|
||||
///< If Text is NULL, any previously displayed message must be removed, and
|
||||
///< any previous contents overwritten by the message must be restored.
|
||||
virtual void SetPositioner(const cPositioner *Positioner);
|
||||
///< Sets the Positioner used to move the satellite dish. The skin may use the
|
||||
///< data provided by Positioner to implement some form of progress display,
|
||||
///< since moving the dish may take a while. This function will only be called
|
||||
///< if the device receiving the current live channel actually uses a positioner,
|
||||
///< and it will be called with NULL once the dish has reached its target
|
||||
///< position (or the user switches to a channel that doesn't require positioning
|
||||
///< the dish). While the dish is moving, SetPositioner() is called repeatedly,
|
||||
///< so the skin has a chance to update the progress display.
|
||||
///< The default implementation calls SetMessage() with a text that indicates
|
||||
///< that the dish is being moved to a new position.
|
||||
/*TODO
|
||||
SetButtons
|
||||
Red = Video options
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: sources.c 3.3 2013/05/23 09:41:54 kls Exp $
|
||||
* $Id: sources.c 3.4 2013/05/23 10:20:28 kls Exp $
|
||||
*/
|
||||
|
||||
#include "sources.h"
|
||||
@ -37,6 +37,13 @@ bool cSource::Parse(const char *s)
|
||||
return code != stNone && description && *description;
|
||||
}
|
||||
|
||||
bool cSource::Matches(int Code1, int Code2)
|
||||
{
|
||||
if (Code1 == (stSat | st_Any))
|
||||
return IsSat(Code2);
|
||||
return Code1 == Code2;
|
||||
}
|
||||
|
||||
int cSource::Position(int Code)
|
||||
{
|
||||
int n = (Code & st_Pos);
|
||||
|
@ -179,6 +179,8 @@ S135W AMC 10
|
||||
S137W AMC 7
|
||||
S139W AMC 8
|
||||
|
||||
S360E Any satellite
|
||||
|
||||
# Cable
|
||||
|
||||
C DVB-C
|
||||
|
12
sources.h
12
sources.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: sources.h 3.1 2013/04/11 10:23:16 kls Exp $
|
||||
* $Id: sources.h 3.2 2013/08/21 10:27:32 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __SOURCES_H
|
||||
@ -22,6 +22,7 @@ public:
|
||||
stTerr = ('T' << 24),
|
||||
st_Mask = 0xFF000000,
|
||||
st_Pos = 0x0000FFFF,
|
||||
st_Any = 0x00000E10, // 3600 - special value indicating "any position"
|
||||
};
|
||||
private:
|
||||
int code;
|
||||
@ -33,12 +34,19 @@ public:
|
||||
int Code(void) const { return code; }
|
||||
int Position(void) { return Position(code); }
|
||||
///< Returns the orbital position of the satellite in case this is a DVB-S
|
||||
///< source (zero otherwise). The returned value is in the range -1800...+1800.
|
||||
///< source (zero otherwise). The returned value is in the range -1800...+1800,
|
||||
///< except for the special value 3600, which indicates "any position". This is
|
||||
///< used with positioners that can move the dish to any requested satellite
|
||||
///< within their range.
|
||||
///< A positive sign indicates a position east of Greenwich, while western
|
||||
///< positions have a negative sign. The absolute value is in "degrees * 10",
|
||||
///< which allows for a resolution of 1/10 of a degree.
|
||||
const char *Description(void) const { return description; }
|
||||
bool Parse(const char *s);
|
||||
static bool Matches(int Code1, int Code2);
|
||||
///< Returns true if Code2 matches Code1. This is simply a check whether the
|
||||
///< two codes are equal, except for the special case that Code1 is stSat|st_Any,
|
||||
///< in which case it matches any Code2 that is stSat.
|
||||
static int Position(int Code);
|
||||
static char ToChar(int Code) { return (Code & st_Mask) >> 24; }
|
||||
static cString ToString(int Code);
|
||||
|
6
tools.c
6
tools.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: tools.c 2.29 2012/12/07 09:00:00 kls Exp $
|
||||
* $Id: tools.c 3.1 2013/05/23 10:10:00 kls Exp $
|
||||
*/
|
||||
|
||||
#include "tools.h"
|
||||
@ -691,12 +691,12 @@ void cTimeMs::Set(int Ms)
|
||||
begin = Now() + Ms;
|
||||
}
|
||||
|
||||
bool cTimeMs::TimedOut(void)
|
||||
bool cTimeMs::TimedOut(void) const
|
||||
{
|
||||
return Now() >= begin;
|
||||
}
|
||||
|
||||
uint64_t cTimeMs::Elapsed(void)
|
||||
uint64_t cTimeMs::Elapsed(void) const
|
||||
{
|
||||
return Now() - begin;
|
||||
}
|
||||
|
8
tools.h
8
tools.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: tools.h 2.24 2013/02/17 13:18:06 kls Exp $
|
||||
* $Id: tools.h 3.1 2013/08/21 08:49:48 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TOOLS_H
|
||||
@ -64,6 +64,8 @@ void syslog_with_tid(int priority, const char *format, ...) __attribute__ ((form
|
||||
#define BCDCHARTOINT(x) (10 * ((x & 0xF0) >> 4) + (x & 0xF))
|
||||
int BCD2INT(int x);
|
||||
|
||||
#define IsBitSet(v, b) ((v) & (1 << (b))) // checks if the bit at index b is set in v, where the least significant bit has index 0
|
||||
|
||||
// Unfortunately there are no platform independent macros for unaligned
|
||||
// access, so we do it this way:
|
||||
|
||||
@ -330,8 +332,8 @@ public:
|
||||
///< time.
|
||||
static uint64_t Now(void);
|
||||
void Set(int Ms = 0);
|
||||
bool TimedOut(void);
|
||||
uint64_t Elapsed(void);
|
||||
bool TimedOut(void) const;
|
||||
uint64_t Elapsed(void) const;
|
||||
};
|
||||
|
||||
class cReadLine {
|
||||
|
3
vdr.5
3
vdr.5
@ -8,7 +8,7 @@
|
||||
.\" License as specified in the file COPYING that comes with the
|
||||
.\" vdr distribution.
|
||||
.\"
|
||||
.\" $Id: vdr.5 2.36 2013/03/29 10:25:56 kls Exp $
|
||||
.\" $Id: vdr.5 3.1 2013/08/11 13:50:42 kls Exp $
|
||||
.\"
|
||||
.TH vdr 5 "31 Mar 2013" "2.0" "Video Disk Recorder Files"
|
||||
.SH NAME
|
||||
@ -483,6 +483,7 @@ l l.
|
||||
\fBV\fR@voltage high (18V)
|
||||
\fBA\fR@mini A
|
||||
\fBB\fR@mini B
|
||||
\fBPn\fR@use positioner to move dish to satellite position n (or to the satellite's orbital position, if no position number is given)
|
||||
\fBSn\fR@Satellite channel routing code sequence for bank n follows
|
||||
\fBWnn\fR@wait nn milliseconds (nn may be any positive integer number)
|
||||
\fB[xx ...]\fR@hex code sequence (max. 6)
|
||||
|
8
vdr.c
8
vdr.c
@ -22,7 +22,7 @@
|
||||
*
|
||||
* The project's page is at http://www.tvdr.de
|
||||
*
|
||||
* $Id: vdr.c 2.57 2013/03/15 10:44:54 kls Exp $
|
||||
* $Id: vdr.c 3.1 2013/06/10 14:28:43 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
@ -800,6 +800,11 @@ int main(int argc, char *argv[])
|
||||
if (AudioCommand)
|
||||
new cExternalAudio(AudioCommand);
|
||||
|
||||
// Positioner:
|
||||
|
||||
if (!cPositioner::GetPositioner()) // no plugin has created a positioner
|
||||
new cDiseqcPositioner;
|
||||
|
||||
// Channel:
|
||||
|
||||
if (!cDevice::WaitForAllDevicesReady(DEVICEREADYTIMEOUT))
|
||||
@ -1400,6 +1405,7 @@ Exit:
|
||||
Setup.Save();
|
||||
}
|
||||
cDevice::Shutdown();
|
||||
cPositioner::DestroyPositioner();
|
||||
EpgHandlers.Clear();
|
||||
PluginManager.Shutdown(true);
|
||||
cSchedules::Cleanup(true);
|
||||
|
Loading…
Reference in New Issue
Block a user