Merge branch 'bug_736_fix_rotor_with_unicable_lnb' into experimental
authorghost <andreas.monzner@multimedia-labs.de>
Sat, 26 Mar 2011 07:42:38 +0000 (08:42 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Sat, 26 Mar 2011 07:42:38 +0000 (08:42 +0100)
data/setup.xml
lib/dvb/dvb.cpp
lib/dvb/frontend.cpp
lib/dvb/frontend.h
lib/python/Components/NimManager.py
lib/python/Components/UsageConfig.py
lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py
lib/python/Screens/ChannelSelection.py
lib/python/Screens/InfoBarGenerics.py

index 5f7cbf6..8620709 100755 (executable)
@@ -28,6 +28,7 @@
                        <item level="2" text="Load Length of Movies in Movielist">config.usage.load_length_of_movies_in_moviellist</item>
                        <item level="1" text="Show positioner movement">config.usage.showdish</item>
                        <item level="1" text="Enable multiple bouquets">config.usage.multibouquet</item>
+                       <item level="1" text="Multi-EPG bouquet selection">config.usage.multiepg_ask_bouquet</item>
                        <item level="1" text="Change bouquets in quickzap">config.usage.quickzap_bouquet_change</item>
                        <item level="1" text="Alternative radio mode">config.usage.e1like_radio_mode</item>
                        <item level="1" text="Action on long powerbutton press">config.usage.on_long_powerpress</item>
index 6f9a67f..0b1bdc2 100644 (file)
@@ -145,19 +145,20 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr)
 #endif
                if (stat(filename, &s))
                        break;
-               ePtr<eDVBFrontend> fe;
+               eDVBFrontend *fe;
 
                {
                        int ok = 0;
-                       fe = new eDVBFrontend(m_nr, num_fe, ok);
+                       fe = new eDVBFrontend(m_nr, num_fe, ok, true);
                        if (ok)
-                               m_frontend.push_back(fe);
+                               m_simulate_frontend.push_back(ePtr<eDVBFrontend>(fe));
                }
+
                {
                        int ok = 0;
-                       fe = new eDVBFrontend(m_nr, num_fe, ok, true);
+                       fe = new eDVBFrontend(m_nr, num_fe, ok, false, fe);
                        if (ok)
-                               m_simulate_frontend.push_back(fe);
+                               m_frontend.push_back(ePtr<eDVBFrontend>(fe));
                }
                ++num_fe;
        }
index b5de46c..5718896 100644 (file)
@@ -453,8 +453,8 @@ DEFINE_REF(eDVBFrontend);
 
 int eDVBFrontend::PriorityOrder=0;
 
-eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok, bool simulate)
-       :m_simulate(simulate), m_enabled(false), m_type(-1), m_dvbid(fe), m_slotid(fe)
+eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok, bool simulate, eDVBFrontend *simulate_fe)
+       :m_simulate(simulate), m_enabled(false), m_type(-1), m_simulate_fe(simulate_fe), m_dvbid(fe), m_slotid(fe)
        ,m_fd(-1), m_rotor_mode(false), m_need_rotor_workaround(false), m_can_handle_dvbs2(false)
        ,m_state(stateClosed), m_timeout(0), m_tuneTimer(0)
 #if HAVE_DVB_API_VERSION < 3
@@ -503,10 +503,10 @@ int eDVBFrontend::openFrontend()
 #else
        dvb_frontend_info fe_info;
 #endif
-       eDebugNoSimulate("opening frontend %d", m_dvbid);
-       if (m_fd < 0)
+       if (!m_simulate)
        {
-               if (!m_simulate || m_type == -1)
+               eDebug("opening frontend %d", m_dvbid);
+               if (m_fd < 0)
                {
                        m_fd = ::open(m_filename, O_RDWR|O_NONBLOCK);
                        if (m_fd < 0)
@@ -515,70 +515,69 @@ int eDVBFrontend::openFrontend()
                                return -1;
                        }
                }
