aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2010-06-08 14:28:29 +0200
committerghost <andreas.monzner@multimedia-labs.de>2010-06-08 14:55:15 +0200
commitc95ebd0688c39d4fa6e22e85d84fe7d80e3da013 (patch)
tree32a6a826fdcb5763697fad82ece09f4c0c3d1d5a /lib/dvb
parent6667d88310f66513676c842afe91a2e13dadefaa (diff)
downloadenigma2-c95ebd0688c39d4fa6e22e85d84fe7d80e3da013.tar.gz
enigma2-c95ebd0688c39d4fa6e22e85d84fe7d80e3da013.zip
update unicable stuff (by adenin)
Diffstat (limited to 'lib/dvb')
-rw-r--r--lib/dvb/frontend.cpp91
-rw-r--r--lib/dvb/frontend.h8
-rw-r--r--lib/dvb/idvb.h5
-rw-r--r--lib/dvb/sec.cpp82
-rw-r--r--lib/dvb/sec.h13
5 files changed, 133 insertions, 66 deletions
diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp
index bc3a88da..bd8f0028 100644
--- a/lib/dvb/frontend.cpp
+++ b/lib/dvb/frontend.cpp
@@ -582,7 +582,7 @@ int eDVBFrontend::openFrontend()
return 0;
}
-int eDVBFrontend::closeFrontend(bool force)
+int eDVBFrontend::closeFrontend(bool force, bool no_delayed)
{
if (!force && m_data[CUR_VOLTAGE] != -1 && m_data[CUR_VOLTAGE] != iDVBFrontend::voltageOff)
{
@@ -605,11 +605,34 @@ int eDVBFrontend::closeFrontend(bool force)
eDebugNoSimulate("close frontend %d", m_dvbid);
if (m_data[SATCR] != -1)
{
- turnOffSatCR(m_data[SATCR]);
+ if (!no_delayed)
+ {
+ m_sec->prepareTurnOffSatCR(*this, m_data[SATCR]);
+ m_tuneTimer->start(0, true);
+ if(!m_tuneTimer->isActive())
+ {
+ int timeout=0;
+ eDebug("[turnOffSatCR] no mainloop");
+ while(true)
+ {
+ timeout = tuneLoopInt();
+ if (timeout == -1)
+ break;
+ usleep(timeout*1000); // blockierendes wait.. eTimer gibts ja nicht mehr
+ }
+ }
+ else
+ eDebug("[turnOffSatCR] running mainloop");
+ return 0;
+ }
+ else
+ m_data[ROTOR_CMD] = -1;
}
+
setTone(iDVBFrontend::toneOff);
setVoltage(iDVBFrontend::voltageOff);
m_tuneTimer->stop();
+
if (m_sec && !m_simulate)
m_sec->setRotorMoving(m_slotid, false);
if (!::close(m_fd))
@@ -1486,9 +1509,14 @@ bool eDVBFrontend::setSecSequencePos(int steps)
return true;
}
-void eDVBFrontend::tuneLoop() // called by m_tuneTimer
+void eDVBFrontend::tuneLoop()
+{
+ tuneLoopInt();
+}
+
+int eDVBFrontend::tuneLoopInt() // called by m_tuneTimer
{
- int delay=0;
+ int delay=-1;
eDVBFrontend *sec_fe = this;
eDVBRegisteredFrontend *regFE = 0;
long tmp = m_data[LINKED_PREV_PTR];
@@ -1518,6 +1546,7 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer
{
long *sec_fe_data = sec_fe->m_data;
// eDebugNoSimulate("tuneLoop %d\n", m_sec_sequence.current()->cmd);
+ delay = 0;
switch (m_sec_sequence.current()->cmd)
{
case eSecCommand::SLEEP:
@@ -1844,6 +1873,13 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer
++m_sec_sequence.current();
break;
}
+ case eSecCommand::DELAYED_CLOSE_FRONTEND:
+ {
+ eDebugNoSimulate("[SEC] delayed close frontend");
+ closeFrontend(false, true);
+ ++m_sec_sequence.current();
+ break;
+ }
default:
eDebugNoSimulate("[SEC] unhandled sec command %d",
++m_sec_sequence.current()->cmd);
@@ -1856,6 +1892,7 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer
regFE->dec_use();
if (m_simulate && m_sec_sequence.current() != m_sec_sequence.end())
tuneLoop();
+ return delay;
}
void eDVBFrontend::setFrontend(bool recvEvents)
@@ -2591,9 +2628,12 @@ RESULT eDVBFrontend::setSEC(iDVBSatelliteEquipmentControl *sec)
return 0;
}
-RESULT eDVBFrontend::setSecSequence(const eSecCommandList &list)
+RESULT eDVBFrontend::setSecSequence(eSecCommandList &list)
{
- m_sec_sequence = list;
+ if (m_data[SATCR] != -1 && m_sec_sequence.current() != m_sec_sequence.end())
+ m_sec_sequence.push_back(list);
+ else
+ m_sec_sequence = list;
return 0;
}
@@ -2670,42 +2710,3 @@ arg_error:
"eDVBFrontend::setSlotInfo must get a tuple with first param slotid, second param slot description and third param enabled boolean");
return false;
}
-
-RESULT eDVBFrontend::turnOffSatCR(int satcr)
-{
- eSecCommandList sec_sequence;
- // check if voltage is disabled
- eSecCommand::pair compare;
- compare.steps = +9; //nothing to do
- compare.voltage = iDVBFrontend::voltageOff;
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50 ) );
-
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18_5) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) );
-
- 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;
-
- sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50+20+14*diseqc.len) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
- setSecSequence(sec_sequence);
- return 0;
-}
-
-RESULT eDVBFrontend::ScanSatCR()
-{
- setFrontend();
- usleep(20000);
- setTone(iDVBFrontend::toneOff);
- return 0;
-}
diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h
index bc31755c..bef4a18f 100644
--- a/lib/dvb/frontend.h
+++ b/lib/dvb/frontend.h
@@ -110,6 +110,7 @@ private:
void feEvent(int);
void timeout();
void tuneLoop(); // called by m_tuneTimer
+ int tuneLoopInt();
void setFrontend(bool recvEvents=true);
bool setSecSequencePos(int steps);
static int PriorityOrder;
@@ -130,7 +131,7 @@ public:
RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc);
RESULT sendToneburst(int burst);
RESULT setSEC(iDVBSatelliteEquipmentControl *sec);
- RESULT setSecSequence(const eSecCommandList &list);
+ RESULT setSecSequence(eSecCommandList &list);
RESULT getData(int num, long &data);
RESULT setData(int num, long val);
@@ -148,12 +149,9 @@ public:
void reopenFrontend();
int openFrontend();
- int closeFrontend(bool force=false);
+ int closeFrontend(bool force=false, bool no_delayed=false);
const char *getDescription() const { return m_description; }
bool is_simulate() const { return m_simulate; }
-
- RESULT turnOffSatCR(int satcr);
- RESULT ScanSatCR();
};
#endif // SWIG
diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h
index 996d7909..f1217a6a 100644
--- a/lib/dvb/idvb.h
+++ b/lib/dvb/idvb.h
@@ -459,7 +459,7 @@ class iDVBFrontend: public iDVBFrontend_ENUMS, public iObject
public:
virtual RESULT getFrontendType(int &SWIG_OUTPUT)=0;
virtual RESULT tune(const iDVBFrontendParameters &where)=0;
- virtual int closeFrontend(bool force = false)=0;
+ virtual int closeFrontend(bool force = false, bool no_delayed = false)=0;
virtual void reopenFrontend()=0;
#ifndef SWIG
virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
@@ -471,7 +471,7 @@ public:
virtual RESULT sendToneburst(int burst)=0;
#ifndef SWIG
virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
- virtual RESULT setSecSequence(const eSecCommandList &list)=0;
+ virtual RESULT setSecSequence(eSecCommandList &list)=0;
#endif
virtual int readFrontendData(int type)=0;
virtual void getFrontendStatus(SWIG_PYOBJECT(ePyObject) dest)=0;
@@ -491,6 +491,7 @@ class iDVBSatelliteEquipmentControl: public iObject
{
public:
virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id, unsigned int timeout)=0;
+ virtual void prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr)=0;
virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id, int *highest_score_lnb=0)=0;
virtual void setRotorMoving(int slotid, bool)=0;
};
diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp
index 0e3e7e0a..58fc5e39 100644
--- a/lib/dvb/sec.cpp
+++ b/lib/dvb/sec.cpp
@@ -108,6 +108,9 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
{
bool rotor=false;
eDVBSatelliteLNBParameters &lnb_param = m_lnbs[idx];
+ bool is_unicable = lnb_param.SatCR_idx != -1;
+ bool is_unicable_position_switch = lnb_param.SatCR_positions > 1;
+
if ( lnb_param.m_slot_mask & slot_id ) // lnb for correct tuner?
{
int ret = 0;
@@ -163,7 +166,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
eSecDebugNoSimulate("ret1 %d", ret);
- if (linked_in_use)
+ if (linked_in_use && !is_unicable)
{
// compare tuner data
if ( (csw != linked_csw) ||
@@ -176,7 +179,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
ret += 15;
eSecDebugNoSimulate("ret2 %d", ret);
}
- else if (satpos_depends_ptr != -1)
+ else if ((satpos_depends_ptr != -1) && !(is_unicable && is_unicable_position_switch))
{
eSecDebugNoSimulate("satpos depends");
eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr;
@@ -209,7 +212,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
eSecDebugNoSimulate("ret5 %d", ret);
- if (ret)
+ if (ret && lnb_param.SatCR_idx != -1)
{
int lof = sat.frequency > lnb_param.m_lof_threshold ?
lnb_param.m_lof_hi : lnb_param.m_lof_lo;
@@ -375,8 +378,8 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
{
// calc Frequency
local = abs(sat.frequency
- - ((lof - (lof % 1000)) + ((lof % 1000)>500 ? 1000 : 0)) ); //TODO für den Mist mal ein Macro schreiben
- parm.FREQUENCY = (local - (local % 125)) + ((local % 125)>62 ? 125 : 0);
+ - lof);
+ parm.FREQUENCY = ((((local * 2) / 125) + 1) / 2) * 125;
frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY);
if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V
@@ -396,20 +399,21 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
}
else
{
- unsigned int tmp = abs(sat.frequency
- - ((lof - (lof % 1000)) + ((lof % 1000)>500 ? 1000 : 0)) )
+ int tmp1 = abs(sat.frequency
+ -lof)
+ lnb_param.SatCRvco
- 1400000
+ lnb_param.guard_offset;
- parm.FREQUENCY = (lnb_param.SatCRvco - (tmp % 4000))+((tmp%4000)>2000?4000:0)+lnb_param.guard_offset;
- lnb_param.UnicableTuningWord = (((tmp / 4000)+((tmp%4000)>2000?1:0))
+ 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, sat.frequency - ((lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 - lnb_param.SatCRvco + lof));
+ frontend.setData(eDVBFrontend::FREQ_OFFSET, (lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 + lof - (2 * (lnb_param.SatCRvco - (tmp1-tmp2))) );
}
if (diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0)
@@ -743,10 +747,10 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
diseqc.data[3] = RotorCmd;
diseqc.data[4] = 0x00;
}
- if(lnb_param.SatCR_idx == -1)
+// if(lnb_param.SatCR_idx == -1)
{
int mrt = m_params[MOTOR_RUNNING_TIMEOUT]; // in seconds!
- if ( rotor_param.m_inputpower_parameters.m_use )
+ if ( rotor_param.m_inputpower_parameters.m_use || lnb_param.SatCR_idx == -1)
{ // use measure rotor input power to detect rotor state
bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed);
eSecCommand::rotor cmd;
@@ -950,6 +954,40 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
return -1;
}
+void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr)
+{
+ eSecCommandList sec_sequence;
+
+ // check if voltage is disabled
+ eSecCommand::pair compare;
+ compare.steps = +9; //only close frontend
+ compare.voltage = iDVBFrontend::voltageOff;
+
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS]) );
+
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18_5) );
+ 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]) );
+
+ 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;
+
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::DELAYED_CLOSE_FRONTEND) );
+
+ frontend.setSecSequence(sec_sequence);
+}
+
RESULT eDVBSatelliteEquipmentControl::clear()
{
eSecDebug("eDVBSatelliteEquipmentControl::clear()");
@@ -1254,6 +1292,26 @@ RESULT eDVBSatelliteEquipmentControl::setLNBSatCRvco(int SatCRvco)
return -ENOENT;
return 0;
}
+
+RESULT eDVBSatelliteEquipmentControl::setLNBSatCRpositions(int SatCR_positions)
+{
+ eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCRpositions(%d)", SatCR_positions);
+ if(SatCR_positions < 1 || SatCR_positions > 2)
+ return -EPERM;
+ if ( currentLNBValid() )
+ m_lnbs[m_lnbidx].SatCR_positions = SatCR_positions;
+ else
+ return -ENOENT;
+ return 0;
+}
+
+RESULT eDVBSatelliteEquipmentControl::getLNBSatCRpositions()
+{
+ if ( currentLNBValid() )
+ return m_lnbs[m_lnbidx].SatCR_positions;
+ return -ENOENT;
+}
+
RESULT eDVBSatelliteEquipmentControl::getLNBSatCR()
{
if ( currentLNBValid() )
diff --git a/lib/dvb/sec.h b/lib/dvb/sec.h
index c50aee4d..b38671d2 100644
--- a/lib/dvb/sec.h
+++ b/lib/dvb/sec.h
@@ -25,7 +25,8 @@ public:
IF_TONE_GOTO, IF_NOT_TONE_GOTO,
START_TUNE_TIMEOUT,
SET_ROTOR_MOVING,
- SET_ROTOR_STOPPED
+ SET_ROTOR_STOPPED,
+ DELAYED_CLOSE_FRONTEND
};
int cmd;
struct rotor
@@ -103,6 +104,11 @@ public:
{
secSequence.push_back(cmd);
}
+ void push_back(eSecCommandList &list)
+ {
+ ASSERT(*this != list);
+ secSequence.splice(end(), list.secSequence);
+ }
void clear()
{
secSequence.clear();
@@ -252,6 +258,7 @@ public:
#define MAX_SATCR 8
#define MAX_LNBNUM 32
+ int SatCR_positions;
int SatCR_idx;
unsigned int SatCRvco;
unsigned int UnicableTuningWord;
@@ -311,6 +318,7 @@ public:
#ifndef SWIG
eDVBSatelliteEquipmentControl(eSmartPtrList<eDVBRegisteredFrontend> &avail_frontends, eSmartPtrList<eDVBRegisteredFrontend> &avail_simulate_frontends);
RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id, unsigned int tunetimeout);
+ void prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr); // used for unicable
int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *, int frontend_id, int *highest_score_lnb=0);
bool currentLNBValid() { return m_lnbidx > -1 && m_lnbidx < (int)(sizeof(m_lnbs) / sizeof(eDVBSatelliteLNBParameters)); }
#endif
@@ -346,9 +354,10 @@ public:
/* Unicable Specific Parameters */
RESULT setLNBSatCR(int SatCR_idx);
RESULT setLNBSatCRvco(int SatCRvco);
-// RESULT checkGuardOffset(const eDVBFrontendParametersSatellite &sat);
+ RESULT setLNBSatCRpositions(int SatCR_positions);
RESULT getLNBSatCR();
RESULT getLNBSatCRvco();
+ RESULT getLNBSatCRpositions();
/* Satellite Specific Parameters */
RESULT addSatellite(int orbital_position);
RESULT setVoltageMode(int mode);