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
