This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/v4l-utils.git tree:

Subject: dvbv5-zap, dvbv5-scan: Improve error status logic
Author:  Mauro Carvalho Chehab <[email protected]>
Date:    Sun Aug 19 14:47:55 2012 -0300

Only display stats when the frontend is returning values for
them.

Signed-off-by: Mauro Carvalho Chehab <[email protected]>

 utils/dvb/dvbv5-scan.c |   98 ++++++++++++++++++++++++++++++++++++++----------
 utils/dvb/dvbv5-zap.c  |   88 +++++++++++++++++++++++++++++++------------
 2 files changed, 141 insertions(+), 45 deletions(-)

---

http://git.linuxtv.org/v4l-utils.git?a=commitdiff;h=c6b2cee3114b8707738e2406821151b944505481

diff --git a/utils/dvb/dvbv5-scan.c b/utils/dvb/dvbv5-scan.c
index 3b19cdb..39f699a 100644
--- a/utils/dvb/dvbv5-scan.c
+++ b/utils/dvb/dvbv5-scan.c
@@ -91,12 +91,83 @@ 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)
+{
+       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;
+
+       if (dvb_fe_retrieve_stats(parms, DTV_STATUS, &status)) {
+               fprintf(stderr, "Error: dvb_fe_get_stats failed: no status\n");
+               return;
+       }
+
+       /* 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;
+       }
+
+       if (!dvb_fe_retrieve_stats(parms, DTV_BER, &ber)) {
+               s = snprintf(p, len, "| ber %6d ", ber);
+               p += s;
+               len -= s;
+       }
+
+       if (!dvb_fe_retrieve_stats(parms, DTV_UNCORRECTED_BLOCKS,
+                                   &ucb)) {
+               s = snprintf(p, len, "| ucb %6d ", ucb);
+               p += s;
+               len -= s;
+       }
+
+       fprintf(stderr, "%s", buf);
+
+       if (!(status & FE_HAS_LOCK))
+               printf("| tune failed\n");
+       else
+               printf("\n");
+}
+
 static int check_frontend(struct dvb_v5_fe_parms *parms, int timeout)
 {
        int rc, i;
        fe_status_t status;
-       uint32_t snr = 0, _signal = 0;
-       uint32_t ber = 0, uncorrected_blocks = 0;
 
        for (i = 0; i < timeout * 10; i++) {
                rc = dvb_fe_get_stats(parms);
@@ -104,29 +175,16 @@ static int check_frontend(struct dvb_v5_fe_parms *parms, 
int timeout)
                        PERROR("dvb_fe_get_stats failed");
 
                rc = dvb_fe_retrieve_stats(parms, DTV_STATUS, &status);
+               if (rc)
+                       status = 0;
                if (status & FE_HAS_LOCK)
                        break;
                usleep(100000);
        };
-       dvb_fe_retrieve_stats(parms, DTV_STATUS, &status);
-       dvb_fe_retrieve_stats(parms, DTV_BER, &ber);
-       dvb_fe_retrieve_stats(parms, DTV_SIGNAL_STRENGTH, &_signal);
-       dvb_fe_retrieve_stats(parms, DTV_UNCORRECTED_BLOCKS,
-                                   &uncorrected_blocks);
-       dvb_fe_retrieve_stats(parms, DTV_SNR, &snr);
-
-       printf("status %02x | signal %3u%% | snr %3u%% | ber %d | unc %d ",
-               status, (_signal * 100) / 0xffff, (snr * 100) / 0xffff,
-               ber, uncorrected_blocks);
-
-       if (status & FE_HAS_LOCK)
-               printf("| FE_HAS_LOCK\n");
-       else {
-               printf("| tune failed\n");
-               return -1;
-       }
 
-       return 0;
+       print_frontend_stats(parms);
+
+       return (status & FE_HAS_LOCK) ? 0 : -1;
 }
 
 static int new_freq_is_needed(struct dvb_entry *entry,
diff --git a/utils/dvb/dvbv5-zap.c b/utils/dvb/dvbv5-zap.c
index 57dda83..8541c74 100644
--- a/utils/dvb/dvbv5-zap.c
+++ b/utils/dvb/dvbv5-zap.c
@@ -272,45 +272,83 @@ static void do_timeout(int x)
        }
 }
 
-static int old_status = 0;
+static char *sig_bits[7] = {
+       [0] = "RF sig",
+       [1] = "Carrier",
+       [2] = "Viterbi",
+       [3] = "Sync",
+       [4] = "Lock",
+       [5] = "Timeout",
+       [6] = "Reinit",
+};
 
 static int print_frontend_stats(struct dvb_v5_fe_parms *parms)
 {
-       char stats[256];
-       int rc;
+       char buf[256], *p = buf;
+       int rc, i, s, len = sizeof(buf);
        fe_status_t status;
        uint32_t snr = 0, _signal = 0;
-       uint32_t ber = 0, uncorrected_blocks = 0;
+       uint32_t ber = 0, ucb = 0;
 
        rc = dvb_fe_get_stats(parms);
-       if (rc < 0) {
+       if (rc) {
                PERROR("dvb_fe_get_stats failed");
                return -1;
        }
 
-       rc = dvb_fe_retrieve_stats(parms, DTV_STATUS, &status);
+       if (dvb_fe_retrieve_stats(parms, DTV_STATUS, &status)) {
+               fprintf(stderr, "Error: dvb_fe_get_stats failed: no status\n");
+               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;
+       }
+       
+       if (!dvb_fe_retrieve_stats(parms, DTV_BER, &ber)) {
+               s = snprintf(p, len, "| ber %6d ", ber);
+               p += s;
+               len -= s;
+       }
 
-       rc += dvb_fe_retrieve_stats(parms, DTV_BER, &ber);
-       rc += dvb_fe_retrieve_stats(parms, DTV_SIGNAL_STRENGTH, &_signal);
-       rc += dvb_fe_retrieve_stats(parms, DTV_UNCORRECTED_BLOCKS,
-                                   &uncorrected_blocks);
-       rc += dvb_fe_retrieve_stats(parms, DTV_SNR, &snr);
+       if (!dvb_fe_retrieve_stats(parms, DTV_UNCORRECTED_BLOCKS,
+                                   &ucb)) {
+               s = snprintf(p, len, "| ucb %6d ", ucb);
+               p += s;
+               len -= s;
+       }
 
-       fprintf(stderr,
-               "\rstatus 0x%02x | signal %3.2f%% | snr %3.2f%% | ber %6d | unc 
%d | ",
-               status, (_signal * 100.0) / 0xffff, (snr * 100.0) / 0xffff,
-               ber, uncorrected_blocks);
+       fprintf(stderr, "\r%s", buf);
+       fflush(stderr);
 
-       if (status & FE_HAS_LOCK) {
-               fprintf(stderr, "FE_HAS_LOCK    ");
-               if (!(old_status & FE_HAS_LOCK)) {
-                       fflush(stderr);
-                       dvb_fe_get_parms(parms);
-               }
-       } else {
+       /* While not lock, display status on a new line */
+       if (!(status & FE_HAS_LOCK))
                fprintf(stderr, "\n");
-       }
-       old_status = status;
 
        return 0;
 }
@@ -322,7 +360,7 @@ static int check_frontend(struct arguments *args,
        fe_status_t status;
        do {
                rc = dvb_fe_get_stats(parms);
-               if (rc < 0)
+               if (rc)
                        PERROR("dvb_fe_get_stats failed");
 
                rc = dvb_fe_retrieve_stats(parms, DTV_STATUS, &status);

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to