From 53ef55410c7d5532151e9fba1ac5ab8eda553715 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Thu, 11 Apr 2013 10:40:47 +0200 Subject: [PATCH] Changed the sign of the satellite position value in cSource to reflect the standard of western values being negative --- HISTORY | 3 +++ sources.c | 23 ++++++++++++++--------- sources.h | 9 ++++++++- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/HISTORY b/HISTORY index 7a048cce..06e0b605 100644 --- a/HISTORY +++ b/HISTORY @@ -7809,3 +7809,6 @@ Video Disk Recorder Revision History Dolze). - Fixed handling '/' and '~' in recording file names in case DirectoryEncoding is used (thanks to Lars Hanisch). +- Changed the sign of the satellite position value in cSource to reflect the standard + of western values being negative. The new member function cSource::Position() can be + used to retrieve the orbital position of a satellite. diff --git a/sources.c b/sources.c index f39318a6..94df64c6 100644 --- a/sources.c +++ b/sources.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: sources.c 3.1 2013/04/09 11:10:30 kls Exp $ + * $Id: sources.c 3.2 2013/04/11 10:24:05 kls Exp $ */ #include "sources.h" @@ -37,17 +37,22 @@ bool cSource::Parse(const char *s) return code != stNone && description && *description; } +int cSource::Position(int Code) +{ + int n = (Code & st_Pos); + if (n > 0x00007FFF) + n |= 0xFFFF0000; + return n; +} + cString cSource::ToString(int Code) { char buffer[16]; char *q = buffer; *q++ = (Code & st_Mask) >> 24; - int n = (Code & st_Pos); - if (n > 0x00007FFF) - n |= 0xFFFF0000; - if (n) { + if (int n = Position(Code)) { q += snprintf(q, sizeof(buffer) - 2, "%u.%u", abs(n) / 10, abs(n) % 10); // can't simply use "%g" here since the silly 'locale' messes up the decimal point - *q++ = (n < 0) ? 'E' : 'W'; + *q++ = (n < 0) ? 'W' : 'E'; } *q = 0; return buffer; @@ -69,8 +74,8 @@ int cSource::FromString(const char *s) break; case '.': dot = true; break; - case 'E': neg = true; // fall through to 'W' - case 'W': if (!dot) + case 'W': neg = true; // fall through to 'E' + case 'E': if (!dot) pos *= 10; break; default: esyslog("ERROR: unknown source character '%c'", *s); @@ -93,7 +98,7 @@ int cSource::FromData(eSourceType SourceType, int Position, bool East) { int code = SourceType; if (SourceType == stSat) { - if (East) + if (!East) Position = -Position; code |= (Position & st_Pos); } diff --git a/sources.h b/sources.h index 516a3edc..e40b2b1d 100644 --- a/sources.h +++ b/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 2.4 2012/06/17 11:19:23 kls Exp $ + * $Id: sources.h 3.1 2013/04/11 10:23:16 kls Exp $ */ #ifndef __SOURCES_H @@ -31,8 +31,15 @@ public: cSource(char Source, const char *Description); ~cSource(); 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. + ///< 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 int Position(int Code); static char ToChar(int Code) { return (Code & st_Mask) >> 24; } static cString ToString(int Code); static int FromString(const char *s);