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;
if (highest_score_lnb)
if ( sit != lnb_param.m_satellites.end())
{
bool diseqc=false;
- bool direct_connected = m_not_linked_slot_mask & slot_id;
long band=0,
linked_prev_ptr=-1,
linked_next_ptr=-1,
eSecDebugNoSimulate("ret4 %d", ret);
}
- if (ret && rotor && curRotorPos != -1 && direct_connected) {
- ret -= abs(curRotorPos-sat.orbital_position);
- }
-
- eSecDebugNoSimulate("ret5 %d", ret);
-
if (ret)
if (satpos_depends_ptr != -1)
{
if (!rotor || curRotorPos != sat.orbital_position)
ret=0;
}
- eSecDebugNoSimulate("ret6 %d", ret);
+ eSecDebugNoSimulate("ret5 %d", ret);
}
+ if (ret && rotor && curRotorPos != -1 && (direct_connected || satpos_depends_ptr == -1) ) // direct conntected or loopthrough!
+ ret -= abs(curRotorPos-sat.orbital_position);
+
+ eSecDebugNoSimulate("ret6 %d", ret);
+
if (ret)
{
int lof = sat.frequency > lnb_param.m_lof_threshold ?
}
if (score && satcount)
score -= (satcount-1);
- if (score && m_not_linked_slot_mask & slot_id)
+ if (score && direct_connected)
score += 5; // increase score for tuners with direct sat connection
eSecDebugNoSimulate("final score %d", score);
return score;
bool doSetFrontend = true;
bool doSetVoltageToneFrontend = true;
bool sendDiSEqC = false;
+ bool forceChanged = false;
+ bool needDiSEqCReset = false;
long band=0,
voltage = iDVBFrontend::voltageOff,
tone = iDVBFrontend::toneOff,
curRotorPos = -1,
satposDependPtr = -1;
iDVBFrontend *sec_fe=&frontend;
+ eDVBRegisteredFrontend *linked_fe = 0;
eDVBSatelliteDiseqcParameters::t_diseqc_mode diseqc_mode = di_param.m_diseqc_mode;
frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr);
frontend.getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr);
while (linked_prev_ptr != -1)
{
- eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_prev_ptr;
+ linked_fe = (eDVBRegisteredFrontend*) linked_prev_ptr;
sec_fe = linked_fe->m_frontend;
sec_fe->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)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;
+ 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)
+ int state;
+ sec_fe->getState(state);
+ if (!linked_fe->m_inuse && state != eDVBFrontend::stateIdle)
+ forceChanged = true;
+ }
}
sec_fe->getData(eDVBFrontend::CSW, lastcsw);
sec_fe->getData(eDVBFrontend::ROTOR_CMD, lastRotorCmd);
sec_fe->getData(eDVBFrontend::ROTOR_POS, curRotorPos);
+ if (lastcsw == lastucsw && lastToneburst == lastucsw && lastucsw == -1)
+ needDiSEqCReset = true;
+
if ( sat.frequency > lnb_param.m_lof_threshold )
band |= 1;
bool send_csw =
(di_param.m_committed_cmd != eDVBSatelliteDiseqcParameters::SENDNO);
- bool changed_csw = send_csw && csw != lastcsw;
+ 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 && ucsw != lastucsw;
+ bool changed_ucsw = send_ucsw && (forceChanged || ucsw != lastucsw);
bool send_burst =
(di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO);
- bool changed_burst = send_burst && toneburst != lastToneburst;
+ bool changed_burst = send_burst && (forceChanged || toneburst != lastToneburst);
int send_mask = 0; /*
1 must send csw
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS]) );
sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_SWITCHPARMS) );
+ if (needDiSEqCReset)
+ {
+ eDVBDiseqcCommand diseqc;
+ memset(diseqc.data, 0, MAX_DISEQC_LENGTH);
+ diseqc.len = 3;
+ diseqc.data[0] = 0xE0;
+ diseqc.data[1] = 0;
+ diseqc.data[2] = 0;
+ // diseqc reset
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );
+ diseqc.data[2] = 3;
+ // diseqc peripherial powersupply on
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 150) );
+ }
+
for (int seq_repeat = 0; seq_repeat < (di_param.m_seq_repeat?2:1); ++seq_repeat)
{
if ( send_mask & 4 )
sec_sequence.push_back( eSecCommand(eSecCommand::SEND_TONEBURST, di_param.m_toneburst_param) );
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_TONEBURST]) );
}
+
+ if (di_param.m_seq_repeat && seq_repeat == 0)
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_BEFORE_SEQUENCE_REPEAT]) );
}
sendDiSEqC = true;
}