-       }
-       else
-               eWarning("frontend %d already opened", m_dvbid);
-       if (m_type == -1)
-       {
-               if (::ioctl(m_fd, FE_GET_INFO, &fe_info) < 0)
+               else
+                       eWarning("frontend %d already opened", m_dvbid);
+               if (m_type == -1)
                {
-                       eWarning("ioctl FE_GET_INFO failed");
-                       ::close(m_fd);
-                       m_fd = -1;
-                       return -1;
-               }
+                       if (::ioctl(m_fd, FE_GET_INFO, &fe_info) < 0)
+                       {
+                               eWarning("ioctl FE_GET_INFO failed");
+                               ::close(m_fd);
+                               m_fd = -1;
+                               return -1;
+                       }
 
-               switch (fe_info.type)
-               {
-               case FE_QPSK:
-                       m_type = iDVBFrontend::feSatellite;
-                       break;
-               case FE_QAM:
-                       m_type = iDVBFrontend::feCable;
-                       break;
-               case FE_OFDM:
-                       m_type = iDVBFrontend::feTerrestrial;
-                       break;
-               default:
-                       eWarning("unknown frontend type.");
-                       ::close(m_fd);
-                       m_fd = -1;
-                       return -1;
+                       switch (fe_info.type)
+                       {
+                       case FE_QPSK:
+                               m_type = iDVBFrontend::feSatellite;
+                               break;
+                       case FE_QAM:
+                               m_type = iDVBFrontend::feCable;
+                               break;
+                       case FE_OFDM:
+                               m_type = iDVBFrontend::feTerrestrial;
+                               break;
+                       default:
+                               eWarning("unknown frontend type.");
+                               ::close(m_fd);
+                               m_fd = -1;
+                               return -1;
+                       }
+                       if (m_simulate_fe)
+                               m_simulate_fe->m_type = m_type;
+                       eDebugNoSimulate("detected %s frontend", "satellite\0cable\0    terrestrial"+fe_info.type*10);
                }
-               eDebugNoSimulate("detected %s frontend", "satellite\0cable\0    terrestrial"+fe_info.type*10);
-       }
 
 #if HAVE_DVB_API_VERSION < 3
-       if (m_type == iDVBFrontend::feSatellite)
-       {
-                       if (m_secfd < 0)
-                       {
-                               if (!m_simulate)
+               if (m_type == iDVBFrontend::feSatellite)
+               {
+                               if (m_secfd < 0)
                                {
-                                       m_secfd = ::open(m_sec_filename, O_RDWR);
-                                       if (m_secfd < 0)
+                                       if (!m_simulate)
                                        {
-                                               eWarning("failed! (%s) %m", m_sec_filename);
-                                               ::close(m_fd);
-                                               m_fd=-1;
-                                               return -1;
+                                               m_secfd = ::open(m_sec_filename, O_RDWR);
+                                               if (m_secfd < 0)
+                                               {
+                                                       eWarning("failed! (%s) %m", m_sec_filename);
+                                                       ::close(m_fd);
+                                                       m_fd=-1;
+                                                       return -1;
+                                               }
                                        }
                                }
-                       }
-                       else
-                               eWarning("sec %d already opened", m_dvbid);
-       }
+                               else
+                                       eWarning("sec %d already opened", m_dvbid);
+               }
 #endif
 
-       setTone(iDVBFrontend::toneOff);
-       setVoltage(iDVBFrontend::voltageOff);
-
-       if (!m_simulate)
-       {
                m_sn = eSocketNotifier::create(eApp, m_fd, eSocketNotifier::Read, false);
                CONNECT(m_sn->activated, eDVBFrontend::feEvent);
        }
 
+       setTone(iDVBFrontend::toneOff);
+       setVoltage(iDVBFrontend::voltageOff);
+
        return 0;
 }
 
index bef4a18..5887f40 100644 (file)
@@ -72,6 +72,7 @@ private:
        bool m_simulate;
        bool m_enabled;
        int m_type;
+       eDVBFrontend *m_simulate_fe; // only used to set frontend type in dvb.cpp
        int m_dvbid;
        int m_slotid;
        int m_fd;
@@ -115,7 +116,7 @@ private:
        bool setSecSequencePos(int steps);
        static int PriorityOrder;
 public:
