CFrontend * CFEManager::getScanFrontend(t_satellite_position satellitePosition) { CFrontend * frontend = NULL; for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { CFrontend * mfe = it->second; if (mfe->hasCable() && SAT_POSITION_CABLE(satellitePosition)) { if (mfe->getMode() != CFrontend::FE_MODE_UNUSED) { frontend = mfe; break; } } else if (mfe->hasTerr() && SAT_POSITION_TERR(satellitePosition)) { if (mfe->getMode() != CFrontend::FE_MODE_UNUSED) { frontend = mfe; break; } } else if (mfe->hasSat()) { if (mfe->getMode() == CFrontend::FE_MODE_UNUSED || CFrontend::linked(mfe->getMode())) continue; satellite_map_t & satmap = mfe->getSatellites(); sat_iterator_t sit = satmap.find(satellitePosition); if ((sit != satmap.end()) && sit->second.configured) { frontend = mfe; break; } } } INFO("Selected fe: %d", frontend ? frontend->fenumber : -1); return frontend; }
void CFEManager::saveSettings(bool write) { configfile.clear(); satellite_map_t &satlist = CServiceManager::getInstance()->SatelliteList(); for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { CFrontend * fe = it->second; frontend_config_t & fe_config = fe->getConfig(); INFO("fe%d", fe->fenumber); setConfigValue(fe, "diseqcType", fe_config.diseqcType); setConfigValue(fe, "diseqcRepeats", fe_config.diseqcRepeats); setConfigValue(fe, "motorRotationSpeed", fe_config.motorRotationSpeed); setConfigValue(fe, "highVoltage", fe_config.highVoltage); setConfigValue(fe, "uni_scr", fe_config.uni_scr); setConfigValue(fe, "uni_qrg", fe_config.uni_qrg); setConfigValue(fe, "diseqc_order", fe_config.diseqc_order); setConfigValue(fe, "use_usals", fe_config.use_usals); setConfigValue(fe, "rotor_swap", fe_config.rotor_swap); setConfigValue(fe, "lastSatellitePosition", fe->getRotorSatellitePosition()); setConfigValue(fe, "mode", fe->getMode()); setConfigValue(fe, "master", fe->getMaster()); std::vector<int> satList; satellite_map_t satellites = fe->getSatellites(); for(sat_iterator_t sit = satellites.begin(); sit != satellites.end(); ++sit) { if (sit->second.configured) { sat_iterator_t tit = satlist.find(sit->first); if (tit != satlist.end()) sit->second.use_in_scan = tit->second.use_in_scan; satList.push_back(sit->first); setSatelliteConfig(fe, sit->second); } } char cfg_key[81]; sprintf(cfg_key, "fe%d_satellites", fe->fenumber); configfile.setInt32Vector(cfg_key, satList); } if (write && configfile.getModifiedFlag()) { config_exist = configfile.saveConfig(FECONFIGFILE); //configfile.setModifiedFlag(false); } }
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; }
void CFEManager::linkFrontends(bool init) { INFO("linking.."); OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex); enabled_count = 0; unused_demux = 0; int demuxes[MAX_DMX_UNITS]; for(unsigned i = 0; i < MAX_DMX_UNITS; i++) demuxes[i] = 0; demuxes[0] = 1; for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { CFrontend * fe = it->second; int femode = fe->getMode(); fe->slave = false; fe->have_loop = false; fe->have_rotor = false; fe->linkmap.clear(); if (femode == CFrontend::FE_MODE_MASTER) { fe->linkmap.push_back(fe); /* fe is master, find all linked */ for(fe_map_iterator_t it2 = femap.begin(); it2 != femap.end(); it2++) { CFrontend * fe2 = it2->second; if (!CFrontend::linked(fe2->getMode())) continue; if (fe2->getType() != fe->getType() || (fe2->getMaster() != fe->fenumber)) continue; fe->linkmap.push_back(fe2); if (fe2->getMode() == CFrontend::FE_MODE_LINK_LOOP) { INFO("Frontend #%d: link to master %d as LOOP", fe2->fenumber, fe->fenumber); fe->have_loop = true; } else { INFO("Frontend #%d: link to master %d as TWIN", fe2->fenumber, fe->fenumber); } } frontend_config_t & fe_config = fe->getConfig(); satellite_map_t &satellites = fe->getSatellites(); for(sat_iterator_t sit = satellites.begin(); sit != satellites.end(); ++sit) { if (fe_config.use_usals || (sit->second.configured && (sit->second.motor_position || sit->second.use_usals))) { fe->have_rotor = true; break; } } INFO("Frontend #%d: is master, with loop: %s, with rotor: %s", fe->fenumber, fe->have_loop ? "yes" : "no", fe->have_rotor ? "yes" : "no"); } else if (femode == CFrontend::FE_MODE_LINK_LOOP) { INFO("Frontend #%d: is LOOP, master %d", fe->fenumber, fe->getMaster()); if (init) fe->setMasterSlave(true); //fe->slave = true; } else if (femode == CFrontend::FE_MODE_LINK_TWIN) { INFO("Frontend #%d: is TWIN, master %d", fe->fenumber, fe->getMaster()); } else if (femode == CFrontend::FE_MODE_INDEPENDENT) { INFO("Frontend #%d: is independent", fe->fenumber); } if (init && femode != CFrontend::FE_MODE_UNUSED) fe->Init(); if (femode != CFrontend::FE_MODE_UNUSED) { enabled_count++; if ((fe->fenumber + 1) < (int) MAX_DMX_UNITS) demuxes[fe->fenumber + 1] = 1; } } for(unsigned i = 0; i < MAX_DMX_UNITS; i++) { if (demuxes[i] == 0) { unused_demux = i; INFO("pip demux: %d\n", unused_demux); break; } } }