utils/dvb: Implement get_status/get_event
authorMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 9 Oct 2011 09:43:38 +0000 (06:43 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 7 Jan 2012 13:12:11 +0000 (11:12 -0200)
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
utils/dvb/dvb-fe.c
utils/dvb/dvb-fe.h

index 180d8c9..6890284 100644 (file)
@@ -253,8 +253,7 @@ int dvb_fe_store_parm(struct dvb_v5_fe_parms *parms,
        return EINVAL;
 }
 
-
-int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms)
+static int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms)
 {
        int n = 0;
        const unsigned int *sys_props;
@@ -373,3 +372,81 @@ int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms)
        }
        return 0;
 }
+
+int dvb_fe_get_status(struct dvb_v5_fe_parms *parms)
+{
+       fe_status_t status;
+       int i;
+
+       if (!ioctl(parms->fd, FE_READ_STATUS, &status) == -1) {
+               perror("FE_READ_STATUS");
+               return -1;
+       }
+       if (parms->verbose > 1) {
+               printf("Status: ");
+               for (i = 0; i < ARRAY_SIZE(fe_status_name); i++) {
+                       if (status & fe_status_name[i].idx)
+                               printf ("%s ", fe_status_name[i].name);
+               }
+               printf("\n");
+       }
+       parms->last_status = status;
+       return status;
+}
+
+int dvb_fe_get_event(struct dvb_v5_fe_parms *parms)
+{
+       struct dvb_frontend_event event;
+       fe_status_t status;
+       int i;
+
+       if (!parms->legacy_fe) {
+               dvb_fe_get_parms(parms);
+               return dvb_fe_get_status(parms);
+       }
+
+       if (!ioctl(parms->fd, FE_GET_EVENT, &event) == -1) {
+               perror("FE_GET_EVENT");
+               return -1;
+       }
+       status = event.status;
+       if (parms->verbose > 1) {
+               printf("Status: ");
+               for (i = 0; i < ARRAY_SIZE(fe_status_name); i++) {
+                       if (status & fe_status_name[i].idx)
+                               printf ("%s ", fe_status_name[i].name);
+               }
+               printf("\n");
+       }
+       parms->last_status = status;
+
+       dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &event.parameters.frequency);
+       dvb_fe_retrieve_parm(parms, DTV_INVERSION, &event.parameters.inversion);
+       switch (parms->current_sys) {
+       case SYS_DVBS:
+               dvb_fe_retrieve_parm(parms, DTV_SYMBOL_RATE, &event.parameters.u.qpsk.symbol_rate);
+               dvb_fe_retrieve_parm(parms, DTV_INNER_FEC, &event.parameters.u.qpsk.fec_inner);
+               break;
+       case SYS_DVBC_ANNEX_AC:
+               dvb_fe_retrieve_parm(parms, DTV_SYMBOL_RATE, &event.parameters.u.qam.symbol_rate);
+               dvb_fe_retrieve_parm(parms, DTV_INNER_FEC, &event.parameters.u.qam.fec_inner);
+               dvb_fe_retrieve_parm(parms, DTV_MODULATION, &event.parameters.u.qam.modulation);
+               break;
+       case SYS_ATSC:
+       case SYS_DVBC_ANNEX_B:
+               dvb_fe_retrieve_parm(parms, DTV_MODULATION, &event.parameters.u.vsb.modulation);
+               break;
+       case SYS_DVBT:
+               dvb_fe_retrieve_parm(parms, DTV_BANDWIDTH_HZ, &event.parameters.u.ofdm.bandwidth);
+               dvb_fe_retrieve_parm(parms, DTV_CODE_RATE_HP, &event.parameters.u.ofdm.code_rate_HP);
+               dvb_fe_retrieve_parm(parms, DTV_CODE_RATE_LP, &event.parameters.u.ofdm.code_rate_LP);
+               dvb_fe_retrieve_parm(parms, DTV_MODULATION, &event.parameters.u.ofdm.constellation);
+               dvb_fe_retrieve_parm(parms, DTV_TRANSMISSION_MODE, &event.parameters.u.ofdm.transmission_mode);
+               dvb_fe_retrieve_parm(parms, DTV_GUARD_INTERVAL, &event.parameters.u.ofdm.guard_interval);
+               dvb_fe_retrieve_parm(parms, DTV_HIERARCHY, &event.parameters.u.ofdm.hierarchy_information);
+               break;
+       default:
+               return -EINVAL;
+       }
+       return 0;
+}
index c03ec5d..b214b2a 100644 (file)
@@ -29,6 +29,7 @@ struct dvb_v5_fe_parms {
        int                             n_props;
        struct dtv_property             dvb_prop[DTV_MAX_COMMAND];
        int                             legacy_fe;
+       int                             last_status;
 };
 
 struct dvb_v5_fe_parms *dvb_fe_open(int adapter, int frontend,
@@ -42,5 +43,6 @@ int dvb_fe_store_parm(struct dvb_v5_fe_parms *parms,
 int dvb_set_sys(struct dvb_v5_fe_parms *parms,
                   fe_delivery_system_t sys);
 void dvb_fe_prt_parms(struct dvb_v5_fe_parms *parms);
-int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms);
 int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms);
+int dvb_fe_get_status(struct dvb_v5_fe_parms *parms);
+int dvb_fe_get_event(struct dvb_v5_fe_parms *parms);