Fix SIGNALSTRENGTH in vdr 2.0.3 TechniSat SkyStar 2 DVB-S rev 2.3P - dvbdevice.c

Message ID 525A6119.8060807@tiscali.it
State New
Headers

Commit Message

guido.cordaro@tiscali.it Oct. 13, 2013, 9 a.m. UTC
  Il 13/10/2013 10:51, guido.cordaro@tiscali.it ha scritto:
> Thanks Klaus Schmidinger
>
> For having responded to my e-mail
>
> This' modified code that you send as an attachment ...
>
> Files created with " diff -urN <orig> <mod>> new.diff "
>
> Guido Cordaro
>
>
>
>
> Il 12/10/2013 23:08, Klaus Schmidinger ha scritto:
>> On 12.10.2013 21:21, knap.home wrote:
>>> With this change to the source I was able to run properly "SIGNAL 
>>> STRENGTH."
>>>
>>> Using the device Netsystem TechniSat SkyStar 2 DVB-S rev 2.3P.
>>>
>>> Great as a solution ...
>>>
>>> Modified Source -> /usr/local/src/vdr-2.0.3/dvbdevice.c
>>
>> Please send just the differences (diff -u) between the original and the
>> modified code. I'm afraid even though I tried I can't seem to generate
>> a proper diff from what you've posted. And please send it as an 
>> attachment,
>> not inline (lines get wrapped).
>>
>> Klaus
>>
>> _______________________________________________
>> vdr mailing list
>> vdr@linuxtv.org
>> http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr
>
  

Comments

Klaus Schmidinger Oct. 13, 2013, 9:53 a.m. UTC | #1
On 13.10.2013 11:00, guido.cordaro@tiscali.it wrote:
> Il 13/10/2013 10:51, guido.cordaro@tiscali.it ha scritto:
>> Thanks Klaus Schmidinger
>>
>> For having responded to my e-mail
>>
>> This' modified code that you send as an attachment ...
>>
>> Files created with " diff -urN <orig> <mod>> new.diff "

Can you please elaborate on these changes?
Why did you pull stuff like FE_HAS_..., BER and UNC (as used in GetSignalQuality()) into
GetSignalStrength()?
I can't accept the changes to Min- and MaxSignal in case of the "TT-budget S2-3200".
I have such cards and they work fine with the original values.

I'm really not sure what to make of your patch. It appears to me
like randomly winging in things that just may or may not work.
Unless you can give me some reasonable and clear arguments as to
why things should be changed that way, I'm afraid I can't accept this.

Klaus
  

Patch

--- /home/knap/Patch/vdr-2.0.3/dvbdevice.c	2013-09-01 23:04:05.000000000 +0200
+++ /home/knap/Patch/dvbdevice.c	2013-10-13 10:34:27.489228803 +0200
@@ -532,33 +532,110 @@ 
 //#define DEBUG_SIGNALSTRENGTH
 //#define DEBUG_SIGNALQUALITY
 
