dvbv5-scan: use library support for stats print
authorMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 24 Jan 2013 19:30:59 +0000 (17:30 -0200)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 24 Jan 2013 19:36:07 +0000 (17:36 -0200)
Use the libdvbv5 support to display status.

Now, an ISDB-T channel scanning will look like:

INFO     Scanning frequency #1 485142857
Lock   (0x1f) Quality= Poor Signal= 6.25% C/N= 17.05dB postBER= 517x10^-3 preBER= 505x10^-3 PER= 927x10^-3
  Layer A: Quality= Poor C/N= 12.82dB postBER= 2.10x10^-3 preBER= 35.5x10^-3 PER= 62.6x10^-3
  Layer B: Quality= Poor C/N= 17.81dB postBER= 15.6x10^-3 preBER= 83.4x10^-3 PER= 939x10^-3
Service #0 (59833) GLOBO 1SEG channel 4.0
Service #1 (59808) GLOBO HD channel 4.1
INFO     Scanning frequency #2 527142857
RF     (0x01): Tuning failed.
INFO     Scanning frequency #3 593142857
RF     (0x01): Tuning failed.
INFO     Scanning frequency #4 629142857
Lock   (0x1f) Quality= Poor Signal= 6.25% C/N= 10.98dB postBER= 872x10^-6 preBER= 21.7x10^-3 PER= 11.4x10^-3
  Layer A: Quality= Good C/N= 8.74dB postBER= 0 preBER= 2.38x10^-3 PER= 0
  Layer B: Quality= Poor C/N= 13.13dB postBER= 914x10^-6 preBER= 22.2x10^-3 PER= 11.9x10^-3
Service #0 (60696) RECORD 1SEG channel 8.0
Service #1 (60672) RECORD HD channel 8.1
INFO     Scanning frequency #5 725142857
Lock   (0x1f) Quality= Good Signal= 6.25% C/N= 17.90dB postBER= 1.58x10^-3 preBER= 26.0x10^-3 PER= 0
  Layer A: Quality= Good C/N= 19.33dB postBER= 0 preBER= 26.0x10^-3 PER= 0
  Layer B: Quality= Good C/N= 17.53dB postBER= 1.66x10^-3 preBER= 22.2x10^-3 PER= 0
Service #0 (60320) BAND HD channel 6.0
Service #1 (60345) BAND 1SEG channel 6.1

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
utils/dvb/dvbv5-scan.c

index bb31ab0..161d7f0 100644 (file)
@@ -91,77 +91,69 @@ static int verbose = 0;
                fprintf(stderr, " (%s)\n", strerror(errno));            \
        } while (0)
 
-static char *sig_bits[7] = {
-       [0] = "RF sig",
-       [1] = "Carrier",
-       [2] = "Viterbi",
-       [3] = "Sync",
-       [4] = "Lock",
-       [5] = "Timeout",
-       [6] = "Reinit",
-};
-
-static void print_frontend_stats(struct dvb_v5_fe_parms *parms)
+static int print_frontend_stats(struct dvb_v5_fe_parms *parms)
 {
-       char buf[256], *p = buf;
-       int i, s, len = sizeof(buf);
-       fe_status_t status;
-       uint32_t snr = 0, _signal = 0;
-       uint32_t ber = 0, ucb = 0;
+       char buf[512], *p;
+       int rc, i, len, show, n_status_lines = 0;
+       uint32_t status = 0;
 
-       if (dvb_fe_retrieve_stats(parms, DTV_STATUS, &status)) {
-               fprintf(stderr, "Error: dvb_fe_get_stats failed: no status\n");
-               return;
+       rc = dvb_fe_get_stats(parms);
+       if (rc) {
+               PERROR("dvb_fe_get_stats failed");
+               return -1;
        }
 
-       /* Get the most significative status */
-       for (i = ARRAY_SIZE(sig_bits) - 1; i >= 0 ; i--) {
-               if ((1 << i) & status) {
-                       s = snprintf(p, len, "%-7s ", sig_bits[i]);
-                       break;
-               }
-       }
-       if (i < 0)
-               s = snprintf(p, len, "%7s ", "");
-       p += s;
-       len -= s;
-
-       /* Add the status bits */
-       s = snprintf(p, len, "(0x%02x) ", status);
-       p += s;
-       len -= s;
-
-       if (!dvb_fe_retrieve_stats(parms, DTV_SIGNAL_STRENGTH, &_signal)) {
-               s = snprintf(p, len, "| signal %03.2f%% ",
-                            (_signal * 100.0) / 0xffff);
-               p += s;
-               len -= s;
-       }
-       if (!dvb_fe_retrieve_stats(parms, DTV_SNR, &snr)) {
-               s = snprintf(p, len, "| snr %5d ", snr);
-               p += s;
-               len -= s;
-       }
+       p = buf;
+       len = sizeof(buf);
+       dvb_fe_snprintf_stat(parms,  DTV_STATUS, NULL, 0, &p, &len, &show);
 
-       if (!dvb_fe_retrieve_stats(parms, DTV_BER, &ber)) {
-               s = snprintf(p, len, "| ber %6d ", ber);
-               p += s;
-               len -= s;
+       /* While not lock, display status on a new line */
+       dvb_fe_retrieve_stats(parms, DTV_STATUS, &status);
+       if (!(status & FE_HAS_LOCK)) {
+               fprintf(stderr, "%s: Tuning failed.\n", buf);
+               return 0;
        }
 
-       if (!dvb_fe_retrieve_stats(parms, DTV_UNCORRECTED_BLOCKS,
-                                   &ucb)) {
-               s = snprintf(p, len, "| ucb %6d ", ucb);
-               p += s;
-               len -= s;
+       for (i = 0; i < MAX_DTV_STATS; i++) {
+               show = 1;
+
+               dvb_fe_snprintf_stat(parms, DTV_QUALITY, "Quality",
+                                    i, &p, &len, &show);
+
+               dvb_fe_snprintf_stat(parms, DTV_STAT_SIGNAL_STRENGTH, "Signal",
+                                    i, &p, &len, &show);
+
+               dvb_fe_snprintf_stat(parms, DTV_STAT_CNR, "C/N",
+                                    i, &p, &len, &show);
+
+               dvb_fe_snprintf_stat(parms, DTV_STAT_ERROR_BLOCK_COUNT, "UCB",
+                                    i,  &p, &len, &show);
+
+               dvb_fe_snprintf_stat(parms, DTV_BER, "postBER",
+                                    i,  &p, &len, &show);
+
+               dvb_fe_snprintf_stat(parms, DTV_PRE_BER, "preBER",
+                                    i,  &p, &len, &show);
+
+               dvb_fe_snprintf_stat(parms, DTV_PER, "PER",
+                                    i,  &p, &len, &show);
+
+               if (p != buf) {
+                       if (n_status_lines)
+                               fprintf(stderr, "\t%s\n", buf);
+                       else
+                               fprintf(stderr, "%s\n", buf);
+
+                       n_status_lines++;
+
+                       p = buf;
+                       len = sizeof(buf);
+               }
        }
 
-       if (!(status & FE_HAS_LOCK))
-               s = snprintf(p, len, "| failed\n");
-       else
-               s = snprintf(p, len, "\n");
+       fflush(stderr);
 
-       fprintf(stderr, "%s", buf);
+       return 0;
 }
 
 static int check_frontend(struct dvb_v5_fe_parms *parms, int timeout)