#include <lib/dvb/sec.h>
#include <lib/dvb/rotor_calc.h>
#include <lib/dvb/dvbtime.h>
-
-#include <set>
-
-#if HAVE_DVB_API_VERSION < 3
-#define FREQUENCY Frequency
-#else
-#define FREQUENCY frequency
-#endif
#include <lib/base/eerror.h>
+#include <set>
//#define SEC_DEBUG
if (!simulate) \
eSecDebug(x); \
} while(0)
-// else \
-// { \
-// eDebugNoNewLine("SIMULATE:"); \
-// eDebug(x); \
-// } \
int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite &sat, iDVBFrontend *fe, int slot_id, int *highest_score_lnb)
{
bool simulate = ((eDVBFrontend*)fe)->is_simulate();
bool direct_connected = m_not_linked_slot_mask & slot_id;
int score=0, satcount=0;
- long linked_prev_ptr=-1, linked_next_ptr=-1, linked_csw=-1, linked_ucsw=-1, linked_toneburst=-1,
+ long linked_prev_ptr=-1, linked_next_ptr=-1, linkable_csw=-1, linkable_ucsw=-1, linkable_toneburst=-1,
fe_satpos_depends_ptr=-1, fe_rotor_pos=-1;
bool linked_in_use = false;
// when a linked in use tuner is found we get the tuner data...
if (linked_in_use)
{
- fe->getData(eDVBFrontend::CSW, linked_csw);
- fe->getData(eDVBFrontend::UCSW, linked_ucsw);
- fe->getData(eDVBFrontend::TONEBURST, linked_toneburst);
+ fe->getData(eDVBFrontend::LINKABLE_CSW, linkable_csw);
+ fe->getData(eDVBFrontend::LINKABLE_UCSW, linkable_ucsw);
+ fe->getData(eDVBFrontend::LINKABLE_TONEBURST, linkable_toneburst);
}
if (highest_score_lnb)
if (linked_in_use && !is_unicable)
{
// compare tuner data
- if ( (csw != linked_csw) ||
- ( diseqc && (ucsw != linked_ucsw || toneburst != linked_toneburst) ) ||
+ if ( (csw != linkable_csw) ||
+ ( diseqc && (ucsw != linkable_ucsw || toneburst != linkable_toneburst) ) ||
( rotor && rotor_pos != sat.orbital_position ) )
{
ret = 0;
if (!simulate) \
eDebug(x); \
} while(0)
-// else \
-// { \
-// eDebugNoNewLine("SIMULATE:"); \
-// eDebug(x); \
-// } \
RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int slot_id, unsigned int tunetimeout)
{
int RotorCmd=-1;
int send_mask = 0;
+ bool direct_connected = m_not_linked_slot_mask & slot_id;
+
lnb_param.guard_offset = 0; //HACK
frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr);
- if (!(m_not_linked_slot_mask & slot_id)) // frontend with direct connection?
+ if (!direct_connected) // frontend with direct connection?
{
long linked_prev_ptr;
frontend.getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr);
}
if (satposDependPtr != -1) // we dont need uncommitted switch and rotor cmds on second output of a rotor lnb
diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
+#if 0 // Since following code causes lock fail for linked tuners in certain conditions, it does not apply.
else {
// in eDVBFrontend::tuneLoop we call closeFrontend and ->inc_use() in this this condition (to put the kernel frontend thread into idle state)
// so we must resend all diseqc stuff (voltage is disabled when the frontend is closed)
if (!linked_fe->m_inuse && state != eDVBFrontend::stateIdle)
forceChanged = true;
}
+#endif
}
sec_fe->getData(eDVBFrontend::CSW, lastcsw);
// calc Frequency
int local= abs(sat.frequency
- lof);
- parm.FREQUENCY = ((((local * 2) / 125) + 1) / 2) * 125;
- frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY);
+ parm.frequency = ((((local * 2) / 125) + 1) / 2) * 125;
+ frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.frequency);
if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V
|| ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation_Vertical
-lof)
- 100000;
volatile unsigned int tmp2 = (1000 + 2 * tmp1) / (2 *1000); //round to multiple of 1000
- parm.FREQUENCY = lnb_param.SatCRvco - (tmp1 - (1000 * tmp2));
- frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - lof -(lnb_param.SatCRvco - parm.FREQUENCY));
+ parm.frequency = lnb_param.SatCRvco - (tmp1 - (1000 * tmp2));
+ frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - lof -(lnb_param.SatCRvco - parm.frequency));
lnb_param.UnicableTuningWord =
(band & 0x3) //Bit0:HighLow Bit1:VertHor
+ lnb_param.guard_offset;
volatile unsigned int tmp2 = (4000 + 2 * tmp1) / (2 *4000); //round to multiple of 4000
- parm.FREQUENCY = lnb_param.SatCRvco - (tmp1 - (4000 * tmp2)) + lnb_param.guard_offset;
+ parm.frequency = lnb_param.SatCRvco - (tmp1 - (4000 * tmp2)) + lnb_param.guard_offset;
lnb_param.UnicableTuningWord = tmp2
| ((band & 1) ? 0x400 : 0) //HighLow
| ((band & 2) ? 0x800 : 0) //VertHor
bool send_csw =
(di_param.m_committed_cmd != eDVBSatelliteDiseqcParameters::SENDNO);
- bool changed_csw = send_csw && (forceChanged || csw != lastcsw);
bool send_ucsw =
(di_param.m_uncommitted_cmd && diseqc_mode > eDVBSatelliteDiseqcParameters::V1_0);
- bool changed_ucsw = send_ucsw && (forceChanged || ucsw != lastucsw);
bool send_burst =
(di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO);
- bool changed_burst = send_burst && (forceChanged || toneburst != lastToneburst);
+
+ bool changed_csw = false;
+ bool changed_ucsw = false;
+ bool changed_burst = false;
+ if (direct_connected || (linked_fe && (!linked_fe->m_frontend->isLoopTimerActive() || !linked_fe->m_frontend->isScheduledSendDiseqc())))
+ {
+ changed_csw = send_csw && (forceChanged || csw != lastcsw);
+ changed_ucsw = send_ucsw && (forceChanged || ucsw != lastucsw);
+ changed_burst = send_burst && (forceChanged || toneburst != lastToneburst);
+ }
/* send_mask
1 must send csw
sec_fe->setData(eDVBFrontend::NEW_CSW, csw);
sec_fe->setData(eDVBFrontend::NEW_UCSW, ucsw);
sec_fe->setData(eDVBFrontend::NEW_TONEBURST, di_param.m_toneburst_param);
+ sec_fe->setData(eDVBFrontend::LINKABLE_CSW, csw);
+ sec_fe->setData(eDVBFrontend::LINKABLE_UCSW, ucsw);
+ sec_fe->setData(eDVBFrontend::LINKABLE_TONEBURST, di_param.m_toneburst_param);
if(is_unicable)
{
it->m_frontend->setData(eDVBFrontend::ROTOR_POS, -1);
it->m_frontend->setData(eDVBFrontend::ROTOR_CMD, -1);
it->m_frontend->setData(eDVBFrontend::SATCR, -1);
+
+ if (it->m_frontend->is_FBCTuner())
+ {
+ eFBCTunerManager *fbcmng = eFBCTunerManager::getInstance();
+ if (fbcmng)
+ fbcmng->setDefaultFBCID(*it);
+ }
}
for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_simulate_frontends.begin()); it != m_avail_simulate_frontends.end(); ++it)
char c;
p1->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)p2);
p2->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)p1);
+
+ eFBCTunerManager *fbcmng = eFBCTunerManager::getInstance();
+ if (p1->m_frontend->is_FBCTuner() && fbcmng)
+ {
+ fbcmng->updateFBCID(p1, p2);
+ }
}
p1=p2=NULL;