X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fsec.cpp;h=9124688950af12d3a2060da4c9e1f72375796ace;hp=f011934242358872dbf531c532a5ce7e7c297002;hb=dafa266c71fd625cd5a9bedbea10a47e27c868ad;hpb=85c657f6b19abcc0c33bde1e308f969b1f1dee55 diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index f011934..9124688 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -37,7 +37,7 @@ void eDVBSatelliteEquipmentControl::setParam(int param, int value) } eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList &avail_frontends, eSmartPtrList &avail_simulate_frontends) - :m_lnbidx((sizeof(m_lnbs) / sizeof(eDVBSatelliteLNBParameters))-1), m_curSat(m_lnbs[0].m_satellites.end()), m_avail_frontends(avail_frontends), m_avail_simulate_frontends(avail_simulate_frontends), m_rotorMoving(false) + :m_lnbidx((sizeof(m_lnbs) / sizeof(eDVBSatelliteLNBParameters))-1), m_curSat(m_lnbs[0].m_satellites.end()), m_avail_frontends(avail_frontends), m_avail_simulate_frontends(avail_simulate_frontends), m_rotorMoving(0) { if (!instance) instance = this; @@ -61,14 +61,14 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite bool direct_connected = m_not_linked_slot_mask & slot_id; int score=0, satcount=0; long linked_prev_ptr=-1, linked_next_ptr=-1, linked_csw=-1, linked_ucsw=-1, linked_toneburst=-1, - satpos_depends_ptr=-1, rotor_pos=-1; + fe_satpos_depends_ptr=-1, fe_rotor_pos=-1; bool linked_in_use = false; eSecDebugNoSimulate("direct_connected %d", !!direct_connected); fe->getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr); fe->getData(eDVBFrontend::LINKED_NEXT_PTR, linked_next_ptr); - fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satpos_depends_ptr); + fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, fe_satpos_depends_ptr); // first we search the linkage base frontend and check if any tuner in prev direction is used while (linked_prev_ptr != -1) @@ -80,7 +80,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite linked_fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr); } - fe->getData(eDVBFrontend::ROTOR_POS, rotor_pos); + fe->getData(eDVBFrontend::ROTOR_POS, fe_rotor_pos); // now check also the linked tuners is in use while (!linked_in_use && linked_next_ptr != -1) @@ -123,10 +123,11 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite { bool diseqc=false; long band=0, - satpos_depends_ptr=-1, + satpos_depends_ptr=fe_satpos_depends_ptr, csw = di_param.m_committed_cmd, ucsw = di_param.m_uncommitted_cmd, - toneburst = di_param.m_toneburst_param; + toneburst = di_param.m_toneburst_param, + rotor_pos = fe_rotor_pos; eSecDebugNoSimulate("sat %d found", sat.orbital_position); @@ -147,7 +148,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite if ( di_param.m_diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 ) // ROTOR rotor = true; - ret=10000; + ret = 10000; } else { @@ -164,20 +165,20 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite ( diseqc && (ucsw != linked_ucsw || toneburst != linked_toneburst) ) || ( rotor && rotor_pos != sat.orbital_position ) ) { - ret=0; + ret = 0; } + else + ret += 15; eSecDebugNoSimulate("ret2 %d", ret); if (ret) // special case when this tuner is linked to a satpos dependent tuner { - long satpos_depends_ptr=-1; fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satpos_depends_ptr); if (satpos_depends_ptr != -1) { eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr; - long satpos_depends_rotor_pos; - satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, satpos_depends_rotor_pos); - if (!rotor || satpos_depends_rotor_pos == -1 /* we dont know the rotor position yet */ - || satpos_depends_rotor_pos != sat.orbital_position ) // not the same orbital position? + satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, rotor_pos); + if (!rotor || rotor_pos == -1 /* we dont know the rotor position yet */ + || rotor_pos != sat.orbital_position ) // not the same orbital position? { ret = 0; } @@ -194,16 +195,17 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite if (satpos_depends_to_fe->m_inuse) // if the dependent frontend is in use? { if (!rotor || rotor_pos != sat.orbital_position) // new orbital position not equal to current orbital pos? - ret=0; + ret = 0; + else + ret += 10; } } else // current fe is dependent of another tuner ... (so this fe can't turn the rotor!) { // get current orb pos of the tuner with rotor connection - long satpos_depends_rotor_pos; - satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, satpos_depends_rotor_pos); - if (!rotor || satpos_depends_rotor_pos == -1 /* we dont know the rotor position yet */ - || satpos_depends_rotor_pos != sat.orbital_position ) // not the same orbital position? + satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, rotor_pos); + if (!rotor || rotor_pos == -1 /* we dont know the rotor position yet */ + || rotor_pos != sat.orbital_position ) // not the same orbital position? { ret = 0; } @@ -222,7 +224,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite lnb_param.m_lof_hi : lnb_param.m_lof_lo; int tuner_freq = abs(sat.frequency - lof); if (tuner_freq < 900000 || tuner_freq > 2200000) - ret=0; + ret = 0; } if (ret && lnb_param.m_prio != -1) @@ -312,7 +314,6 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA eDVBSatelliteSwitchParameters &sw_param = sit->second; bool doSetFrontend = true; bool doSetVoltageToneFrontend = true; - bool forceStaticMode = true; bool forceChanged = false; bool needDiSEqCReset = false; long band=0, @@ -753,6 +754,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA } if(lnb_param.SatCR_idx == -1) { + int mrt = m_params[MOTOR_RUNNING_TIMEOUT]; // in seconds! if ( rotor_param.m_inputpower_parameters.m_use ) { // use measure rotor input power to detect rotor state bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed); @@ -799,7 +801,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); if (turn_fast) sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*20) ); // 2 minutes running timeout + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, mrt*20) ); // mrt is in seconds... our SLEEP time is 50ms.. so * 20 // rotor running loop sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) ); @@ -814,6 +816,17 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA } else { // use normal turning mode + if (curRotorPos != -1) + { + mrt = abs(curRotorPos - sat.orbital_position); + if (mrt > 1800) + mrt = 3600 - mrt; + if (mrt % 10) + mrt += 10; // round a little bit + mrt *= 2000; // (we assume a very slow rotor with just 0.5 degree per second here) + mrt /= 10000; + mrt += 3; // a little bit overhead + } doSetVoltageToneFrontend=false; doSetFrontend=false; eSecCommand::rotor cmd; @@ -827,37 +840,40 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 1000) ); // sleep one second before change voltage or tone + compare.voltage = voltage; compare.steps = +3; sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // correct final voltage? sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 2000) ); // wait 2 second before set high voltage sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) ); - + compare.tone = tone; sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_FINAL_CONT_TONE_CHANGE]) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND, 0) ); cmd.direction=1; // check for running rotor cmd.deltaA=0; - cmd.steps=+3; + cmd.steps = +3; cmd.okcount=0; - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*4) ); // 2 minutes running timeout + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, mrt*4) ); // mrt is in seconds... our SLEEP time is 250ms.. so * 4 sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) ); // 250msec delay sec_sequence.push_back( eSecCommand(eSecCommand::IF_TUNER_LOCKED_GOTO, cmd ) ); - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) ); + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +5 ) ); sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -3) ); // goto loop start sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +3) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +4) ); + sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND, 1) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -5) ); } + eDebug("set rotor timeout to %d seconds", mrt); + sec_fe->setData(eDVBFrontend::NEW_ROTOR_CMD, RotorCmd); + sec_fe->setData(eDVBFrontend::NEW_ROTOR_POS, sat.orbital_position); } - sec_fe->setData(eDVBFrontend::NEW_ROTOR_CMD, RotorCmd); - sec_fe->setData(eDVBFrontend::NEW_ROTOR_POS, sat.orbital_position); } } } @@ -918,14 +934,13 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (doSetFrontend) { sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); - } - - if (forceStaticMode) - { - sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND, 1) ); } + + sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 500) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); + frontend.setSecSequence(sec_sequence); return 0; @@ -961,7 +976,8 @@ RESULT eDVBSatelliteEquipmentControl::clear() for (eSmartPtrList::iterator it(m_avail_frontends.begin()); it != m_avail_frontends.end(); ++it) { long tmp; - if (!strcmp(it->m_frontend->getDescription(), "BCM4501 (internal)") && !it->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, tmp) && tmp != -1) + char c; + if (sscanf(it->m_frontend->getDescription(), "BCM450%c (internal)", &c) == 1 && !it->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, tmp) && tmp != -1) { FILE *f=fopen("/proc/stb/tsmux/lnb_b_input", "w"); if (!f || fwrite("B", 1, 1, f) != 1) @@ -1370,8 +1386,8 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2) if (tu1 != tu2) { eDVBRegisteredFrontend *p1=NULL, *p2=NULL; - - for (eSmartPtrList::iterator it(m_avail_frontends.begin()); it != m_avail_frontends.end(); ++it) + eSmartPtrList::iterator it(m_avail_frontends.begin()); + for (; it != m_avail_frontends.end(); ++it) { if (it->m_frontend->getSlotID() == tu1) p1 = *it; @@ -1380,9 +1396,10 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2) } if (p1 && p2) { + char c; p1->m_frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)p2); p2->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)p1); - if (!strcmp(p1->m_frontend->getDescription(), p2->m_frontend->getDescription()) && !strcmp(p1->m_frontend->getDescription(), "BCM4501 (internal)")) + if (!strcmp(p1->m_frontend->getDescription(), p2->m_frontend->getDescription()) && sscanf(p1->m_frontend->getDescription(), "BCM450%c (internal)", &c) == 1) { FILE *f=fopen("/proc/stb/tsmux/lnb_b_input", "w"); if (!f || fwrite("A", 1, 1, f) != 1) @@ -1396,7 +1413,8 @@ RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2) } p1=p2=NULL; - for (eSmartPtrList::iterator it(m_avail_simulate_frontends.begin()); it != m_avail_simulate_frontends.end(); ++it) + it=m_avail_simulate_frontends.begin(); + for (; it != m_avail_simulate_frontends.end(); ++it) { if (it->m_frontend->getSlotID() == tu1) p1 = *it; @@ -1463,7 +1481,10 @@ bool eDVBSatelliteEquipmentControl::isRotorMoving() return m_rotorMoving; } -void eDVBSatelliteEquipmentControl::setRotorMoving(bool b) +void eDVBSatelliteEquipmentControl::setRotorMoving(int slot_no, bool b) { - m_rotorMoving=b; + if (b) + m_rotorMoving |= (1 << slot_no); + else + m_rotorMoving &= ~(1 << slot_no); }