2 #include <lib/dvb/fbc.h>
3 #include <lib/dvb/dvb.h>
4 #include <lib/dvb/sec.h>
5 #include <lib/base/object.h>
10 #define FE_SLOT_ID(fe) fe->m_frontend->getSlotID()
15 #define eFecDebug(arg...) eDebug(arg)
17 #define eFecDebug(arg...)
21 DEFINE_REF(eFBCTunerManager);
23 bool eFBCTunerManager::isDestroyed = false;
25 eFBCTunerManager::eFBCTunerManager()
27 ePtr<eDVBResourceManager> res_mgr;
28 eDVBResourceManager::getInstance(res_mgr);
31 /* num of fbc tuner in one set */
32 m_fbc_tuner_num = getFBCTunerNum();
36 eFBCTunerManager::~eFBCTunerManager()
41 void eFBCTunerManager::procInit()
43 eSmartPtrList<eDVBRegisteredFrontend> &frontends = m_res_mgr->m_frontend;
45 /* 1 FBC set has 8 tuners. */
46 /* 1st set : 0, 1, 2, 3, 4, 5, 6, 7 */
47 /* 2nd set : 8, 9, 10, 11, 12, 13, 14, 15 */
48 /* 1st, 2nd frontend is top on a set */
50 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
52 if (!it->m_frontend->is_FBCTuner())
57 setProcFBCID(FE_SLOT_ID(it), getFBCID(FE_SLOT_ID(it)));
62 int eFBCTunerManager::getFBCTunerNum()
65 int fbc_tuner_num = 2;
66 int fd = open("/proc/stb/info/chipset", O_RDONLY);
68 eDebug("open failed, /proc/stb/info/chipset!");
76 if (!!strstr(tmp, "7376"))
82 int eFBCTunerManager::setProcFBCID(int fe_id, int fbc_id)
84 eFecDebug("[*][eFBCTunerManager::setProcFBCID] %d -> %d %s", fe_id, fbc_id, !isRootFeSlot(fe_id)?"(linked)":"");
87 sprintf(filename, "/proc/stb/frontend/%d/fbc_id", fe_id);
88 int fd = open(filename, O_RDWR);
90 eDebug("[*][eFBCTunerManager::setProcFBCID] open failed, %s: %m", filename);
95 if(isLinkedByIndex(fe_id))
96 fbc_id += 0x10; // 0x10 : isLinked, 0x01 : fbc_id
98 sprintf(data, "%x", fbc_id);
99 write(fd, data, strlen(data));
105 bool eFBCTunerManager::isRootFeSlot(int fe_slot_id)
107 return (fe_slot_id%8 < m_fbc_tuner_num) ? true : false;
111 bool eFBCTunerManager::isRootFe(eDVBRegisteredFrontend *fe)
113 return isRootFeSlot(FE_SLOT_ID(fe));
116 bool eFBCTunerManager::isSameFbcSet(int a, int b)
118 return (a/8) == (b/8) ? true : false;
121 bool eFBCTunerManager::isSupportDVBS(eDVBRegisteredFrontend *fe)
123 return (fe->m_frontend->supportsDeliverySystem(SYS_DVBS, true) || fe->m_frontend->supportsDeliverySystem(SYS_DVBS2, true)) ? true : false;
126 int eFBCTunerManager::getFBCID(int top_fe_id)
128 return 2*top_fe_id/8 + top_fe_id%8; /* (0,1,8,9,16,17...) -> (0,1,2,3,4,5...)*/
131 int eFBCTunerManager::setDefaultFBCID(eDVBRegisteredFrontend *fe)
136 return setProcFBCID(FE_SLOT_ID(fe), getFBCID(FE_SLOT_ID(fe)));
139 void eFBCTunerManager::updateFBCID(eDVBRegisteredFrontend *next_fe, eDVBRegisteredFrontend *prev_fe)
141 eDVBRegisteredFrontend *top_fe = getTop(prev_fe);
142 setProcFBCID(FE_SLOT_ID(next_fe), getFBCID(FE_SLOT_ID(top_fe)));
145 eDVBRegisteredFrontend *eFBCTunerManager::getPrev(eDVBRegisteredFrontend *fe)
147 eDVBRegisteredFrontend *prev_fe = NULL;
148 long linked_prev_ptr = -1;
149 fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr);
150 if (linked_prev_ptr != -1)
151 prev_fe = (eDVBRegisteredFrontend *)linked_prev_ptr;
155 eDVBRegisteredFrontend *eFBCTunerManager::getNext(eDVBRegisteredFrontend *fe)
157 eDVBRegisteredFrontend *next_fe = NULL;
158 long linked_next_ptr = -1;
159 fe->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, linked_next_ptr);
160 if (linked_next_ptr != -1)
161 next_fe = (eDVBRegisteredFrontend *)linked_next_ptr;
165 eDVBRegisteredFrontend *eFBCTunerManager::getTop(eDVBRegisteredFrontend *fe)
167 eDVBRegisteredFrontend *prev_fe = fe;
168 long linked_prev_ptr = -1;
169 fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr);
170 while(linked_prev_ptr != -1)
172 prev_fe = (eDVBRegisteredFrontend *)linked_prev_ptr;
173 prev_fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr);
178 eDVBRegisteredFrontend *eFBCTunerManager::getLast(eDVBRegisteredFrontend *fe)
180 eDVBRegisteredFrontend *next_fe = fe;
181 long linked_next_ptr = -1;
182 fe->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, linked_next_ptr);
183 while(linked_next_ptr != -1)
185 next_fe = (eDVBRegisteredFrontend *)linked_next_ptr;
186 next_fe->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, linked_next_ptr);
191 bool eFBCTunerManager::isLinked(eDVBRegisteredFrontend *fe)
193 return getPrev(fe) ? true:false;
196 bool eFBCTunerManager::isLinkedByIndex(int fe_idx)
199 eSmartPtrList<eDVBRegisteredFrontend> &frontends = m_res_mgr->m_frontend;
201 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
203 if (FE_SLOT_ID(it) == fe_idx)
205 linked = isLinked(*it);
212 bool eFBCTunerManager::checkTop(eDVBRegisteredFrontend *fe)
214 return getPrev(fe) ? false:true;
217 int eFBCTunerManager::connectLinkByIndex(int link_fe_index, int prev_fe_index, int next_fe_index, bool simulate)
219 eSmartPtrList<eDVBRegisteredFrontend> &frontends = simulate ? m_res_mgr->m_simulate_frontend : m_res_mgr->m_frontend;
221 eFecDebug(" [*][eFBCTunerManager::connectLinkByIndex] try to link %d->%d->%d %s", prev_fe_index, link_fe_index, next_fe_index, simulate?"(simulate)":"");
223 eDVBRegisteredFrontend *link_fe=NULL;
224 eDVBRegisteredFrontend *prev_fe=NULL;
225 eDVBRegisteredFrontend *next_fe=NULL;
227 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
229 if (FE_SLOT_ID(it) == prev_fe_index)
233 else if (FE_SLOT_ID(it) == next_fe_index)
237 else if (FE_SLOT_ID(it) == link_fe_index)
243 if (prev_fe && next_fe && link_fe)
245 /* enable linked fe */
246 link_fe->m_frontend->setEnabled(true);
249 prev_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)link_fe);
250 link_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)prev_fe);
252 link_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)next_fe);
253 next_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)link_fe);
257 eDebug(" [*][eFBCTunerManager::connectLinkByIndex] connect failed! (prev_fe : %p, next_fe : %p, link_fe : %p, %s)", prev_fe, next_fe, link_fe, simulate?"simulate":"");
264 int eFBCTunerManager::connectLinkByIndex(int link_fe_index, int prev_fe_index, bool simulate)
266 eSmartPtrList<eDVBRegisteredFrontend> &frontends = simulate ? m_res_mgr->m_simulate_frontend : m_res_mgr->m_frontend;
268 eFecDebug(" [*][eFBCTunerManager::connectLinkByIndex] try to link %d->%d %s", prev_fe_index, link_fe_index, simulate?"(simulate)":"");
270 eDVBRegisteredFrontend *link_fe=NULL;
271 eDVBRegisteredFrontend *prev_fe=NULL;
273 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
275 if (FE_SLOT_ID(it) == prev_fe_index)
279 else if (FE_SLOT_ID(it) == link_fe_index)
285 if (prev_fe && link_fe)
287 /* enable linked fe */
288 link_fe->m_frontend->setEnabled(true);
291 prev_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)link_fe);
292 link_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)prev_fe);
296 eDebug(" [*][eFBCTunerManager::connectLinkByIndex] connect failed! (prev_fe : %p, link_fe : %p, %s)", prev_fe, link_fe, simulate?"simulate":"");
303 int eFBCTunerManager::disconnectLinkByIndex(int link_fe_index, int prev_fe_index, int next_fe_index, bool simulate)
305 eSmartPtrList<eDVBRegisteredFrontend> &frontends = simulate ? m_res_mgr->m_simulate_frontend : m_res_mgr->m_frontend;
307 eFecDebug(" [*][eFBCTunerManager::connectLinkByIndex] try to unlink %d->%d->%d %s", prev_fe_index, link_fe_index, next_fe_index, simulate?"(simulate)":"");
309 eDVBRegisteredFrontend *link_fe=NULL;
310 eDVBRegisteredFrontend *prev_fe=NULL;
311 eDVBRegisteredFrontend *next_fe=NULL;
313 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
315 if (FE_SLOT_ID(it) == prev_fe_index)
319 else if (FE_SLOT_ID(it) == next_fe_index)
323 else if (FE_SLOT_ID(it) == link_fe_index)
329 if (prev_fe && next_fe && link_fe)
332 prev_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)next_fe);
333 next_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)prev_fe);
335 link_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)-1);
336 link_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)-1);
338 /* enable linked fe */
339 link_fe->m_frontend->setEnabled(false);
343 eDebug(" [*][eFBCTunerManager::disconnectLinkByIndex] disconnect failed! (prev_fe : %p, next_fe : %p, link_fe : %p, %s)", prev_fe, next_fe, link_fe, simulate?"simulate":"");
349 int eFBCTunerManager::disconnectLinkByIndex(int link_fe_index, int prev_fe_index, bool simulate)
351 eSmartPtrList<eDVBRegisteredFrontend> &frontends = simulate ? m_res_mgr->m_simulate_frontend : m_res_mgr->m_frontend;
353 eFecDebug(" [*][eFBCTunerManager::connectLinkByIndex] try to unlink %d->%d %s", prev_fe_index, link_fe_index, simulate?"(simulate)":"");
355 eDVBRegisteredFrontend *link_fe=NULL;
356 eDVBRegisteredFrontend *prev_fe=NULL;
358 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
360 if (FE_SLOT_ID(it) == prev_fe_index)
364 else if (FE_SLOT_ID(it) == link_fe_index)
370 if (prev_fe && link_fe)
373 prev_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)-1);
374 link_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)-1);
376 /* enable linked fe */
377 link_fe->m_frontend->setEnabled(false);
381 eDebug(" [*][eFBCTunerManager::disconnectLinkByIndex] disconnect failed! (prev_fe : %p, link_fe : %p, %s)", prev_fe, link_fe, simulate?"simulate":"");
388 int eFBCTunerManager::connectLink(eDVBRegisteredFrontend *link_fe, eDVBRegisteredFrontend *prev_fe, eDVBRegisteredFrontend *next_fe, bool simulate)
390 eFecDebug(" [*][eFBCTunerManager::connectLink] try to link %d->%d->%d %s", FE_SLOT_ID(prev_fe), FE_SLOT_ID(link_fe), FE_SLOT_ID(next_fe), simulate?"(simulate)":"");
391 int ret = connectLinkByIndex(FE_SLOT_ID(link_fe), FE_SLOT_ID(prev_fe), FE_SLOT_ID(next_fe), !simulate);
394 prev_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)link_fe);
395 link_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)prev_fe);
397 link_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)next_fe);
398 next_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)link_fe);
400 /* enable linked fe */
401 link_fe->m_frontend->setEnabled(true);
407 int eFBCTunerManager::connectLink(eDVBRegisteredFrontend *link_fe, eDVBRegisteredFrontend *prev_fe, bool simulate)
409 eFecDebug(" [*][eFBCTunerManager::connectLink] try to link %d->%d %s", FE_SLOT_ID(prev_fe), FE_SLOT_ID(link_fe), simulate?"(simulate)":"");
410 int ret = connectLinkByIndex(FE_SLOT_ID(link_fe), FE_SLOT_ID(prev_fe), !simulate);
413 prev_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)link_fe);
414 link_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)prev_fe);
416 /* enable linked fe */
417 link_fe->m_frontend->setEnabled(true);
423 int eFBCTunerManager::disconnectLink(eDVBRegisteredFrontend *link_fe, eDVBRegisteredFrontend *prev_fe, eDVBRegisteredFrontend *next_fe, bool simulate)
425 eFecDebug(" [*][eFBCTunerManager::disconnectLink] disconnect %d->%d->%d %s", FE_SLOT_ID(prev_fe), FE_SLOT_ID(link_fe), FE_SLOT_ID(next_fe), simulate?"(simulate)":"");
426 int ret = disconnectLinkByIndex(FE_SLOT_ID(link_fe), FE_SLOT_ID(prev_fe), FE_SLOT_ID(next_fe), !simulate);
429 prev_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)next_fe);
430 next_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)prev_fe);
432 link_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)-1);
433 link_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)-1);
435 link_fe->m_frontend->setEnabled(false);
441 int eFBCTunerManager::disconnectLink(eDVBRegisteredFrontend *link_fe, eDVBRegisteredFrontend *prev_fe, bool simulate)
443 eFecDebug(" [*][eFBCTunerManager::disconnectLink] disconnect %d->%d %s", FE_SLOT_ID(prev_fe), FE_SLOT_ID(link_fe), simulate?"(simulate)":"");
444 int ret = disconnectLinkByIndex(FE_SLOT_ID(link_fe), FE_SLOT_ID(prev_fe), !simulate);
447 prev_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)-1);
448 link_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)-1);
450 link_fe->m_frontend->setEnabled(false);
456 /* no set pair simulate fe */
457 /* no set proc fbc_id */
458 void eFBCTunerManager::connectLinkNoSimulate(eDVBRegisteredFrontend *link_fe, eDVBRegisteredFrontend *top_fe)
460 eDVBRegisteredFrontend *last_fe = getLast(top_fe);
462 last_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)link_fe);
463 link_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)last_fe);
465 /* enable linked fe */
466 link_fe->m_frontend->setEnabled(true);
469 updateLNBSlotMask(FE_SLOT_ID(link_fe), FE_SLOT_ID(top_fe), false);
472 /* no set pair simulate fe */
473 /* no set proc fbc_id */
474 void eFBCTunerManager::disconnectLinkNoSimulate(eDVBRegisteredFrontend *link_fe)
478 eFecDebug("[*][eFBCTunerManager::disconnectLinkNoSimulate] link fe is no last.");
482 eDVBRegisteredFrontend *prev_fe = getPrev(link_fe);
486 eFecDebug("[*][eFBCTunerManager::disconnectLinkNoSimulate] can not found prev fe.");
490 prev_fe->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)-1);
491 link_fe->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)-1);
493 /* enable linked fe */
494 link_fe->m_frontend->setEnabled(false);
497 updateLNBSlotMask(FE_SLOT_ID(link_fe), FE_SLOT_ID(prev_fe), true);
500 bool eFBCTunerManager::checkUsed(eDVBRegisteredFrontend *fe, bool a_simulate)
505 bool simulate = !a_simulate;
507 eSmartPtrList<eDVBRegisteredFrontend> &frontends = simulate ? m_res_mgr->m_simulate_frontend : m_res_mgr->m_frontend;
508 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
510 if (FE_SLOT_ID(it) == FE_SLOT_ID(fe))
512 return (it->m_inuse >0)?true:false;
516 eDebug("[*][eFBCTunerManager::checkUsed] ERROR! can not found fe ptr (feid : %d, simulate : %d)", FE_SLOT_ID(fe), simulate);
520 bool eFBCTunerManager::canLink(eDVBRegisteredFrontend *fe)
525 if(getPrev(fe) || getNext(fe))
534 bool eFBCTunerManager::isUnicable(eDVBRegisteredFrontend *fe)
536 int slot_idx = FE_SLOT_ID(fe);
537 bool is_unicable = false;
539 ePtr<eDVBSatelliteEquipmentControl> sec = eDVBSatelliteEquipmentControl::getInstance();
540 for (int idx=0; idx <= sec->m_lnbidx; ++idx )
542 eDVBSatelliteLNBParameters &lnb_param = sec->m_lnbs[idx];
543 if ( lnb_param.m_slot_mask & (1 << slot_idx) )
545 is_unicable = lnb_param.SatCR_idx != -1;
552 int eFBCTunerManager::isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm, eDVBRegisteredFrontend *link_fe, bool simulate)
554 eDVBRegisteredFrontend *best_fbc_fe;
555 return isCompatibleWith(feparm, link_fe, best_fbc_fe, simulate);
558 int eFBCTunerManager::isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm, eDVBRegisteredFrontend *link_fe, eDVBRegisteredFrontend *&fbc_fe, bool simulate)
562 eSmartPtrList<eDVBRegisteredFrontend> &frontends = simulate ? m_res_mgr->m_simulate_frontend : m_res_mgr->m_frontend;
563 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
565 if (!it->m_frontend->is_FBCTuner())
571 if(!it->m_frontend->getEnabled())
574 if(!isSameFbcSet(FE_SLOT_ID(link_fe), FE_SLOT_ID(it)))
577 if(it->m_inuse == 0) // No link to a fe not in use.
580 if(isLinked(*it)) // No link to a fe linked to another.
587 connectLinkNoSimulate(link_fe, *it);
590 int c = link_fe->m_frontend->isCompatibleWith(feparm);
591 eFecDebug("[*][eFBCTunerManager::isCompatibleWith] score : %d (%d->%d)", c, FE_SLOT_ID(it), FE_SLOT_ID(link_fe));
595 fbc_fe = (eDVBRegisteredFrontend *)*it;
598 /* disconnect link */
599 disconnectLinkNoSimulate(link_fe);
602 eFecDebug("[*][eFBCTunerManager::isCompatibleWith] fe : %p(%d), score : %d %s", link_fe, FE_SLOT_ID(link_fe), best_score, simulate?"(simulate)":"");
607 void eFBCTunerManager::connectSortedLink(eDVBRegisteredFrontend *link_fe, eDVBRegisteredFrontend *top_fe, bool simulate)
609 int link_fe_id = FE_SLOT_ID(link_fe);
610 int top_fe_id = FE_SLOT_ID(top_fe);
611 int prev_fe_id = link_fe_id - 1;
613 eFecDebug(" [*][eFBCTunerManager::connectSortedLink] link_id : %d, top_id : %d %s", link_fe_id, top_fe_id, simulate?"(simulate)":"");
617 eFecDebug(" [*][eFBCTunerManager::connectSortedLink] link failed! link_id : %d, top_id : %d %s", link_fe_id, top_fe_id, simulate?"(simulate)":"");
622 eDVBRegisteredFrontend *next_fe = top_fe;
623 long linked_next_ptr = -1;
624 top_fe->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, linked_next_ptr);
625 while(linked_next_ptr != -1)
627 next_fe = (eDVBRegisteredFrontend *)linked_next_ptr;
628 next_fe->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, linked_next_ptr);
629 if (FE_SLOT_ID(next_fe) == prev_fe_id)
633 eDVBRegisteredFrontend *prev_fe = next_fe;
636 next_fe = getNext(prev_fe);
641 int res = connectLink(link_fe, prev_fe, next_fe, simulate);
644 eDebug("[*][eFBCTunerManager::connectSortedLink] ERROR! connect link failed! (%d->%d->%d)", FE_SLOT_ID(prev_fe), FE_SLOT_ID(link_fe), FE_SLOT_ID(next_fe));
650 int res = connectLink(link_fe, prev_fe, simulate);
653 eDebug("[*][eFBCTunerManager::connectSortedLink] ERROR! connect link failed! (%d->%d)", FE_SLOT_ID(prev_fe), FE_SLOT_ID(link_fe));
658 /* set proc fbc_id */
659 setProcFBCID(link_fe_id, getFBCID(top_fe_id));
662 updateLNBSlotMask(link_fe_id, top_fe_id, false);
665 /* attach link_fe to tail of fe linked list */
666 void eFBCTunerManager::addLink(eDVBRegisteredFrontend *link_fe, eDVBRegisteredFrontend *top_fe, bool simulate)
668 eFecDebug(" [*][eFBCTunerManager::addLink] addLink : %p(%d)->%p(%d) %s", top_fe, FE_SLOT_ID(top_fe), link_fe, FE_SLOT_ID(link_fe), simulate?"(simulate)":"");
670 if (!isRootFe(top_fe))
673 // eDVBRegisteredFrontend *top_fe = a_top_fe;
674 // if (!checkTop(top_fe))
675 // top_fe = getTop(top_fe);
677 // printLinks(top_fe);
678 connectSortedLink(link_fe, top_fe, simulate);
679 // printLinks(top_fe);
682 /* if fe, fe_simulated is unused, unlink current frontend from linked things. */
683 /* all unused linked fbc fe must be unlinked! */
684 void eFBCTunerManager::unset(eDVBRegisteredFrontend *fe)
686 bool simulate = fe->m_frontend->is_simulate();
691 if(checkUsed(fe, simulate))
697 eFecDebug(" [*][eFBCTunerManager::unset] fe id : %p(%d) %s", fe, FE_SLOT_ID(fe), simulate?"(simulate)":"");
702 eDVBRegisteredFrontend *linked_prev_fe = getPrev(fe);
703 eDVBRegisteredFrontend *linked_next_fe = getNext(fe);
707 eDebug("[*][eFBCTunerManager::unset] ERROR! can not found prev linked frontend (fe_id : %d)", FE_SLOT_ID(fe));
713 int res = disconnectLink(fe, linked_prev_fe, linked_next_fe, simulate);
716 eDebug("[*][eFBCTunerManager::unset] ERROR! disconnect link failed! (%d->%d->%d)", FE_SLOT_ID(linked_prev_fe), FE_SLOT_ID(fe), FE_SLOT_ID(linked_next_fe));
722 int res = disconnectLink(fe, linked_prev_fe, simulate);
725 eDebug("[*][eFBCTunerManager::unset] ERROR! disconnect link failed! (%d->%d)", FE_SLOT_ID(linked_prev_fe), FE_SLOT_ID(fe));
730 /* set proc fbc_id (skip) */
732 /* remove slot mask*/
733 updateLNBSlotMask(FE_SLOT_ID(fe), FE_SLOT_ID(linked_prev_fe), true);
738 bool eFBCTunerManager::canAllocateLink(eDVBRegisteredFrontend *fe, bool simulate)
746 eSmartPtrList<eDVBRegisteredFrontend> &frontends = simulate ? m_res_mgr->m_simulate_frontend : m_res_mgr->m_frontend;
747 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
749 if (it->m_frontend->is_FBCTuner() && !isRootFe(*it) && isSameFbcSet(FE_SLOT_ID(fe), FE_SLOT_ID(it)) && !it->m_frontend->getEnabled() && !isLinked(*it))
756 int eFBCTunerManager::updateLNBSlotMask(int dest_slot, int src_slot, bool remove)
758 ePtr<eDVBSatelliteEquipmentControl> sec = eDVBSatelliteEquipmentControl::getInstance();
760 int sec_lnbidx = sec->m_lnbidx;
763 for (int idx=0; idx <= sec_lnbidx; ++idx )
765 eDVBSatelliteLNBParameters &lnb_param = sec->m_lnbs[idx];
766 if ( lnb_param.m_slot_mask & (1 << src_slot) )
768 eFecDebug("[*][eFBCTunerManager::updateLNBSlotMask] m_slot_mask : %d", lnb_param.m_slot_mask);
771 lnb_param.m_slot_mask |= (1 << dest_slot);
773 lnb_param.m_slot_mask &= ~(1 << dest_slot);
775 eFecDebug("[*][eFBCTunerManager::updateLNBSlotMask] changed m_slot_mask : %d", lnb_param.m_slot_mask);
781 eFecDebug("[*][eFBCTunerManager::updateLNBSlotMask] src %d not found", src_slot);
786 int eFBCTunerManager::getLinkedSlotID(int fe_id)
789 eSmartPtrList<eDVBRegisteredFrontend> &frontends = m_res_mgr->m_frontend;
790 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
792 if(it->m_frontend->getSlotID() == fe_id)
795 it->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, prev_ptr);
798 eDVBRegisteredFrontend *prev_fe = (eDVBRegisteredFrontend *)prev_ptr;
799 link = FE_SLOT_ID(prev_fe);
805 eFecDebug(" [*][eFBCTunerManager::getLinkedSlotID] fe_id : %d, link : %d", fe_id, link);
810 void eFBCTunerManager::printLinks(eDVBRegisteredFrontend *fe)
812 long linked_prev_ptr = -1;
813 eDVBRegisteredFrontend *linked_prev_fe = fe;
814 fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr);
815 while (linked_prev_ptr != -1)
817 linked_prev_fe = (eDVBRegisteredFrontend*) linked_prev_ptr;
818 linked_prev_fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr);
821 long linked_next_ptr = -1;
822 eDVBRegisteredFrontend *linked_next_fe = linked_prev_fe;
823 eFecDebug(" [*][eFBCTunerManager::printLinks] fe id : %d (%p), inuse : %d, enabled : %d, fbc : %d", FE_SLOT_ID(linked_next_fe), linked_next_fe, linked_next_fe->m_inuse, linked_next_fe->m_frontend->getEnabled(), linked_next_fe->m_frontend->is_FBCTuner());
824 linked_prev_fe->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, linked_next_ptr);
825 while (linked_next_ptr != -1)
827 linked_next_fe = (eDVBRegisteredFrontend*) linked_next_ptr;
828 eFecDebug(" [*][eFBCTunerManager::printLinks] fe id : %d (%p), inuse : %d, enabled : %d, fbc : %d", FE_SLOT_ID(linked_next_fe), linked_next_fe, linked_next_fe->m_inuse, linked_next_fe->m_frontend->getEnabled(), linked_next_fe->m_frontend->is_FBCTuner());
829 linked_next_fe->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, (long&)linked_next_ptr);
832 eSmartPtrList<eDVBRegisteredFrontend> &frontends = m_res_mgr->m_frontend;
833 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(frontends.begin()); it != frontends.end(); ++it)
839 it->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, prev_ptr);
840 it->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, next_ptr);
843 eDVBRegisteredFrontend *prev_fe = (eDVBRegisteredFrontend *)prev_ptr;
844 prev = FE_SLOT_ID(prev_fe);
849 eDVBRegisteredFrontend *next_fe = (eDVBRegisteredFrontend *)next_ptr;
850 next = FE_SLOT_ID(next_fe);
853 eFecDebug(" [*][eFBCTunerManager::printLinks] fe_id : %d, inuse : %d, enabled : %d, fbc : %d, prev : %d, next : %d", FE_SLOT_ID(it), it->m_inuse, it->m_frontend->getEnabled(), it->m_frontend->is_FBCTuner(), prev, next);
856 eSmartPtrList<eDVBRegisteredFrontend> &simulate_frontends = m_res_mgr->m_simulate_frontend;
857 for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(simulate_frontends.begin()); it != simulate_frontends.end(); ++it)
863 it->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, prev_ptr);
864 it->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, next_ptr);
867 eDVBRegisteredFrontend *prev_fe = (eDVBRegisteredFrontend *)prev_ptr;
868 prev = FE_SLOT_ID(prev_fe);
873 eDVBRegisteredFrontend *next_fe = (eDVBRegisteredFrontend *)next_ptr;
874 next = FE_SLOT_ID(next_fe);
877 eFecDebug(" [*][eFBCTunerManager::printLinks] fe_id : %2d, inuse : %d, enabled : %d, fbc : %d, prev : %2d, cur : %2d, next : %2d (simulate)", FE_SLOT_ID(it), it->m_inuse, it->m_frontend->getEnabled(), it->m_frontend->is_FBCTuner(), prev, FE_SLOT_ID(it), next);