Frontend drivers don't have to implement all monitoring callbacks. So
expect -EOPNOTSUPP and handle it properly.
---
 util/femon/femon.c |   75 +++++++++++++++++++++++++++++++++--------------------
 1 file changed, 48 insertions(+), 27 deletions(-)

--- dvb-apps-3ee111da5b3a.orig/util/femon/femon.c       2013-06-03 
17:22:56.923398598 +0200
+++ dvb-apps-3ee111da5b3a/util/femon/femon.c    2013-06-03 17:23:16.946398895 
+0200
@@ -67,6 +67,7 @@ int check_frontend (struct dvbfe_handle
        struct dvbfe_info fe_info;
        unsigned int samples = 0;
        FILE *ttyFile=NULL;
+       int got_info;
        
        // We dont write the "beep"-codes to stdout but to /dev/tty1.
        // This is neccessary for Thin-Client-Systems or Streaming-Boxes
@@ -89,39 +90,59 @@ int check_frontend (struct dvbfe_handle
        }
 
        do {
-               if (dvbfe_get_info(fe, FE_STATUS_PARAMS, &fe_info, 
DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0) != FE_STATUS_PARAMS) {
+               got_info = dvbfe_get_info(fe, FE_STATUS_PARAMS, &fe_info, 
DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0);
+               if (got_info & DVBFE_INFO_LOCKSTATUS) {
+                       printf ("status %c%c%c%c%c | ",
+                               fe_info.signal ? 'S' : ' ',
+                               fe_info.carrier ? 'C' : ' ',
+                               fe_info.viterbi ? 'V' : ' ',
+                               fe_info.sync ? 'Y' : ' ',
+                               fe_info.lock ? 'L' : ' ');
+               } else {
                        fprintf(stderr, "Problem retrieving frontend 
information: %m\n");
+                       printf ("status ----- | ");
                }
 
 
-               printf ("status %c%c%c%c%c | ",
-                       fe_info.signal ? 'S' : ' ',
-                       fe_info.carrier ? 'C' : ' ',
-                       fe_info.viterbi ? 'V' : ' ',
-                       fe_info.sync ? 'Y' : ' ',
-                       fe_info.lock ? 'L' : ' ');
-
                if (human_readable) {
-                       // SNR should be in units of 0.1 dB but some drivers do
-                       // not follow that rule, thus this heuristic.
-                       if (fe_info.snr < 1000)
-                               printf ("signal %3u%% | snr %4.1fdB | ber %d | 
unc %d | ",
-                                       (fe_info.signal_strength * 100) / 
0xffff,
-                                       fe_info.snr / 10.,
-                                       fe_info.ber,
-                                       fe_info.ucblocks);
-                       else
-                               printf ("signal %3u%% | snr %3u%% | ber %d | 
unc %d | ",
-                                       (fe_info.signal_strength * 100) / 
0xffff,
-                                       (fe_info.snr * 100) / 0xffff,
-                                       fe_info.ber,
-                                       fe_info.ucblocks);
+                       if (got_info & DVBFE_INFO_SIGNAL_STRENGTH)
+                               printf ("signal %3u%% | ", 
(fe_info.signal_strength * 100) / 0xffff);
+                       else
+                               printf ("signal ---%% | ");
+                       if (got_info & DVBFE_INFO_SNR) {
+                               // SNR should be in units of 0.1 dB but some 
drivers do
+                               // not follow that rule, thus this heuristic.
+                               if (fe_info.snr < 1000)
+                                       printf ("snr %4.1fdB | ", fe_info.snr / 
10.);
+                               else
+                                       printf ("snr %3u%% | ", (fe_info.snr * 
100) / 0xffff);
+                       } else
+                               printf ("snr ---- | ");
+                       if (got_info & DVBFE_INFO_BER)
+                               printf ("ber %d | ", fe_info.ber);
+                       else
+                               printf ("ber - | ");
+                       if (got_info & DVBFE_INFO_UNCORRECTED_BLOCKS)
+                               printf ("unc %d | ", fe_info.ucblocks);
+                       else
+                               printf ("unc - | ");
                } else {
-                       printf ("signal %04x | snr %04x | ber %08x | unc %08x | 
",
-                               fe_info.signal_strength,
-                               fe_info.snr,
-                               fe_info.ber,
-                               fe_info.ucblocks);
+                       if (got_info & DVBFE_INFO_SIGNAL_STRENGTH)
+                               printf ("signal %04x | ", 
fe_info.signal_strength);
+                       else
+                               printf ("signal ---- | ");
+                       if (got_info & DVBFE_INFO_SNR)
+                               printf ("snr %04x | ", fe_info.snr);
+                       else
+                               printf ("snr ---- | ");
+                       if (got_info & DVBFE_INFO_BER)
+                               printf ("ber %08x | ", fe_info.ber);
+                       else
+                               printf ("ber -------- | ");
+                       if (got_info & DVBFE_INFO_UNCORRECTED_BLOCKS)
+                               printf ("unc %08x | ", fe_info.ucblocks);
+                       else
+                               printf ("unc -------- | ");
                }
 
                if (fe_info.lock)

-- 
Jean Delvare
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to