+// Inizio Modifica
+
+#define LOCK_THRESHOLD 5 // indicates that all 5 FE_HAS_* flags are set
+
 int cDvbTuner::GetSignalStrength(void) const
 {
-  ClearEventQueue();
-  uint16_t Signal;
-  while (1) {
-        if (ioctl(fd_frontend, FE_READ_SIGNAL_STRENGTH, &Signal) != -1)
-           break;
-        if (errno != EINTR)
-           return -1;
+  fe_status_t Status;
+  if (GetFrontendStatus(Status)) {
+     // Actually one would expect these checks to be done from FE_HAS_SIGNAL to FE_HAS_LOCK, but some drivers (like the stb0899) are broken, so FE_HAS_LOCK is the only one that (hopefully) is generally reliable...
+     if ((Status & FE_HAS_LOCK) == 0) {
+        if ((Status & FE_HAS_SIGNAL) == 0)
+           return 0;
+        if ((Status & FE_HAS_CARRIER) == 0)
+           return 1;
+        if ((Status & FE_HAS_VITERBI) == 0)
+           return 2;
+        if ((Status & FE_HAS_SYNC) == 0)
+           return 3;
+        return 4;
         }
-  uint16_t MaxSignal = 0xFFFF; // Let's assume the default is using the entire range.
-  // Use the subsystemId to identify individual devices in case they need
-  // special treatment to map their Signal value into the range 0...0xFFFF.
-  switch (subsystemId) {
-    case 0x13C21019: // TT-budget S2-3200 (DVB-S/DVB-S2)
-    case 0x1AE40001: // TechniSat SkyStar HD2 (DVB-S/DVB-S2)
-                     MaxSignal = 670; break;
-    }
-  int s = int(Signal) * 100 / MaxSignal;
-  if (s > 100)
-     s = 100;
 #ifdef DEBUG_SIGNALSTRENGTH
-  fprintf(stderr, "FE %d/%d: %08X S = %04X %04X %3d%%\n", adapter, frontend, subsystemId, MaxSignal, Signal, s);
+     bool HasSignal = true;
+#endif
+     uint16_t Signal;
+     while (1) {
+          if (ioctl(fd_frontend, FE_READ_SIGNAL_STRENGTH, &Signal) != -1)
+              break;
+           if (errno != EINTR) {
+              Signal = 0xFFFF;
+#ifdef DEBUG_SIGNALSTRENGTH
+              HasSignal = false;
+#endif
+              break;
+              }
+           }
+#ifdef DEBUG_SIGNALSTRENGTH
+     bool HasBer = true;
+#endif
+     uint32_t Ber;
+     while (1) {
+           if (ioctl(fd_frontend, FE_READ_BER, &Ber) != -1)
+              break;
+           if (errno != EINTR) {
+              Ber = 0;
+#ifdef DEBUG_SIGNALSTRENGTH
+              HasBer = false;
 #endif
-  return s;
+              break;
+              }
+           }
+#ifdef DEBUG_SIGNALSTRENGTH
+     bool HasUnc = true;
+#endif
+     uint32_t Unc;
+     while (1) {
+           if (ioctl(fd_frontend, FE_READ_UNCORRECTED_BLOCKS, &Unc) != -1)
+              break;
+           if (errno != EINTR) {
+              Unc = 0;
+#ifdef DEBUG_SIGNALSTRENGTH
+              HasUnc = false;
+#endif
+              break;
+              }
+           }
+     uint16_t MinSignal = 0x0000;
+     uint16_t MaxSignal = 0xFFFF; // Let's assume the default is using the entire range.
+     // Use the subsystemId to identify individual devices in case they need
+     // special treatment to map their Snr value into the range 0...0xFFFF.
+     switch (subsystemId) {
+       case 0x13C21019: // TT-budget S2-3200 (DVB-S/DVB-S2)
+       case 0x1AE40001: // TechniSat SkyStar HD2 (DVB-S/DVB-S2)
+                        if (frontendType == SYS_DVBS2) {
+                           MinSignal = 10;
+                           MaxSignal = 70;
+                           }
+                        else
+//                           MaxSignal = 200;
+                           MaxSignal = 670;
+
+                        break;
+       case 0x20130245: // PCTV Systems PCTV 73ESE
+       case 0x2013024F: // PCTV Systems nanoStick T2 290e
+//                        MaxSignal = 255; break;
+                            MaxSignal = 670;
+
+       }
+     int a = int(constrain(Signal, MinSignal, MaxSignal)) * 350 / (MaxSignal - MinSignal);
+     int b = 100 - (Unc * 10 + (Ber / 256) * 5);
+     if (b < 0)
+        b = 0;
+     int s = LOCK_THRESHOLD + a * b * (100 - LOCK_THRESHOLD) / 100 / 100;
+     if (s > 100)
+        s = 100;
+    #ifdef DEBUG_SIGNALSTRENGTH
+     fprintf(stderr, "FE %d/%d: %08X S = %04X %04X %d %5d %5d %3d%%\n", adapter, frontend, subsystemId, MaxSignal, Signal, HasSignal, HasBer ? int(Ber) : -1, HasUnc ? int(Unc) : -1, s);
+#endif
+     return s;
+     }
+  return -1;
 }
 
+// Fine Modifica
+
 #define LOCK_THRESHOLD 5 // indicates that all 5 FE_HAS_* flags are set
 
 int cDvbTuner::GetSignalQuality(void) const