-       eDVBFrontend(int adap, int fe, int &ok, bool simulate=false);
+       eDVBFrontend(int adap, int fe, int &ok, bool simulate=false, eDVBFrontend *simulate_fe=NULL);
        virtual ~eDVBFrontend();
 
        int readInputpower();
index 7f7dd5c..bd1a363 100644 (file)
@@ -1361,25 +1361,32 @@ def InitNimManager(nimmgr):
                slot_id = configElement.slot_id
                if nimmgr.nim_slots[slot_id].description == 'Alps BSBE2':
                        open("/proc/stb/frontend/%d/tone_amplitude" %(fe_id), "w").write(configElement.value)
-                       
+
        def tunerTypeChanged(nimmgr, configElement):
                fe_id = configElement.fe_id
-               print "tunerTypeChanged feid %d to mode %s" % (fe_id, configElement.value)
-               try:
-                       oldvalue = open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "r").readline()
-                       open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write("0")
-               except:
-                       print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
-               frontend = eDVBResourceManager.getInstance().allocateRawChannel(fe_id).getFrontend()
-               frontend.closeFrontend()
-               open("/proc/stb/frontend/%d/mode" % (fe_id), "w").write(configElement.value)
-               frontend.reopenFrontend()
-               try:
-                       open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write(oldvalue)
-               except:
-                       print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
-               nimmgr.enumerateNIMs()
-       
+
+               cur_type = int(open("/proc/stb/frontend/%d/mode" % (fe_id), "r").read())
+               if cur_type != int(configElement.value):
+                       print "tunerTypeChanged feid %d from %d to mode %d" % (fe_id, cur_type, int(configElement.value))
+
+                       try:
+                               oldvalue = open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "r").readline()
+                               open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write("0")
+                       except:
+                               print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
+
+                       frontend = eDVBResourceManager.getInstance().allocateRawChannel(fe_id).getFrontend()
+                       frontend.closeFrontend()
+                       open("/proc/stb/frontend/%d/mode" % (fe_id), "w").write(configElement.value)
+                       frontend.reopenFrontend()
+                       try:
+                               open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write(oldvalue)
+                       except:
+                               print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
+                       nimmgr.enumerateNIMs()
+               else:
+                       print "tuner type is already already %d" %cur_type
+
        empty_slots = 0
        for slot in nimmgr.nim_slots:
                x = slot.slot
index acbc342..ce56f0f 100644 (file)
@@ -9,6 +9,8 @@ def InitUsageConfig():
        config.usage = ConfigSubsection();
        config.usage.showdish = ConfigYesNo(default = True)
        config.usage.multibouquet = ConfigYesNo(default = False)
