// FIXME bool CFEManager::haveFreeFrontend() { if(have_locked) { CFrontend * fe = getFE(0); if((mode == FE_MODE_TWIN) || (fe->getInfo()->type != FE_QPSK)) { for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { fe = it->second; INFO("check %d: locked %d", fe->fenumber, fe->Locked()); if(!fe->Locked()) return true; } } return false; } return true; }
void CFEManager::Open() { for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { CFrontend * fe = it->second; if(!fe->Locked()) fe->Open(true); } }
void CFEManager::Close() { if(have_locked) return; for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { CFrontend * fe = it->second; if(!fe->Locked()) fe->Close(); } }
bool CFEManager::unlockFrontend(CFrontend * frontend, bool unlock_demux) { OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex); have_locked = false; frontend->Unlock(); if (unlock_demux) { #ifdef DYNAMIC_DEMUX for (unsigned int i = 1; i < dmap.size(); i++) { if(dmap[i].tpid == frontend->getTsidOnid()) { dmap[i].Unlock(); break; } } #endif } for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { CFrontend * fe = it->second; if(fe->Locked()) { have_locked = true; break; } } return true; }
CFrontend * CFEManager::getFrontend(CZapitChannel * channel) { CFrontend * retfe = NULL; if (livefe && livefe->tuned && livefe->sameTsidOnid(channel->getTransponderId())) { FEDEBUG("live fe %d on the same TP", livefe->fenumber); return livefe; } t_satellite_position satellitePosition = channel->getSatellitePosition(); for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { CFrontend * mfe = it->second; if (!mfe->supportsDelivery(channel->delsys)) continue; if (mfe->getMode() == CFrontend::FE_MODE_UNUSED || CFrontend::linked(mfe->getMode())) continue; if (mfe->hasSat()) { satellite_map_t & satmap = mfe->getSatellites(); sat_iterator_t sit = satmap.find(satellitePosition); if ((sit == satmap.end()) || !sit->second.configured) continue; } if (mfe->getMode() == CFrontend::FE_MODE_MASTER) { bool have_loop = mfe->have_loop; CFrontend * free_frontend = NULL; CFrontend * free_twin = NULL; bool loop_busy = false; for (unsigned int i = 0; i < mfe->linkmap.size(); i++) { CFrontend * fe = mfe->linkmap[i]; FEDEBUG("Check fe%d: mode %d locked %d freq %d TP %" PRIx64 " - channel freq %d TP %" PRIx64, fe->fenumber, fe->getMode(), fe->Locked(), fe->getFrequency(), fe->getTsidOnid(), channel->getFreqId(), channel->getTransponderId()); if(fe->Locked()) { if (mfe->have_rotor && (fe->getCurrentSatellitePosition() != satellitePosition)) { free_frontend = NULL; free_twin = NULL; break; } if (fe->tuned && fe->sameTsidOnid(channel->getTransponderId())) { FEDEBUG("fe %d on the same TP", fe->fenumber); return fe; } if (!loop_busy && fe->getMode() != CFrontend::FE_MODE_LINK_TWIN) { if (have_loop && !loopCanTune(fe, channel)) { free_frontend = NULL; loop_busy = true; } } } else { if (fe->getMode() == CFrontend::FE_MODE_LINK_TWIN) { if (!free_twin) free_twin = fe; } else if(!loop_busy && !free_frontend) { free_frontend = fe; } } } if (!free_frontend) free_frontend = free_twin; if (free_frontend && !retfe) retfe = free_frontend; } if (mfe->getMode() == CFrontend::FE_MODE_INDEPENDENT) { FEDEBUG("Check fe%d: mode %d locked %d freq %d TP %" PRIx64 " - channel freq %d TP %" PRIx64, mfe->fenumber, mfe->getMode(), mfe->Locked(), mfe->getFrequency(), mfe->getTsidOnid(), channel->getFreqId(), channel->getTransponderId()); if(mfe->Locked()) { if(mfe->tuned && mfe->sameTsidOnid(channel->getTransponderId())) { FEDEBUG("fe %d on the same TP", mfe->fenumber); return mfe; } } else if(!retfe) retfe = mfe; } } FEDEBUG("Selected fe: %d", retfe ? retfe->fenumber : -1); return retfe; }