eSecDebugNoSimulate("ret5 %d", ret);
}
- if (ret && rotor && curRotorPos != -1 && (direct_connected || !satpos_depends_ptr) ) // direct conntected or loopthrough!
+ 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);
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, m_params[DELAY_AFTER_DISEQC_RESET_CMD]) );
+ diseqc.data[2] = 3;
+ // diseqc peripherial powersupply on
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_DISEQC_PERIPHERIAL_POWERON_CMD]) );
+ }
+
for (int seq_repeat = 0; seq_repeat < (di_param.m_seq_repeat?2:1); ++seq_repeat)
{
if ( send_mask & 4 )
csw = band;
}
- if (sendDiSEqC)
- sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) );
+// if (sendDiSEqC)
+ sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) );
sec_fe->setData(eDVBFrontend::NEW_CSW, csw);
sec_fe->setData(eDVBFrontend::NEW_UCSW, ucsw);
sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
}
- if (sendDiSEqC)
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
+// if (sendDiSEqC)
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
frontend.setSecSequence(sec_sequence);