+       config.usage.multiepg_ask_bouquet = ConfigYesNo(default = False)
+
        config.usage.quickzap_bouquet_change = ConfigYesNo(default = False)
        config.usage.e1like_radio_mode = ConfigYesNo(default = False)
        config.usage.infobar_timeout = ConfigSelection(default = "5", choices = [
index bcc7b9b..af14578 100644 (file)
@@ -1,8 +1,9 @@
 from Plugins.Plugin import PluginDescriptor
 from GraphMultiEpg import GraphMultiEPG
-from Screens.ChannelSelection import BouquetSelector
+from Screens.ChannelSelection import BouquetSelector, SilentBouquetSelector
 from enigma import eServiceCenter, eServiceReference
 from ServiceReference import ServiceReference
+from Components.config import config
 
 Session = None
 Servicelist = None
@@ -73,6 +74,32 @@ def changeBouquetCB(direction, epg):
                        epg_bouquet = bouquet
                        epg.setServices(services)
 
+def openAskBouquet(Session, bouquets, cnt):
+       if cnt > 1: # show bouquet list
+               global bouquetSel
+               bouquetSel = Session.openWithCallback(closed, BouquetSelector, bouquets, openBouquetEPG, enableWrapAround=True)
+               dlg_stack.append(bouquetSel)
+       elif cnt == 1:
+               if not openBouquetEPG(bouquets[0][1]):
+                       cleanup()
+
+def openSilent(Servicelist, bouquets, cnt):
+       root = Servicelist.getRoot()
+       if cnt > 1: # create bouquet list
+               global bouquetSel
+               current = 0
+               rootstr = root.toCompareString()
+               for bouquet in bouquets:
+                       if bouquet[1].toCompareString() == rootstr:
+                               break
+                       current += 1
+               if current >= cnt:
+                       current = 0
+               bouquetSel = SilentBouquetSelector(bouquets, True, current)
+       if cnt >= 1: # open current bouquet
+               if not openBouquetEPG(root):
+                       cleanup()
+
 def main(session, servicelist, **kwargs):
        global Session
        Session = session
@@ -83,13 +110,10 @@ def main(session, servicelist, **kwargs):
                cnt = 0
        else:
                cnt = len(bouquets)
-       if cnt > 1: # show bouquet list
-               global bouquetSel
-               bouquetSel = Session.openWithCallback(closed, BouquetSelector, bouquets, openBouquetEPG, enableWrapAround=True)
-               dlg_stack.append(bouquetSel)
-       elif cnt == 1:
-               if not openBouquetEPG(bouquets[0][1]):
-                       cleanup()
+       if config.usage.multiepg_ask_bouquet.value:
+               openAskBouquet(session, bouquets, cnt)
+       else:
+               openSilent(servicelist, bouquets, cnt)
 
 def Plugins(**kwargs):
        name = _("Graphical Multi EPG")
index c07e349..912d678 100644 (file)
@@ -65,6 +65,24 @@ class BouquetSelector(Screen):
        def cancelClick(self):
                self.close(False)
 
+class SilentBouquetSelector:
+       def __init__(self, bouquets, enableWrapAround=False, current=0):
+               self.bouquets = [b[1] for b in bouquets]
+               self.pos = current
+               self.count = len(bouquets)
+               self.enableWrapAround = enableWrapAround
+
+       def up(self):
+               if self.pos > 0 or self.enableWrapAround:
+                       self.pos = (self.pos - 1) % self.count
+
+       def down(self):
+               if self.pos < (self.count - 1) or self.enableWrapAround:
+                       self.pos = (self.pos + 1) % self.count
+
+       def getCurrent(self):
+               return self.bouquets[self.pos]
+
 # csel.bouquet_mark_edit values
 OFF = 0
 EDIT_BOUQUET = 1
index 2e97b59..93a4788 100644 (file)
@@ -1,4 +1,4 @@
-from ChannelSelection import ChannelSelection, BouquetSelector
+from ChannelSelection import ChannelSelection, BouquetSelector, SilentBouquetSelector
 
 from Components.ActionMap import ActionMap, HelpableActionMap
 from Components.ActionMap import NumberActionMap
@@ -559,6 +559,12 @@ class InfoBarEPG:
                        cnt = 0
                else:
                        cnt = len(bouquets)
+               if config.usage.multiepg_ask_bouquet.value:
+                       self.openMultiServiceEPGAskBouquet(bouquets, cnt, withCallback)
+               else:
+                       self.openMultiServiceEPGSilent(bouquets, cnt, withCallback)
+
+       def openMultiServiceEPGAskBouquet(self, bouquets, cnt, withCallback):
                if cnt > 1: # show bouquet list
                        if withCallback:
                                self.bouquetSel = self.session.openWithCallback(self.closed, BouquetSelector, bouquets, self.openBouquetEPG, enableWrapAround=True)
@@ -568,6 +574,21 @@ class InfoBarEPG:
                elif cnt == 1:
                        self.openBouquetEPG(bouquets[0][1], withCallback)
 
+       def openMultiServiceEPGSilent(self, bouquets, cnt, withCallback):
+               root = self.servicelist.getRoot()
+               rootstr = root.toCompareString()
+               current = 0
+               for bouquet in bouquets:
+                       if bouquet[1].toCompareString() == rootstr:
+                               break
+                       current += 1
+               if current >= cnt:
+                       current = 0
+               if cnt > 1: # create bouquet list for bouq+/-
+                       self.bouquetSel = SilentBouquetSelector(bouquets, True, self.servicelist.getBouquetNumOffset(root))
+               if cnt >= 1:
+                       self.openBouquetEPG(root, withCallback)
+
        def changeServiceCB(self, direction, epg):
                if self.serviceSel:
                        if direction > 0: