eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl()
{
m_lnblist.push_back(eDVBSatelliteLNBParameters());
- eDVBSatelliteLNBParameters &lnb_ref = m_lnblist.front();
- eDVBSatelliteParameters &astra1 = lnb_ref.m_satellites[192];
- eDVBSatelliteDiseqcParameters &diseqc_ref = astra1.m_diseqc_parameters;
- eDVBSatelliteSwitchParameters &switch_ref = astra1.m_switch_parameters;
-
- lnb_ref.m_lof_hi = 10600000;
- lnb_ref.m_lof_lo = 9750000;
- lnb_ref.m_lof_threshold = 11700000;
-
- diseqc_ref.m_diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
- diseqc_ref.m_committed_cmd = eDVBSatelliteDiseqcParameters::AA;
- diseqc_ref.m_repeats = 0;
- diseqc_ref.m_seq_repeat = false;
- diseqc_ref.m_swap_cmds = false;
- diseqc_ref.m_toneburst_param = eDVBSatelliteDiseqcParameters::NO;
- diseqc_ref.m_uncommitted_cmd = 0;
- diseqc_ref.m_use_fast = 1;
-
- switch_ref.m_22khz_signal = eDVBSatelliteSwitchParameters::HILO;
- switch_ref.m_voltage_mode = eDVBSatelliteSwitchParameters::HV;
+ eDVBSatelliteLNBParameters &lnb1_ref = m_lnblist.back();
+ eDVBSatelliteDiseqcParameters &diseqc1_ref = lnb1_ref.m_diseqc_parameters;
+
+/*
+ eDVBSatelliteRotorParameters &rotor_ref = lnb1_ref.m_rotor_parameters;
+ eDVBSatelliteRotorParameters::eDVBSatelliteRotorInputpowerParameters &rotor_input_ref = rotor_ref.m_inputpower_parameters;
+ eDVBSatelliteRotorParameters::eDVBSatelliteRotorGotoxxParameters &rotor_gotoxx_ref = rotor_ref.m_gotoxx_parameters;
+
+ rotor_input_ref.m_use = true;
+ rotor_input_ref.m_threshold = 50;
+
+ rotor_gotoxx_ref.m_can_use = true;
+ rotor_gotoxx_ref.m_lo_direction = eDVBSatelliteRotorParameters::EAST;
+ rotor_gotoxx_ref.m_la_direction = eDVBSatelliteRotorParameters::NORTH;
+ rotor_gotoxx_ref.m_longitude = 8.683;
+ rotor_gotoxx_ref.m_latitude = 51.017;*/
+
+ lnb1_ref.m_lof_hi = 10600000;
+ lnb1_ref.m_lof_lo = 9750000;
+ lnb1_ref.m_lof_threshold = 11700000;
+
+ diseqc1_ref.m_diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
+ diseqc1_ref.m_committed_cmd = eDVBSatelliteDiseqcParameters::AA;
+ diseqc1_ref.m_repeats = 0;
+ diseqc1_ref.m_seq_repeat = false;
+ diseqc1_ref.m_swap_cmds = false;
+ diseqc1_ref.m_toneburst_param = eDVBSatelliteDiseqcParameters::NO;
+ diseqc1_ref.m_uncommitted_cmd = 0;
+ diseqc1_ref.m_use_fast = 0;
+
+ eDVBSatelliteSwitchParameters &astra_ref = lnb1_ref.m_satellites[192];
+ astra_ref.m_22khz_signal = eDVBSatelliteSwitchParameters::HILO;
+ astra_ref.m_voltage_mode = eDVBSatelliteSwitchParameters::HV;
+
+// HOTBIRD
+
+ m_lnblist.push_back(eDVBSatelliteLNBParameters());
+ eDVBSatelliteLNBParameters &lnb2_ref = m_lnblist.back();
+ eDVBSatelliteDiseqcParameters &diseqc2_ref = lnb2_ref.m_diseqc_parameters;
+
+ lnb2_ref.m_lof_hi = 10600000;
+ lnb2_ref.m_lof_lo = 9750000;
+ lnb2_ref.m_lof_threshold = 11700000;
+
+ diseqc2_ref.m_diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
+ diseqc2_ref.m_committed_cmd = eDVBSatelliteDiseqcParameters::AB;
+ diseqc2_ref.m_repeats = 0;
+ diseqc2_ref.m_seq_repeat = false;
+ diseqc2_ref.m_swap_cmds = false;
+ diseqc1_ref.m_toneburst_param = eDVBSatelliteDiseqcParameters::NO;
+ diseqc2_ref.m_uncommitted_cmd = 0;
+ diseqc2_ref.m_use_fast = 0;
+
+ eDVBSatelliteSwitchParameters &hotbird_ref = lnb2_ref.m_satellites[130];
+ hotbird_ref.m_22khz_signal = eDVBSatelliteSwitchParameters::HILO;
+ hotbird_ref.m_voltage_mode = eDVBSatelliteSwitchParameters::HV;
}
RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat)
for (;it != m_lnblist.end(); ++it )
{
eDVBSatelliteLNBParameters &lnb_param = *it;
- std::map<int, eDVBSatelliteParameters>::iterator sit =
+ eDVBSatelliteDiseqcParameters &di_param = lnb_param.m_diseqc_parameters;
+ eDVBSatelliteRotorParameters &rotor_param = lnb_param.m_rotor_parameters;
+
+ std::map<int, eDVBSatelliteSwitchParameters>::iterator sit =
lnb_param.m_satellites.find(sat.orbital_position);
if ( sit != lnb_param.m_satellites.end())
{
- eDVBSatelliteDiseqcParameters &di_param = sit->second.m_diseqc_parameters;
- eDVBSatelliteSwitchParameters &sw_param = sit->second.m_switch_parameters;
- eDVBSatelliteRotorParameters &rotor_param = sit->second.m_rotor_parameters;
+ eDVBSatelliteSwitchParameters &sw_param = sit->second;
+
int hi=0,
voltage = iDVBFrontend::voltageOff,
tone = iDVBFrontend::toneOff,
frontend.getData(0, lastcsw);
frontend.getData(1, lastucsw);
frontend.getData(2, lastToneburst);
- frontend.getData(3, lastRotorCmd);
- frontend.getData(4, curRotorPos);
+ frontend.getData(5, lastRotorCmd);
+ frontend.getData(6, curRotorPos);
if ( sat.frequency > lnb_param.m_lof_threshold )
hi = 1;
tone = iDVBFrontend::toneOff;
eSecCommandList sec_sequence;
- bool setVoltage=true;
if (di_param.m_diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0)
{
if ( send_diseqc || changed_burst )
{
sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
+ eSecCommand::pair compare;
+ compare.voltage = voltage;
+ compare.steps = +3;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // voltage already correct ?
sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 30) ); // standard says 15 msek here
- setVoltage=false;
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );
}
if ( send_diseqc )
}
if ( RotorCmd != lastRotorCmd )
{
+ if ( changed_burst || send_diseqc )
+ {
+ // override first voltage change
+ *(++(++sec_sequence.begin()))=eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13);
+ // wait 1 second after first switch diseqc command
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 1000) );
+ }
+ else // no other diseqc commands before
+ {
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 15) ); // wait 50msec after voltage change
+ eSecCommand::pair compare;
+ compare.voltage = voltage;
+ compare.steps = +3;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // voltage already correct ?
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec after voltage change
+ }
+
eDVBDiseqcCommand diseqc;
diseqc.data[0] = 0xE0;
diseqc.data[1] = 0x31; // positioner
diseqc.data[2] = 0x6B; // goto stored sat position
diseqc.data[3] = RotorCmd;
}
+
if ( rotor_param.m_inputpower_parameters.m_use )
{ // use measure rotor input power to detect rotor state
- sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER) );
+ eSecCommand::rotor cmd;
+// measure idle power values
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_IDLE_INPUTPOWER_AVAIL_GOTO, +8) ); // already measured?
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec after voltage change
+ sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 100) ); // wait 100msec before measure
+ sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); // back to lower voltage
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec
+////////////////////////////
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec after voltage change
sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 40) ); // 2 seconds rotor start timout
+// rotor start loop
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // 50msec delay
+ sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
+ cmd.direction=1; // check for running rotor
+ cmd.deltaA=rotor_param.m_inputpower_parameters.m_threshold;
+ cmd.steps=+3;
+ cmd.okcount=0;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); // check if rotor has started
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +11 ) ); // timeout ?
+ sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // goto loop start
+////////////////////
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 2400) ); // 2 minutes running timeout
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
+// rotor running loop
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec
+ sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
+ cmd.direction=0; // check for stopped rotor
+ cmd.steps=+3;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) ); // timeout ?
+ sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // running loop start
+/////////////////////
+ sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
frontend.setData(3, RotorCmd);
frontend.setData(4, sat.orbital_position);
}
}
}
- if ( setVoltage )
- {
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 10) );
- }
+ eSecCommand::pair compare;
+ compare.voltage = voltage;
+ compare.steps = +3;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // voltage already correct ?
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 10) );
sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) );
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 15) );