From: Andreas Monzner Date: Wed, 6 Jun 2007 00:03:39 +0000 (+0000) Subject: some fixes for empty tuner slots (use slotid instead of dvb api frontend X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=b2eebd0fef155a40a8a74468c4488cfb0c656a9a some fixes for empty tuner slots (use slotid instead of dvb api frontend device id) replace some hacks with some better hacks ;) --- diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 9ea4ac8..9ebe08a 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -90,7 +90,7 @@ void eDVBResourceManager::feStateChanged() int mask=0; for (eSmartPtrList::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i) if (i->m_inuse) - mask |= ( 1 << i->m_frontend->getID() ); + mask |= ( 1 << i->m_frontend->getSlotID() ); /* emit */ frontendUseMaskChanged(mask); } @@ -248,6 +248,29 @@ void eDVBResourceManager::addAdapter(iDVBAdapter *adapter) } } +void eDVBResourceManager::setFrontendSlotInformations(ePyObject list) +{ + if (!PyList_Check(list)) + { + PyErr_SetString(PyExc_StandardError, "eDVBResourceManager::setFrontendSlotInformations argument should be a python list"); + return; + } + if (PyList_Size(list) != m_frontend.size()) + { + char blasel[256]; + sprintf(blasel, "eDVBResourceManager::setFrontendSlotInformations list size incorrect %d frontends avail, but %d entries in slotlist", + m_frontend.size(), PyList_Size(list)); + PyErr_SetString(PyExc_StandardError, blasel); + return; + } + int pos=0; + for (eSmartPtrList::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i) + { + ePyObject obj = PyList_GET_ITEM(list, pos++); + i->m_frontend->setSlotInfo(obj); + } +} + RESULT eDVBResourceManager::allocateFrontend(ePtr &fe, ePtr &feparm) { ePtr best; @@ -275,10 +298,10 @@ RESULT eDVBResourceManager::allocateFrontend(ePtr &fe, eP return -1; } -RESULT eDVBResourceManager::allocateFrontendByIndex(ePtr &fe, int nr) +RESULT eDVBResourceManager::allocateFrontendByIndex(ePtr &fe, int slot_index) { - for (eSmartPtrList::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i, --nr) - if ((!nr) && !i->m_inuse) + for (eSmartPtrList::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i) + if (!i->m_inuse && i->m_frontend->getSlotID() == slot_index) { fe = new eDVBAllocatedFrontend(i); return 0; @@ -323,7 +346,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtrget().setSourceFrontend(fe->m_frontend->getID()); + demux->get().setSourceFrontend(fe->m_frontend->getDVBID()); else demux->get().setSourcePVR(0); return 0; @@ -447,7 +470,7 @@ void eDVBResourceManager::releaseCachedChannel() m_cached_channel=0; } -RESULT eDVBResourceManager::allocateRawChannel(eUsePtr &channel, int frontend_index) +RESULT eDVBResourceManager::allocateRawChannel(eUsePtr &channel, int slot_index) { ePtr fe; @@ -458,7 +481,7 @@ RESULT eDVBResourceManager::allocateRawChannel(eUsePtr &channel, in m_releaseCachedChannelTimer.stop(); } - if (allocateFrontendByIndex(fe, frontend_index)) + if (allocateFrontendByIndex(fe, slot_index)) return errNoFrontend; eDVBChannel *ch; diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h index 7bfaa48..f36e6f6 100644 --- a/lib/dvb/dvb.h +++ b/lib/dvb/dvb.h @@ -149,7 +149,7 @@ class eDVBResourceManager: public iObject, public Object combinations. this will be evaluated here. */ RESULT allocateFrontend(ePtr &fe, ePtr &feparm); - RESULT allocateFrontendByIndex(ePtr &fe, int index); + RESULT allocateFrontendByIndex(ePtr &fe, int slot_index); /* allocate a demux able to filter on the selected frontend. */ RESULT allocateDemux(eDVBRegisteredFrontend *fe, ePtr &demux, int cap); @@ -209,7 +209,8 @@ public: public: #endif PSignal1 frontendUseMaskChanged; - SWIG_VOID(RESULT) allocateRawChannel(eUsePtr &SWIG_OUTPUT, int frontend_index); + SWIG_VOID(RESULT) allocateRawChannel(eUsePtr &SWIG_OUTPUT, int slot_index); + void setFrontendSlotInformations(SWIG_PYOBJECT(ePyObject) list); }; SWIG_TEMPLATE_TYPEDEF(ePtr, eDVBResourceManager); SWIG_EXTEND(ePtr, diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index d2730a2..b6e5e8a 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -383,7 +383,8 @@ RESULT eDVBFrontendParameters::getHash(unsigned long &hash) const DEFINE_REF(eDVBFrontend); eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok) - :m_type(-1), m_fe(fe), m_fd(-1), m_sn(0), m_timeout(0), m_tuneTimer(0) + :m_type(-1), m_dvbid(fe), m_slotid(fe), m_need_rotor_workaround(false) + ,m_fd(-1), m_sn(0), m_timeout(0), m_tuneTimer(0) #if HAVE_DVB_API_VERSION < 3 ,m_secfd(-1) #endif @@ -428,12 +429,12 @@ int eDVBFrontend::openFrontend() } } else - eWarning("sec %d already opened", m_fe); + eWarning("sec %d already opened", m_dvbid); FrontendInfo fe_info; #else dvb_frontend_info fe_info; #endif - eDebug("opening frontend %d", m_fe); + eDebug("opening frontend %d", m_dvbid); if (m_fd < 0) { m_fd = ::open(m_filename, O_RDWR|O_NONBLOCK); @@ -448,7 +449,7 @@ int eDVBFrontend::openFrontend() } } else - eWarning("frontend %d already opened", m_fe); + eWarning("frontend %d already opened", m_dvbid); if (m_type == -1) { if (::ioctl(m_fd, FE_GET_INFO, &fe_info) < 0) @@ -503,15 +504,15 @@ int eDVBFrontend::closeFrontend() { if (linked_fe->m_inuse) { - eDebug("dont close frontend %d until the linked frontend %d is still in use", - m_fe, linked_fe->m_frontend->getID()); + eDebug("dont close frontend %d until the linked frontend %d in slot %d is still in use", + m_dvbid, linked_fe->m_frontend->getDVBID(), linked_fe->m_frontend->getSlotID()); return -1; } linked_fe->m_frontend->getData(LINKED_NEXT_PTR, (int&)linked_fe); } if (m_fd >= 0) { - eDebug("close frontend %d", m_fe); + eDebug("close frontend %d", m_dvbid); m_tuneTimer->stop(); setTone(iDVBFrontend::toneOff); setVoltage(iDVBFrontend::voltageOff); @@ -520,7 +521,7 @@ int eDVBFrontend::closeFrontend() if (!::close(m_fd)) m_fd=-1; else - eWarning("couldnt close frontend %d", m_fe); + eWarning("couldnt close frontend %d", m_dvbid); m_data[CSW] = m_data[UCSW] = m_data[TONEBURST] = -1; } #if HAVE_DVB_API_VERSION < 3 @@ -529,7 +530,7 @@ int eDVBFrontend::closeFrontend() if (!::close(m_secfd)) m_secfd=-1; else - eWarning("couldnt close sec %d", m_fe); + eWarning("couldnt close sec %d", m_dvbid); } #endif delete m_sn; @@ -573,7 +574,7 @@ void eDVBFrontend::feEvent(int w) #if HAVE_DVB_API_VERSION < 3 if (event.type == FE_COMPLETION_EV) #else - eDebug("(%d)fe event: status %x, inversion %s", m_fe, event.status, (event.parameters.inversion == INVERSION_ON) ? "on" : "off"); + eDebug("(%d)fe event: status %x, inversion %s", m_dvbid, event.status, (event.parameters.inversion == INVERSION_ON) ? "on" : "off"); if (event.status & FE_HAS_LOCK) #endif { @@ -691,7 +692,7 @@ int eDVBFrontend::readFrontendData(int type) return !!(status&FE_HAS_SYNC); } case frontendNumber: - return m_fe; + return m_slotid; } return 0; } @@ -1098,7 +1099,7 @@ void eDVBFrontend::getFrontendData(ePyObject dest) if (dest && PyDict_Check(dest)) { const char *tmp=0; - PutToDict(dest, "tuner_number", m_fe); + PutToDict(dest, "tuner_number", m_dvbid); switch(m_type) { case feSatellite: @@ -1123,7 +1124,7 @@ void eDVBFrontend::getFrontendData(ePyObject dest) #endif int eDVBFrontend::readInputpower() { - int power=m_fe; // this is needed for read inputpower from the correct tuner ! + int power=m_slotid; // this is needed for read inputpower from the correct tuner ! // open front prozessor int fp=::open("/dev/dbox/fp0", O_RDWR); @@ -1383,9 +1384,19 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer break; case eSecCommand::SET_POWER_LIMITING_MODE: { - int fd = m_fe ? - ::open("/dev/i2c/1", O_RDWR) : - ::open("/dev/i2c/0", O_RDWR); + if (!m_need_rotor_workaround) + break; + + char dev[16]; + + // FIXMEEEEEE hardcoded i2c devices for dm7025 and dm8000 + if (m_slotid < 2) + sprintf(dev, "/dev/i2c/%d", m_slotid); + else if (m_slotid == 2) + sprintf(dev, "/dev/i2c/2"); // first nim socket on DM8000 use /dev/i2c/2 + else if (m_slotid == 3) + sprintf(dev, "/dev/i2c/4"); // second nim socket on DM8000 use /dev/i2c/4 + int fd = ::open(dev, O_RDWR); unsigned char data[2]; ::ioctl(fd, I2C_SLAVE_FORCE, 0x10 >> 1); @@ -1418,7 +1429,7 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer void eDVBFrontend::setFrontend() { - eDebug("setting frontend %d", m_fe); + eDebug("setting frontend %d", m_dvbid); m_sn->start(); feEvent(-1); if (ioctl(m_fd, FE_SET_FRONTEND, &parm) == -1) @@ -1444,7 +1455,7 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm) eWarning("no SEC module active!"); return -ENOENT; } - res = m_sec->prepare(*this, parm, feparm, 1 << m_fe); + res = m_sec->prepare(*this, parm, feparm, 1 << m_slotid); if (!res) { eDebug("prepare_sat System %d Freq %d Pol %d SR %d INV %d FEC %d orbpos %d", @@ -1775,7 +1786,7 @@ RESULT eDVBFrontend::prepare_terrestrial(const eDVBFrontendParametersTerrestrial RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) { - eDebug("(%d)tune", m_fe); + eDebug("(%d)tune", m_dvbid); m_timeout->stop(); @@ -1846,7 +1857,7 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) std::string enable_5V; char configStr[255]; - snprintf(configStr, 255, "config.Nims.%d.terrestrial_5V", m_fe); + snprintf(configStr, 255, "config.Nims.%d.terrestrial_5V", m_slotid); m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) ); ePythonConfigQuery::getConfigValue(configStr, enable_5V); if (enable_5V == "True") @@ -2059,9 +2070,32 @@ int eDVBFrontend::isCompatibleWith(ePtr &feparm) eDVBFrontendParametersSatellite sat_parm; int ret = feparm->getDVBS(sat_parm); ASSERT(!ret); - return m_sec->canTune(sat_parm, this, 1 << m_fe); + return m_sec->canTune(sat_parm, this, 1 << m_slotid); } else if (m_type == eDVBFrontend::feCable) return 2; // more prio for cable frontends return 1; } + +void eDVBFrontend::setSlotInfo(ePyObject obj) +{ + ePyObject Id, Descr; + if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) + goto arg_error; + Id = PyTuple_GET_ITEM(obj, 0); + Descr = PyTuple_GET_ITEM(obj, 1); + if (!PyInt_Check(Id) || !PyString_Check(Descr)) + goto arg_error; + strcpy(m_description, PyString_AS_STRING(Descr)); + m_slotid = PyInt_AsLong(Id); + + // HACK.. the rotor workaround is neede for all NIMs with LNBP21 voltage regulator... + m_need_rotor_workaround = !!strstr(m_description, "Alps BSBE1") || !!strstr(m_description, "Alps -S"); + + eDebug("setSlotInfo for dvb frontend %d to slotid %d, descr %s, need rotorworkaround %s", + m_dvbid, m_slotid, m_description, m_need_rotor_workaround ? "Yes" : "No"); + return; +arg_error: + PyErr_SetString(PyExc_StandardError, + "eDVBFrontend::setSlotInfo must get a tuple with first param slotid and second param slot description"); +} diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index eb91eb7..c9474ae 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -39,9 +39,12 @@ class eDVBFrontend: public iDVBFrontend, public Object { DECLARE_REF(eDVBFrontend); int m_type; - int m_fe; + int m_dvbid; + int m_slotid; int m_fd; + bool m_need_rotor_workaround; char m_filename[128]; + char m_description[128]; #if HAVE_DVB_API_VERSION < 3 int m_secfd; char m_sec_filename[128]; @@ -115,7 +118,9 @@ public: void getFrontendData(ePyObject dest); int isCompatibleWith(ePtr &feparm); - int getID() { return m_fe; } + int getDVBID() { return m_dvbid; } + int getSlotID() { return m_slotid; } + void setSlotInfo(ePyObject obj); // get a tuple (slotid, slotdescr) int openFrontend(); int closeFrontend(); diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index a1e9499..76e9efb 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -1151,8 +1151,8 @@ PyObject *eDVBSatelliteEquipmentControl::get_exclusive_satellites(int tu1, int t p2 = (eDVBRegisteredFrontend*)tmp2; if (p1 != p2) { - int tu1_mask = 1 << p1->m_frontend->getID(), - tu2_mask = 1 << p2->m_frontend->getID(); + int tu1_mask = 1 << p1->m_frontend->getSlotID(), + tu2_mask = 1 << p2->m_frontend->getSlotID(); std::set tu1sats, tu2sats; std::list tu1difference, tu2difference; std::insert_iterator > insert1(tu1difference, tu1difference.begin()), diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index d8b3b0b..79f1c0d 100644 --- a/lib/dvb_ci/dvbci.cpp +++ b/lib/dvb_ci/dvbci.cpp @@ -402,7 +402,7 @@ void eDVBCIInterfaces::recheckPMTHandlers() if (!channel->getFrontend(frontend)) { eDVBFrontend *fe = (eDVBFrontend*) &(*frontend); - tunernum = fe->getID(); + tunernum = fe->getSlotID(); } } ASSERT(tunernum != -1); diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index e5c5642..bcdd944 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -4,7 +4,8 @@ from enigma import eDVBSatelliteEquipmentControl as secClass, \ eDVBSatelliteLNBParameters as lnbParam, \ eDVBSatelliteDiseqcParameters as diseqcParam, \ eDVBSatelliteSwitchParameters as switchParam, \ - eDVBSatelliteRotorParameters as rotorParam + eDVBSatelliteRotorParameters as rotorParam, \ + eDVBResourceManager import xml.dom.minidom from xml.dom import EMPTY_NAMESPACE @@ -732,12 +733,17 @@ def InitNimManager(nimmgr): for x in range(len(nimmgr.nim_slots)): config.Nims.append(ConfigSubsection()) + used_nim_slots = [ ] + for slot in nimmgr.nim_slots: x = slot.slot nim = config.Nims[x] # HACK: currently, we can only looptrough to socket A + if slot.type is not None: + used_nim_slots.append((slot.slot, slot.description)) + if slot.isCompatible("DVB-S"): if slot.slot == 0: nim.configMode = ConfigSelection( @@ -926,6 +932,8 @@ def InitNimManager(nimmgr): print "pls add support for this frontend type!" # assert False + eDVBResourceManager.getInstance().setFrontendSlotInformations(used_nim_slots) + nimmgr.sec = SecConfigure(nimmgr) nimmanager = NimManager() diff --git a/lib/python/Screens/ScanSetup.py b/lib/python/Screens/ScanSetup.py index 4b2f309..9980df5 100644 --- a/lib/python/Screens/ScanSetup.py +++ b/lib/python/Screens/ScanSetup.py @@ -205,9 +205,10 @@ class CableTransponderSearchSupport: self.cable_search_container.dataAvail.get().append(self.getCableTransponderData) cableConfig = config.Nims[nim_idx].cable cmd = "tda1002x --init --scan --verbose --wakeup --inv 2 --bus " + #FIXMEEEEEE hardcoded i2c devices for dm7025 and dm8000 if nim_idx < 2: cmd += str(nim_idx) - else: # FIXMEE DM8000 + else: if nim_idx == 2: cmd += "2" # first nim socket on DM8000 use /dev/i2c/2 else: