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; }
bool CFEManager::loadSettings() { config_exist = true; configfile.clear(); if (!configfile.loadConfig(FECONFIGFILE)) { WARN("%s not found", FECONFIGFILE); config_exist = false; } int def_mode0 = CFrontend::FE_MODE_INDEPENDENT; int def_modeX = CFrontend::FE_MODE_UNUSED; if (cableOnly()) def_modeX = CFrontend::FE_MODE_INDEPENDENT; int newmode = (fe_mode_t) configfile.getInt32("mode", -1); if (newmode >= 0) { INFO("old mode param: %d\n", newmode); if (newmode == FE_MODE_LOOP) { def_mode0 = CFrontend::FE_MODE_MASTER; def_modeX = CFrontend::FE_MODE_LINK_LOOP; } else if (newmode == FE_MODE_TWIN) { def_mode0 = CFrontend::FE_MODE_MASTER; def_modeX = CFrontend::FE_MODE_LINK_TWIN; } else if (newmode == FE_MODE_ALONE) { def_mode0 = CFrontend::FE_MODE_INDEPENDENT; def_modeX = CFrontend::FE_MODE_INDEPENDENT; } } bool fsat = true; //bool fcable = true; bool fterr = true; for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) { CFrontend * fe = it->second; frontend_config_t & fe_config = fe->getConfig(); INFO("load config for fe%d", fe->fenumber); fe_config.diseqcType = (diseqc_t) getConfigValue(fe, "diseqcType", NO_DISEQC); fe_config.diseqcRepeats = getConfigValue(fe, "diseqcRepeats", 0); fe_config.motorRotationSpeed = getConfigValue(fe, "motorRotationSpeed", 18); fe_config.highVoltage = getConfigValue(fe, "highVoltage", 0); fe_config.uni_scr = getConfigValue(fe, "uni_scr", -1); fe_config.uni_qrg = getConfigValue(fe, "uni_qrg", 0); fe_config.diseqc_order = getConfigValue(fe, "diseqc_order", UNCOMMITED_FIRST); fe_config.use_usals = getConfigValue(fe, "use_usals", 0); fe_config.rotor_swap = getConfigValue(fe, "rotor_swap", 0); fe->setRotorSatellitePosition(getConfigValue(fe, "lastSatellitePosition", 0)); /* default mode for first / next frontends */ int def_mode = def_modeX; if (fe->hasSat() && fsat) { fsat = false; def_mode = def_mode0; } if (fe->hasCable()) { #if 0 if (fcable) { fcable = false; def_mode = def_mode0; } if (def_mode > CFrontend::FE_MODE_INDEPENDENT) def_mode = CFrontend::FE_MODE_INDEPENDENT; #endif def_mode = CFrontend::FE_MODE_INDEPENDENT; } if (fe->hasTerr()) { if (fterr) { fterr = false; def_mode = def_mode0; } if (def_mode > CFrontend::FE_MODE_INDEPENDENT) def_mode = CFrontend::FE_MODE_INDEPENDENT; } if (femap.size() == 1) def_mode = CFrontend::FE_MODE_INDEPENDENT; fe->setMode(getConfigValue(fe, "mode", def_mode)); fe->setMaster(getConfigValue(fe, "master", 0)); char cfg_key[81]; sprintf(cfg_key, "fe%d_satellites", fe->fenumber); satellite_map_t & satmap = fe->getSatellites(); satmap.clear(); satellite_map_t &satlist = CServiceManager::getInstance()->SatelliteList(); for(sat_iterator_t sit = satlist.begin(); sit != satlist.end(); ++sit) { if (!fe->supportsDelivery(sit->second.delsys)) continue; t_satellite_position position = sit->first; sat_config_t satconfig; /* defaults, to replace CServiceManager::InitSatPosition/LoadMotorPositions * in the future */ satconfig.position = position; satconfig.diseqc = -1; satconfig.commited = -1; satconfig.uncommited = -1; satconfig.motor_position = 0; satconfig.diseqc_order = 0; satconfig.lnbOffsetLow = 9750; satconfig.lnbOffsetHigh = 10600; satconfig.lnbSwitch = 11700; satconfig.use_in_scan = 0; satconfig.use_usals = 0; satconfig.input = 0; satconfig.configured = 0; satmap.insert(satellite_pair_t(position, satconfig)); if(getSatelliteConfig(fe, satconfig)) satmap[position] = satconfig; // overwrite if exist if (satconfig.use_in_scan) sit->second.use_in_scan = satconfig.use_in_scan; } } linkFrontends(); return true; }