From 3e3832c8784e966dca29354c158ffb636f33c8cb Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Sat, 15 Sep 2007 14:02:43 +0000 Subject: [PATCH] show more information in service scan (needs additional changes in skin) --- lib/components/scan.cpp | 91 +++++++++++++++------------- lib/components/scan.h | 1 + lib/dvb/frontend.h | 18 +++--- lib/dvb/frontendparms.h | 34 +++++------ lib/dvb/idvb.h | 3 +- lib/dvb/scan.cpp | 20 ++++-- lib/dvb/scan.h | 1 + lib/python/Components/ServiceScan.py | 64 ++++++++++++++++++- lib/python/Screens/ServiceScan.py | 5 +- lib/python/enigma_python.i | 2 +- 10 files changed, 159 insertions(+), 80 deletions(-) diff --git a/lib/components/scan.cpp b/lib/components/scan.cpp index a863d923..c027fe6b 100644 --- a/lib/components/scan.cpp +++ b/lib/components/scan.cpp @@ -10,42 +10,42 @@ void eComponentScan::scanEvent(int evt) { // eDebug("scan event %d!", evt); - if (evt == eDVBScan::evtFinish) + switch(evt) { - m_done = 1; - ePtr db; - ePtr res; - - int err; - if ((err = eDVBResourceManager::getInstance(res)) != 0) - { - eDebug("no resource manager"); - m_failed = 2; - } else if ((err = res->getChannelList(db)) != 0) + case eDVBScan::evtFinish: { - m_failed = 3; - eDebug("no channel list"); - } else - { - m_scan->insertInto(db); - db->flush(); - eDebug("scan done!"); + m_done = 1; + ePtr db; + ePtr res; + + int err; + if ((err = eDVBResourceManager::getInstance(res)) != 0) + { + eDebug("no resource manager"); + m_failed = 2; + } else if ((err = res->getChannelList(db)) != 0) + { + m_failed = 3; + eDebug("no channel list"); + } else + { + m_scan->insertInto(db); + db->flush(); + eDebug("scan done!"); + } + break; } + case eDVBScan::evtNewService: + newService(); + return; + case eDVBScan::evtFail: + eDebug("scan failed."); + m_failed = 1; + m_done = 1; + break; + case eDVBScan::evtUpdate: + break; } - - if (evt == eDVBScan::evtNewService) - { - newService(); - return; - } - - if (evt == eDVBScan::evtFail) - { - eDebug("scan failed."); - m_failed = 1; - m_done = 1; - } - statusChanged(); } @@ -122,7 +122,7 @@ int eComponentScan::start(int feid, int flags) { if (m_initial.size() > 1) { - iDVBFrontendParameters *tp = m_initial.first(); + ePtr tp = m_initial.first(); int type; if (tp && !tp->getSystem(type)) { @@ -151,14 +151,6 @@ int eComponentScan::start(int feid, int flags) return 0; } -RESULT eComponentScan::getFrontend(ePtr &fe) -{ - if (m_scan) - return m_scan->getFrontend(fe); - fe = 0; - return -1; -} - int eComponentScan::getProgress() { if (!m_scan) @@ -195,3 +187,20 @@ void eComponentScan::getLastServiceName(std::string &string) return; m_scan->getLastServiceName(string); } + +RESULT eComponentScan::getFrontend(ePtr &fe) +{ + if (m_scan) + return m_scan->getFrontend(fe); + fe = 0; + return -1; +} + +RESULT eComponentScan::getCurrentTransponder(ePtr &tp) +{ + if (m_scan) + return m_scan->getCurrentTransponder(tp); + tp = 0; + return -1; +} + diff --git a/lib/components/scan.h b/lib/components/scan.h index e4bb41ee..b5acf91a 100644 --- a/lib/components/scan.h +++ b/lib/components/scan.h @@ -48,6 +48,7 @@ public: enum { scanNetworkSearch=1, scanRemoveServices=4, scanDontRemoveFeeds=8, clearToScanOnFirstNIT = 16 }; int start(int feid, int flags=0 ); SWIG_VOID(RESULT) getFrontend(ePtr &SWIG_OUTPUT); + SWIG_VOID(RESULT) getCurrentTransponder(ePtr &SWIG_OUTPUT); }; #endif diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index 6bf36466..db1c3644 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -16,18 +16,18 @@ public: eDVBFrontendParameters(); ~eDVBFrontendParameters() {} - RESULT getSystem(int &type) const; - RESULT getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const; - RESULT getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const; - RESULT getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const; - RESULT setDVBS(const eDVBFrontendParametersSatellite &p, bool no_rotor_command_on_tune=false); RESULT setDVBC(const eDVBFrontendParametersCable &p); RESULT setDVBT(const eDVBFrontendParametersTerrestrial &p); - - RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT, bool exact) const; - - RESULT getHash(unsigned long &SWIG_OUTPUT) const; + +#ifndef SWIG + RESULT getSystem(int &type) const; + RESULT getDVBS(eDVBFrontendParametersSatellite &) const; + RESULT getDVBC(eDVBFrontendParametersCable &) const; + RESULT getDVBT(eDVBFrontendParametersTerrestrial &) const; + RESULT calculateDifference(const iDVBFrontendParameters *parm, int &, bool exact) const; + RESULT getHash(unsigned long &) const; +#endif }; #ifndef SWIG diff --git a/lib/dvb/frontendparms.h b/lib/dvb/frontendparms.h index 86aea7cf..b8f47f43 100644 --- a/lib/dvb/frontendparms.h +++ b/lib/dvb/frontendparms.h @@ -1,6 +1,8 @@ #ifndef __lib_dvb_frontendparms_h #define __lib_dvb_frontendparms_h +#include + class SatelliteDeliverySystemDescriptor; class CableDeliverySystemDescriptor; class TerrestrialDeliverySystemDescriptor; @@ -10,38 +12,32 @@ struct eDVBFrontendParametersSatellite #ifndef SWIG void set(const SatelliteDeliverySystemDescriptor &); #endif - struct Polarisation - { + struct Polarisation { enum { Horizontal, Vertical, CircularLeft, CircularRight }; }; - struct Inversion - { + struct Inversion { enum { Off, On, Unknown }; }; - struct FEC - { + struct FEC { enum { fAuto, f1_2, f2_3, f3_4, f5_6, f7_8, f8_9, f3_5, f4_5, f9_10, fNone=15 }; }; - struct System - { + struct System { enum { DVB_S, DVB_S2 }; }; - struct Modulation - { + struct Modulation { enum { Auto, QPSK, M8PSK, QAM_16 }; }; - struct RollOff // dvb-s2 - { + struct RollOff { // dvb-s2 enum { alpha_0_35, alpha_0_25, alpha_0_20, alpha_auto }; @@ -50,20 +46,19 @@ struct eDVBFrontendParametersSatellite unsigned int frequency, symbol_rate; int polarisation, fec, inversion, orbital_position, system, modulation, roll_off; }; +SWIG_ALLOW_OUTPUT_SIMPLE(eDVBFrontendParametersSatellite); struct eDVBFrontendParametersCable { #ifndef SWIG void set(const CableDeliverySystemDescriptor &); #endif - struct Inversion - { + struct Inversion { enum { Off, On, Unknown }; }; - struct FEC - { + struct FEC { enum { fAuto, f1_2, f2_3, f3_4, f5_6, f7_8, f8_9, fNone=15 }; @@ -76,19 +71,19 @@ struct eDVBFrontendParametersCable unsigned int frequency, symbol_rate; int modulation, inversion, fec_inner; }; +SWIG_ALLOW_OUTPUT_SIMPLE(eDVBFrontendParametersCable); struct eDVBFrontendParametersTerrestrial { #ifndef SWIG - void set(const TerrestrialDeliverySystemDescriptor &); + void set(const TerrestrialDeliverySystemDescriptor &); #endif struct Bandwidth { enum { Bw8MHz, Bw7MHz, Bw6MHz, /*Bw5MHz,*/ BwAuto }; // Bw5Mhz nyi (compatibilty with enigma1) }; - struct FEC - { + struct FEC { enum { f1_2, f2_3, f3_4, f5_6, f7_8, fAuto }; @@ -128,5 +123,6 @@ struct eDVBFrontendParametersTerrestrial int hierarchy; int inversion; }; +SWIG_ALLOW_OUTPUT_SIMPLE(eDVBFrontendParametersTerrestrial); #endif diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index 14d6ebb0..c18d2421 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -409,6 +409,7 @@ public: virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT, bool exact) const = 0; virtual RESULT getHash(unsigned long &SWIG_OUTPUT) const = 0; }; +SWIG_TEMPLATE_TYPEDEF(ePtr, iDVBFrontendParametersPtr); #define MAX_DISEQC_LENGTH 16 @@ -509,7 +510,7 @@ public: state_last_instance, /* just one reference to this channel is left */ state_release /* channel is being shut down. */ }; - virtual RESULT getState(int &SWIG_OUTPUT)=0; + virtual RESULT getState(int &)=0; virtual RESULT getCurrentFrontendParameters(ePtr &)=0; enum diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp index 3915a0c4..20bb9159 100644 --- a/lib/dvb/scan.cpp +++ b/lib/dvb/scan.cpp @@ -123,13 +123,10 @@ RESULT eDVBScan::nextChannel() m_chid_current = eDVBChannelID(); m_channel_state = iDVBChannel::state_idle; + if (fe->tune(*m_ch_current)) - { return nextChannel(); - m_event(evtFail); - return -EINVAL; - } - + m_event(evtUpdate); return 0; } @@ -782,4 +779,15 @@ RESULT eDVBScan::getFrontend(ePtr &fe) return m_channel->getFrontend(fe); fe = 0; return -1; -} \ No newline at end of file +} + +RESULT eDVBScan::getCurrentTransponder(ePtr &tp) +{ + if (m_ch_current) + { + tp = m_ch_current; + return 0; + } + tp = 0; + return -1; +} diff --git a/lib/dvb/scan.h b/lib/dvb/scan.h index ab7f3b5d..6dcbe707 100644 --- a/lib/dvb/scan.h +++ b/lib/dvb/scan.h @@ -87,6 +87,7 @@ public: void getStats(int &transponders_done, int &transponders_total, int &services); void getLastServiceName(std::string &name); RESULT getFrontend(ePtr &); + RESULT getCurrentTransponder(ePtr &); }; #endif diff --git a/lib/python/Components/ServiceScan.py b/lib/python/Components/ServiceScan.py index 26ce763b..2406326d 100644 --- a/lib/python/Components/ServiceScan.py +++ b/lib/python/Components/ServiceScan.py @@ -1,4 +1,5 @@ -from enigma import eComponentScan +from enigma import eComponentScan, iDVBFrontend +from Components.NimManager import nimmanager as nimmgr class ServiceScan: @@ -25,8 +26,65 @@ class ServiceScan: else: self.state = self.Error self.errorcode = errcode + self.network.setText("") + self.transponder.setText("") else: self.text.setText(_("scan in progress - %d %% done!\n%d services found!") % (self.scan.getProgress(), self.foundServices + self.scan.getNumServices())) + transponder = self.scan.getCurrentTransponder() + network = "" + tp_text = "" + if transponder: + tp_type = transponder.getSystem() + if not tp_type[0]: + tp_type = tp_type[1] + if tp_type == iDVBFrontend.feSatellite: + network = _("Satellite") + tp = transponder.getDVBS() + if not tp[0]: + tp = tp[1] + orb_pos = tp.orbital_position + try: + sat_name = str(nimmgr.getSatDescription(orb_pos)) + except KeyError: + sat_name = "" + if orb_pos > 1800: # west + orb_pos = 3600 - orbpos + h = _("W") + else: + h = _("E") + if sat_name.find("%d.%d" % (orb_pos/10, orb_pos%10)) != -1: + network = sat_name + else: + network = ("%s %d.%d %s") % (sat_name, orb_pos / 10, orb_pos % 10, h) + tp_text = ("%s %s %d%c / %d / %s") %( { 0 : "DVB-S", 1 : "DVB-S2" }[tp.system], + { 0 : "Auto", 1 : "QPSK", 2 : "M8PSK", 3 : "QAM16" }[tp.modulation], + tp.frequency/1000, + { 0 : 'H', 1 : 'V', 2 : 'L', 3 : 'R' }[tp.polarisation], + tp.symbol_rate/1000, + { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", + 5 : "7/8", 6 : "8/9", 7 : "3/5", 8 : "4/5", 9 : "9/10", + 15 : "NONE" }[tp.fec] ) + elif tp_type == iDVBFrontend.feCable: + network = _("Cable") + tp = transponder.getDVBC() + if not tp[0]: + tp = tp[1] + tp_text = ("DVB-C %s %d / %d / %s") %( { 0 : "AUTO", 1 : "QAM16", 2 : "QAM32", 3 : "QAM64", 4 : "QAM128", 5 : "QAM256" }[tp.modulation], + tp.frequency, + tp.symbol_rate/1000, + { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", 5 : "7/8", 6 : "8/9", 15 : "NONE" }[tp.fec_inner] ) + elif tp_type == iDVBFrontend.feTerrestrial: + network = _("Terrestrial") + tp = transponder.getDVBT() + if not tp[0]: + tp = tp[1] + tp_text = ("DVB-T %s %d / %d") %( { 0 : "QPSK", 1 : "QAM16", 2 : "QAM64", 3 : "AUTO"}[tp.modulation], + tp.frequency, + tp.symbol_rate/1000) + else: + print "unknown transponder type in scanStatusChanged" + self.network.setText(network) + self.transponder.setText(tp_text) if self.state == self.Done: if self.scan.getNumServices() == 1: @@ -46,7 +104,7 @@ class ServiceScan: self.run += 1 self.execBegin() - def __init__(self, progressbar, text, servicelist, passNumber, scanList, frontendInfo): + def __init__(self, progressbar, text, servicelist, passNumber, scanList, network, transponder, frontendInfo): self.foundServices = 0 self.progressbar = progressbar self.text = text @@ -54,6 +112,8 @@ class ServiceScan: self.passNumber = passNumber self.scanList = scanList self.frontendInfo = frontendInfo + self.transponder = transponder + self.network = network self.run = 0 def doRun(self): diff --git a/lib/python/Screens/ServiceScan.py b/lib/python/Screens/ServiceScan.py index a529e71c..3b1d780f 100644 --- a/lib/python/Screens/ServiceScan.py +++ b/lib/python/Screens/ServiceScan.py @@ -22,10 +22,13 @@ class ServiceScan(Screen): self["scan_progress"] = ProgressBar() self["scan_state"] = Label(_("scan state")) + self["network"] = Label() + self["transponder"] = Label() + self["pass"] = Label("") self["servicelist"] = FIFOList(len=7) self["FrontendInfo"] = FrontendInfo() - self["scan"] = CScan(self["scan_progress"], self["scan_state"], self["servicelist"], self["pass"], scanList, self["FrontendInfo"]) + self["scan"] = CScan(self["scan_progress"], self["scan_state"], self["servicelist"], self["pass"], scanList, self["network"], self["transponder"], self["FrontendInfo"]) self["actions"] = ActionMap(["OkCancelActions"], { diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i index 9c4c013a..e19f4561 100644 --- a/lib/python/enigma_python.i +++ b/lib/python/enigma_python.i @@ -75,13 +75,13 @@ is usually caused by not marking PSignals as immutable. #include #include #include +#include #include #include #include #include #include #include -#include #include #include #include -- 2.30.2