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.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx);
if (diseqc13V)
voltage_mode = eDVBSatelliteSwitchParameters::HV;
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);
}
else
{
- int tmp1 = abs(sat.frequency
- -lof)
- + lnb_param.SatCRvco
- - 1400000
- + lnb_param.guard_offset;
- int tmp2 = ((((tmp1 * 2) / 4000) + 1) / 2) * 4000;
- parm.FREQUENCY = lnb_param.SatCRvco - (tmp1-tmp2) + lnb_param.guard_offset;
- lnb_param.UnicableTuningWord = ((tmp2 / 4000)
- | ((band & 1) ? 0x400 : 0) //HighLow
- | ((band & 2) ? 0x800 : 0) //VertHor
- | ((lnb_param.LNBNum & 1) ? 0 : 0x1000) //Umschaltung LNB1 LNB2
- | (lnb_param.SatCR_idx << 13)); //Adresse des SatCR
- eDebug("[prepare] UnicableTuningWord %#04x",lnb_param.UnicableTuningWord);
- eDebug("[prepare] guard_offset %d",lnb_param.guard_offset);
- frontend.setData(eDVBFrontend::FREQ_OFFSET, (lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 + lof - (2 * (lnb_param.SatCRvco - (tmp1-tmp2))) );
+ switch(lnb_param.SatCR_format)
+ {
+ case 1:
+ {
+ eDebug("[prepare] JESS");
+
+ int tmp1 = abs(sat.frequency
+ -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));
+
+ lnb_param.UnicableTuningWord =
+ (band & 0x3) //Bit0:HighLow Bit1:VertHor
+ | (((lnb_param.LNBNum - 1) & 0x3F) << 2) //position number (max. 63)
+ | ((tmp2 & 0x7FF)<< 8) //frequency (-100MHz Offset)
+ | ((lnb_param.SatCR_idx & 0x1F) << 19); //adresse of SatCR (max. 32)
+
+ eDebug("[prepare] UnicableTuningWord %#06x",lnb_param.UnicableTuningWord);
+ }
+ break;
+ case 0:
+ default:
+ {
+ eDebug("[prepare] Unicable");
+ int tmp1 = abs(sat.frequency
+ -lof)
+ + lnb_param.SatCRvco
+ - 1400000
+ + 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;
+ lnb_param.UnicableTuningWord = tmp2
+ | ((band & 1) ? 0x400 : 0) //HighLow
+ | ((band & 2) ? 0x800 : 0) //VertHor
+ | ((lnb_param.LNBNum & 1) ? 0 : 0x1000) //Umschaltung LNB1 LNB2
+ | (lnb_param.SatCR_idx << 13); //Adresse des SatCR
+
+ eDebug("[prepare] UnicableTuningWord %#04x",lnb_param.UnicableTuningWord);
+ eDebug("[prepare] guard_offset %d",lnb_param.guard_offset);
+
+ frontend.setData(eDVBFrontend::FREQ_OFFSET, (lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 + lof - (2 * (lnb_param.SatCRvco - (tmp1 - (4000 * tmp2)))) );
+ }
+ }
voltage = VOLTAGE(13);
}
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)
{
sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS]) ); // wait 20 ms after voltage change
-
+
eDVBDiseqcCommand diseqc;
memset(diseqc.data, 0, MAX_DISEQC_LENGTH);
- diseqc.len = 5;
- diseqc.data[0] = 0xE0;
- diseqc.data[1] = 0x10;
- diseqc.data[2] = 0x5A;
- diseqc.data[3] = lnb_param.UnicableTuningWord >> 8;
- diseqc.data[4] = lnb_param.UnicableTuningWord;
+
+ long oldSatcr, oldPin, oldDiction;
+ frontend.getData(eDVBFrontend::SATCR, oldSatcr);
+ frontend.getData(eDVBFrontend::PIN, oldPin);
+ frontend.getData(eDVBFrontend::DICTION, oldDiction);
+
+ if((oldSatcr != -1) && (oldSatcr != lnb_param.SatCR_idx))
+ {
+ switch (oldDiction)
+ {
+ case 1:
+ if(oldPin < 1)
+ {
+ diseqc.len = 4;
+ diseqc.data[0] = 0x70;
+ }
+ else
+ {
+ diseqc.len = 5;
+ diseqc.data[0] = 0x71;
+ diseqc.data[4] = oldPin;
+ }
+ diseqc.data[1] = oldSatcr << 3;
+ diseqc.data[2] = 0x00;
+ diseqc.data[3] = 0x00;
+ break;
+ case 0:
+ default:
+ if(oldPin < 1)
+ {
+ diseqc.len = 5;
+ diseqc.data[2] = 0x5A;
+ }
+ else
+ {
+ diseqc.len = 6;
+ diseqc.data[2] = 0x5C;
+ diseqc.data[5] = oldPin;
+ }
+ diseqc.data[0] = 0xE0;
+ diseqc.data[1] = 0x10;
+ diseqc.data[3] = oldSatcr << 5;
+ diseqc.data[4] = 0x00;
+ break;
+ }
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) );
+ frontend.setData(eDVBFrontend::SATCR, -1);
+ }
+
+ frontend.setData(eDVBFrontend::DICTION, lnb_param.SatCR_format);
+//TODO frontend.setData(eDVBFrontend::PIN, lnb_param.SatCR_pin);
+
+ long pin = 0; // hack
+
+ switch(lnb_param.SatCR_format)
+ {
+ case 1: //JESS
+ if(pin < 1)
+ {
+ diseqc.len = 4;
+ diseqc.data[0] = 0x70;
+ diseqc.data[1] = lnb_param.UnicableTuningWord >> 16;
+ diseqc.data[2] = lnb_param.UnicableTuningWord >> 8;
+ diseqc.data[3] = lnb_param.UnicableTuningWord;
+ }
+ else
+ {
+ diseqc.len = 5;
+ diseqc.data[0] = 0x71;
+ diseqc.data[4] = pin;
+ }
+ diseqc.data[1] = lnb_param.UnicableTuningWord >> 16;
+ diseqc.data[2] = lnb_param.UnicableTuningWord >> 8;
+ diseqc.data[3] = lnb_param.UnicableTuningWord;
+ break;
+ case 0: //DiSEqC
+ default:
+ if(pin < 1)
+ {
+ diseqc.len = 5;
+ diseqc.data[2] = 0x5A;
+ }
+ else
+ {
+ diseqc.len = 6;
+ diseqc.data[2] = 0x5C;
+ diseqc.data[5] = pin;
+ }
+ diseqc.data[0] = 0xE0;
+ diseqc.data[1] = 0x10;
+ diseqc.data[3] = lnb_param.UnicableTuningWord >> 8;
+ diseqc.data[4] = lnb_param.UnicableTuningWord;
+ }
+ frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx);
sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) );
return -1;
}
-void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr)
+void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend)
{
+ long satcr, diction, pin;
eSecCommandList sec_sequence;
// check if voltage is disabled
eDVBDiseqcCommand diseqc;
memset(diseqc.data, 0, MAX_DISEQC_LENGTH);
- diseqc.len = 5;
- diseqc.data[0] = 0xE0;
- diseqc.data[1] = 0x10;
- diseqc.data[2] = 0x5A;
- diseqc.data[3] = satcr << 5;
- diseqc.data[4] = 0x00;
+ frontend.getData(eDVBFrontend::SATCR, satcr);
+ frontend.getData(eDVBFrontend::DICTION, diction);
+ frontend.getData(eDVBFrontend::PIN, pin);
+
+ switch (diction)
+ {
+ case 1:
+ if(pin < 1)
+ {
+ diseqc.len = 4;
+ diseqc.data[0] = 0x70;
+ }
+ else
+ {
+ diseqc.len = 5;
+ diseqc.data[0] = 0x71;
+ diseqc.data[4] = pin;
+ }
+ diseqc.data[1] = satcr << 3;
+ diseqc.data[2] = 0x00;
+ diseqc.data[3] = 0x00;
+ break;
+ case 0:
+ default:
+ if(pin < 1)
+ {
+ diseqc.len = 5;
+ diseqc.data[2] = 0x5A;
+ }
+ else
+ {
+ diseqc.len = 6;
+ diseqc.data[2] = 0x5C;
+ diseqc.data[5] = pin;
+ }
+ diseqc.data[0] = 0xE0;
+ diseqc.data[1] = 0x10;
+ diseqc.data[3] = satcr << 5;
+ diseqc.data[4] = 0x00;
+ break;
+ }
+ frontend.setData(eDVBFrontend::SATCR, -1);
sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) );
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)
}
/* Unicable Specific Parameters */
+RESULT eDVBSatelliteEquipmentControl::setLNBSatCRformat(int SatCR_format)
+{
+ eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCRformat(%d)", SatCR_format);
+ if(!((SatCR_format >-1) && (SatCR_format < 2)))
+ return -EPERM;
+ if ( currentLNBValid() )
+ m_lnbs[m_lnbidx].SatCR_format = SatCR_format;
+ else
+ return -ENOENT;
+ return 0;
+}
+
RESULT eDVBSatelliteEquipmentControl::setLNBSatCR(int SatCR_idx)
{
eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCR(%d)", SatCR_idx);
return -ENOENT;
}
+RESULT eDVBSatelliteEquipmentControl::getLNBSatCRformat()
+{
+ if ( currentLNBValid() )
+ return m_lnbs[m_lnbidx].SatCR_format;
+ return -ENOENT;
+}
+
RESULT eDVBSatelliteEquipmentControl::getLNBSatCR()
{
if ( currentLNBValid() )
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;