eDVBSatelliteEquipmentControl *eDVBSatelliteEquipmentControl::instance;
eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList<eDVBRegisteredFrontend> &avail_frontends)
- :m_lnbidx(-1), m_curSat(m_lnbs[0].m_satellites.end()), m_avail_frontends(avail_frontends)
+ :m_lnbidx(-1), m_curSat(m_lnbs[0].m_satellites.end()), m_avail_frontends(avail_frontends), m_rotorMoving(false)
{
if (!instance)
instance = this;
clear();
+#if 1
// ASTRA
addLNB();
setLNBTunerMask(3);
setVoltageMode(eDVBSatelliteSwitchParameters::HV);
setToneMode(eDVBSatelliteSwitchParameters::HILO);
-// HOTBIRD
+// Hotbird
addLNB();
setLNBTunerMask(3);
setLNBLOFL(9750000);
- setLNBLOFH(10600000);
setLNBThreshold(11750000);
+ setLNBLOFH(10600000);
setDiSEqCMode(eDVBSatelliteDiseqcParameters::V1_0);
setToneburst(eDVBSatelliteDiseqcParameters::NO);
setRepeats(0);
addSatellite(130);
setVoltageMode(eDVBSatelliteSwitchParameters::HV);
setToneMode(eDVBSatelliteSwitchParameters::HILO);
+#else
+
+// Rotor
+ addLNB();
+ setLNBTunerMask(3);
+ setLNBLOFL(9750000);
+ setLNBThreshold(11750000);
+ setLNBLOFH(10600000);
+ setDiSEqCMode(eDVBSatelliteDiseqcParameters::V1_2);
+ setToneburst(eDVBSatelliteDiseqcParameters::NO);
+ setRepeats(0);
+ setCommittedCommand(eDVBSatelliteDiseqcParameters::AA);
+ setCommandOrder(0); // committed, toneburst
+ setFastDiSEqC(true);
+ setSeqRepeat(false);
+ setLaDirection(eDVBSatelliteRotorParameters::NORTH);
+ setLoDirection(eDVBSatelliteRotorParameters::EAST);
+ setLatitude(51.017);
+ setLongitude(8.683);
+ setUseInputpower(true);
+ setInputpowerDelta(50);
+
+ addSatellite(130);
+ setVoltageMode(eDVBSatelliteSwitchParameters::HV);
+ setToneMode(eDVBSatelliteSwitchParameters::HILO);
+ setRotorPosNum(0);
+
+ addSatellite(192);
+ setVoltageMode(eDVBSatelliteSwitchParameters::HV);
+ setToneMode(eDVBSatelliteSwitchParameters::HILO);
+ setRotorPosNum(0);
+
+ addSatellite(284);
+ setVoltageMode(eDVBSatelliteSwitchParameters::HV);
+ setToneMode(eDVBSatelliteSwitchParameters::HILO);
+ setRotorPosNum(0);
+
+ addSatellite(420);
+ setVoltageMode(eDVBSatelliteSwitchParameters::HV);
+ setToneMode(eDVBSatelliteSwitchParameters::HILO);
+ setRotorPosNum(1); // stored pos 1
+#endif
}
int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite &sat, iDVBFrontend *fe, int frontend_id )
if (sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal)
band |= 2;
+ bool rotor=false;
+ bool diseqc=false;
+
if (di_param.m_diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0)
{
+ diseqc=true;
if ( di_param.m_committed_cmd < eDVBSatelliteDiseqcParameters::SENDNO )
- {
csw = 0xF0 | (csw << 2);
- csw |= band;
- }
+
+ csw |= band;
if ( di_param.m_diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 ) // ROTOR
{
+ rotor=true;
if ( curRotorPos == sat.orbital_position )
ret=20;
else
ret=10;
}
}
-
+ else
+ csw = band;
+
if (!ret)
ret=40;
if (linked_to != -1) // check for linked tuners..
{
- bool found=false;
- eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_frontends.begin());
- for (; it != m_avail_frontends.end(); ++it)
- if ( !linked_to )
- {
- found=true;
- break;
- }
- else
- --linked_to;
-
- if (found && it->m_inuse)
+ eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_to;
+ if (linked_fe->m_inuse)
{
- int lastcsw = -1,
- lastucsw = -1,
- lastToneburst = -1,
- curRotorPos = -1;
- it->m_frontend->getData(0, lastcsw);
- it->m_frontend->getData(1, lastucsw);
- it->m_frontend->getData(2, lastToneburst);
- it->m_frontend->getData(6, curRotorPos);
-
- if (csw != lastcsw || ucsw != lastucsw ||
- toneburst != lastToneburst || curRotorPos != sat.orbital_position )
+ int ocsw = -1,
+ oucsw = -1,
+ oToneburst = -1,
+ oRotorPos = -1;
+ linked_fe->m_frontend->getData(0, ocsw);
+ linked_fe->m_frontend->getData(1, oucsw);
+ linked_fe->m_frontend->getData(2, oToneburst);
+ linked_fe->m_frontend->getData(6, oRotorPos);
+#if 0
+ eDebug("compare csw %02x == lcsw %02x",
+ csw, ocsw);
+ if ( diseqc )
+ eDebug("compare ucsw %02x == lucsw %02x\ncompare toneburst %02x == oToneburst %02x",
+ ucsw, oucsw, toneburst, oToneburst);
+ if ( rotor )
+ eDebug("compare pos %d == current pos %d",
+ sat.orbital_position, oRotorPos);
+#endif
+ if ( (csw != ocsw) ||
+ ( diseqc && (ucsw != oucsw || toneburst != oToneburst) ) ||
+ ( rotor && oRotorPos != sat.orbital_position ) )
{
- eDebug("can not tune this transponder with linked tuner in use!!");
+// eDebug("can not tune this transponder with linked tuner in use!!");
ret=0;
}
- else
- eDebug("OK .. can tune this transponder with linked tuner in use :)");
+// else
+// eDebug("OK .. can tune this transponder with linked tuner in use :)");
}
}
}
if (linked_to != -1)
{
- bool found=false;
- eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_frontends.begin());
- for (; it != m_avail_frontends.end(); ++it)
- if ( !linked_to )
- {
- found=true;
- break;
- }
- else
- --linked_to;
- if (found && it->m_inuse)
+ eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_to;
+ if (linked_fe->m_inuse)
{
- eDebug("[SEC] frontend is linked with another one and the other is in use.. so we dont do SEC!!");
+ eDebug("[SEC] frontend is linked with another and the other one is in use.. so we dont do SEC!!");
linked=true;
- continue;
}
}
if (di_param.m_diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0)
{
if ( di_param.m_committed_cmd < eDVBSatelliteDiseqcParameters::SENDNO )
- {
csw = 0xF0 | (csw << 2);
- csw |= band;
- }
+
+ csw |= band;
bool send_csw =
(di_param.m_committed_cmd != eDVBSatelliteDiseqcParameters::SENDNO);
(di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO);
bool changed_burst = send_burst && toneburst != lastToneburst;
- bool send_diseqc = changed_ucsw;
- if (!send_diseqc)
- send_diseqc = changed_burst && (send_ucsw || send_csw);
- if (!send_diseqc)
+ int send_mask = 0; /*
+ 1 must send csw
+ 2 must send ucsw
+ 4 send toneburst first
+ 8 send toneburst at end */
+ if (changed_burst) // toneburst first and toneburst changed
+ {
+ if (di_param.m_command_order&1)
+ {
+ send_mask |= 4;
+ if ( send_csw )
+ send_mask |= 1;
+ if ( send_ucsw )
+ send_mask |= 2;
+ }
+ else
+ send_mask |= 8;
+ }
+ if (changed_ucsw)
{
- send_diseqc = changed_csw;
- if ( send_diseqc && di_param.m_use_fast && (csw & 0xF0) && (lastcsw & 0xF0) && ((csw / 4) == (lastcsw / 4)) )
- send_diseqc = false;
+ send_mask |= 2;
+ if ((di_param.m_command_order&4) && send_csw)
+ send_mask |= 1;
+ if (di_param.m_command_order==4 && send_burst)
+ send_mask |= 8;
}
+ if (changed_csw)
+ {
+ if ( di_param.m_use_fast && (lastcsw & 0xF0) && ((csw / 4) == (lastcsw / 4)) )
+ eDebug("dont send committed cmd (fast diseqc)");
+ else
+ {
+ send_mask |= 1;
+ if (!(di_param.m_command_order&4) && send_ucsw)
+ send_mask |= 2;
+ if (!(di_param.m_command_order&1) && send_burst)
+ send_mask |= 8;
+ }
+ }
+
+#if 0
+ eDebugNoNewLine("sendmask: ");
+ for (int i=3; i >= 0; --i)
+ if ( send_mask & (1<<i) )
+ eDebugNoNewLine("1");
+ else
+ eDebugNoNewLine("0");
+ eDebug("");
+#endif
- if ( send_diseqc || changed_burst )
+ if ( send_mask )
{
sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
eSecCommand::pair compare;
for (int seq_repeat = 0; seq_repeat < (di_param.m_seq_repeat?2:1); ++seq_repeat)
{
- if ( di_param.m_command_order & 1 && // toneburst at begin of sequence
- changed_burst && di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO )
+ if ( send_mask & 4 )
{
sec_sequence.push_back( eSecCommand(eSecCommand::SEND_TONEBURST, di_param.m_toneburst_param) );
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );
- frontend.setData(2, di_param.m_toneburst_param);
}
- if ( send_diseqc )
- {
- int loops=0;
+ int loops=0;
- if ( send_csw )
- ++loops;
- if ( send_ucsw )
- ++loops;
+ if ( send_mask & 1 )
+ ++loops;
+ if ( send_mask & 2 )
+ ++loops;
- for ( int i=0; i < di_param.m_repeats; ++i )
- loops *= 2;
+ for ( int i=0; i < di_param.m_repeats; ++i )
+ loops *= 2;
- for ( int i = 0; i < loops;) // fill commands...
+ for ( int i = 0; i < loops;) // fill commands...
+ {
+ eDVBDiseqcCommand diseqc;
+ diseqc.len = 4;
+ diseqc.data[0] = i ? 0xE1 : 0xE0;
+ diseqc.data[1] = 0x10;
+ if ( (send_mask & 2) && (di_param.m_command_order & 4) )
{
- eDVBDiseqcCommand diseqc;
- diseqc.len = 4;
- diseqc.data[0] = i ? 0xE1 : 0xE0;
- diseqc.data[1] = 0x10;
-
- if ( !send_csw || (send_ucsw && (di_param.m_command_order & 4) ) )
- {
- diseqc.data[2] = 0x39;
- diseqc.data[3] = ucsw;
- }
- else
- {
- diseqc.data[2] = 0x38;
- diseqc.data[3] = csw;
- }
- sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ diseqc.data[2] = 0x39;
+ diseqc.data[3] = ucsw;
+ }
+ else if ( send_mask & 1 )
+ {
+ diseqc.data[2] = 0x38;
+ diseqc.data[3] = csw;
+ }
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
- i++;
- if ( i < loops )
+ i++;
+ if ( i < loops )
+ {
+ int cmd=0;
+ if (diseqc.data[2] == 0x38 && (send_mask & 2))
+ cmd=0x39;
+ else if (diseqc.data[2] == 0x39 && (send_mask & 1))
+ cmd=0x38;
+ if (cmd)
{
- int cmd=0;
- if (diseqc.data[2] == 0x38 && send_ucsw)
- cmd=0x39;
- else if (diseqc.data[2] == 0x39 && send_csw)
- cmd=0x38;
- if (cmd)
- {
- static int delay = (120 - 54) / 2; // standard says 100msek between two repeated commands
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, delay) );
- diseqc.data[2]=cmd;
- diseqc.data[3]=(cmd==0x38) ? csw : ucsw;
- sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
- ++i;
- if ( i < loops )
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, delay ) );
- else
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );
- }
- else // delay 120msek when no command is in repeat gap
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 120) );
+ static int delay = (120 - 54) / 2; // standard says 100msek between two repeated commands
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, delay) );
+ diseqc.data[2]=cmd;
+ diseqc.data[3]=(cmd==0x38) ? csw : ucsw;
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ ++i;
+ if ( i < loops )
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, delay ) );
+ else
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );
}
- else
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );
-
- frontend.setData(0, csw);
- frontend.setData(1, ucsw);
+ else // delay 120msek when no command is in repeat gap
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 120) );
}
+ else
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );
}
- if ( !(di_param.m_command_order & 1) && // toneburst at end of sequence
- (changed_burst || send_diseqc) && di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO )
+ if ( send_mask & 8 ) // toneburst at end of sequence
{
sec_sequence.push_back( eSecCommand(eSecCommand::SEND_TONEBURST, di_param.m_toneburst_param) );
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );
- frontend.setData(2, di_param.m_toneburst_param);
}
}
RotorCmd=sw_param.m_rotorPosNum;
else // we must calc gotoxx cmd
{
- eDebug("Entry for %d,%d° not in Rotor Table found... i try gotoXX°", sat.orbital_position / 10, sat.orbital_position % 10 );
+ eDebug("Entry for %d,%d? not in Rotor Table found... i try gotoXX?", sat.orbital_position / 10, sat.orbital_position % 10 );
useGotoXX = true;
int satDir = sat.orbital_position < 0 ?
}
if ( RotorCmd != lastRotorCmd )
{
- if ( changed_burst || send_diseqc )
+ if ( send_mask )
{
// override first voltage change
*(++(++sec_sequence.begin()))=eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13);
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 ( linked )
+ {
+ frontend.setData(5, RotorCmd);
+ frontend.setData(6, sat.orbital_position);
+ }
+ else
+ {
+ frontend.setData(3, RotorCmd);
+ frontend.setData(4, sat.orbital_position);
+ }
}
else
eFatal("rotor turning without inputpowermeasure not implemented yet");
}
}
else
- frontend.setData(0, band); // store band as csw .. needed for linked tuner handling
+ csw = band;
+
+ frontend.setData(0, csw);
+ frontend.setData(1, ucsw);
+ frontend.setData(2, di_param.m_toneburst_param);
+
+ if ( linked )
+ return 0;
eSecCommand::pair compare;
compare.voltage = voltage;
if (tu1 == tu2)
return -1;
- eDVBFrontend *p1=NULL, *p2=NULL;
- int tmp1=tu1, tmp2=tu2;
+ eDVBRegisteredFrontend *p1=NULL, *p2=NULL;
- for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_frontends.begin()); it != m_avail_frontends.end(); ++it)
+ int cnt=0;
+ for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_frontends.begin()); it != m_avail_frontends.end(); ++it, ++cnt)
{
- if ( !tmp1 )
- p1 = it->m_frontend;
- else
- --tmp1;
- if (!tmp2)
- p2 = it->m_frontend;
- else
- --tmp2;
+ if (cnt == tu1)
+ p1 = *it;
+ else if (cnt == tu2)
+ p2 = *it;
}
if (p1 && p2)
{
- p1->setData(7, tu2);
- p1->setTone(iDVBFrontend::toneOff);
- p1->setVoltage(iDVBFrontend::voltageOff);
-
- p2->setData(7, tu1);
+ p1->m_frontend->setData(7, (int)p2); // this is evil..
+ p2->m_frontend->setData(7, (int)p1);
return 0;
}
return -1;
}
+
+bool eDVBSatelliteEquipmentControl::isRotorMoving()
+{
+ return m_rotorMoving;
+}
+
+void eDVBSatelliteEquipmentControl::setRotorMoving(bool b)
+{
+ m_rotorMoving=b;
+}