lnb_param.guard_offset = 0; //HACK
- frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx);
if (diseqc13V)
voltage_mode = eDVBSatelliteSwitchParameters::HV;
}
else
{
- int tmp1 = abs(sat.frequency
- -lof)
- + lnb_param.SatCRvco
- - 1400000
- + lnb_param.guard_offset;
- 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, (lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 + lof - (2 * (lnb_param.SatCRvco - (tmp1-tmp2))) );
+ switch(lnb_param.SatCR_format)
+ {
+ case 1:
+ {
+ eDebug("[prepare] JESS");
+
+ int tmp1 = abs(sat.frequency
+ -lof)
+ - 100000;
+ volatile unsigned int tmp2 = (1000 + 2 * tmp1) / (2 *1000); //round to multiple of 1000
+ parm.FREQUENCY = lnb_param.SatCRvco - (tmp1 - (1000 * tmp2));
+ frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - lof -(lnb_param.SatCRvco - parm.FREQUENCY));
+
+ lnb_param.UnicableTuningWord =
+ (band & 0x3) //Bit0:HighLow Bit1:VertHor
+ | (((lnb_param.LNBNum - 1) & 0x3F) << 2) //position number (max. 63)
+ | ((tmp2 & 0x7FF)<< 8) //frequency (-100MHz Offset)
+ | ((lnb_param.SatCR_idx & 0x1F) << 19); //adresse of SatCR (max. 32)
+
+ eDebug("[prepare] UnicableTuningWord %#06x",lnb_param.UnicableTuningWord);
+ }
+ break;
+ case 0:
+ default:
+ {
+ eDebug("[prepare] Unicable");
+ int tmp1 = abs(sat.frequency
+ -lof)
+ + lnb_param.SatCRvco
+ - 1400000
+ + lnb_param.guard_offset;
+ volatile unsigned int tmp2 = (4000 + 2 * tmp1) / (2 *4000); //round to multiple of 4000
+
+ parm.FREQUENCY = lnb_param.SatCRvco - (tmp1 - (4000 * tmp2)) + lnb_param.guard_offset;
+ lnb_param.UnicableTuningWord = tmp2
+ | ((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, (lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 + lof - (2 * (lnb_param.SatCRvco - (tmp1 - (4000 * tmp2)))) );
+ }
+ }
voltage = VOLTAGE(13);
}
sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
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]) ); // wait 20 ms after voltage change
-
+
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] = lnb_param.UnicableTuningWord >> 8;
- diseqc.data[4] = lnb_param.UnicableTuningWord;
+
+ long oldSatcr, oldPin, oldDiction;
+ frontend.getData(eDVBFrontend::SATCR, oldSatcr);
+ frontend.getData(eDVBFrontend::PIN, oldPin);
+ frontend.getData(eDVBFrontend::DICTION, oldDiction);
+
+ if((oldSatcr != -1) && (oldSatcr != lnb_param.SatCR_idx))
+ {
+ switch (oldDiction)
+ {
+ case 1:
+ if(oldPin < 1)
+ {
+ diseqc.len = 4;
+ diseqc.data[0] = 0x70;
+ }
+ else
+ {
+ diseqc.len = 5;
+ diseqc.data[0] = 0x71;
+ diseqc.data[4] = oldPin;
+ }
+ diseqc.data[1] = oldSatcr << 3;
+ diseqc.data[2] = 0x00;
+ diseqc.data[3] = 0x00;
+ break;
+ case 0:
+ default:
+ if(oldPin < 1)
+ {
+ diseqc.len = 5;
+ diseqc.data[2] = 0x5A;
+ }
+ else
+ {
+ diseqc.len = 6;
+ diseqc.data[2] = 0x5C;
+ diseqc.data[5] = oldPin;
+ }
+ diseqc.data[0] = 0xE0;
+ diseqc.data[1] = 0x10;
+ diseqc.data[3] = oldSatcr << 5;
+ diseqc.data[4] = 0x00;
+ break;
+ }
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) );
+ frontend.setData(eDVBFrontend::SATCR, -1);
+ }
+
+ frontend.setData(eDVBFrontend::DICTION, lnb_param.SatCR_format);
+//TODO frontend.setData(eDVBFrontend::PIN, lnb_param.SatCR_pin);
+
+ long pin = 0; // hack
+
+ switch(lnb_param.SatCR_format)
+ {
+ case 1: //JESS
+ if(pin < 1)
+ {
+ diseqc.len = 4;
+ diseqc.data[0] = 0x70;
+ diseqc.data[1] = lnb_param.UnicableTuningWord >> 16;
+ diseqc.data[2] = lnb_param.UnicableTuningWord >> 8;
+ diseqc.data[3] = lnb_param.UnicableTuningWord;
+ }
+ else
+ {
+ diseqc.len = 5;
+ diseqc.data[0] = 0x71;
+ diseqc.data[4] = pin;
+ }
+ diseqc.data[1] = lnb_param.UnicableTuningWord >> 16;
+ diseqc.data[2] = lnb_param.UnicableTuningWord >> 8;
+ diseqc.data[3] = lnb_param.UnicableTuningWord;
+ break;
+ case 0: //DiSEqC
+ default:
+ if(pin < 1)
+ {
+ diseqc.len = 5;
+ diseqc.data[2] = 0x5A;
+ }
+ else
+ {
+ diseqc.len = 6;
+ diseqc.data[2] = 0x5C;
+ diseqc.data[5] = pin;
+ }
+ diseqc.data[0] = 0xE0;
+ diseqc.data[1] = 0x10;
+ diseqc.data[3] = lnb_param.UnicableTuningWord >> 8;
+ diseqc.data[4] = lnb_param.UnicableTuningWord;
+ }
+ frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx);
sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) );
return -1;
}
-void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr)
+void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend)
{
+ long satcr, diction, pin;
eSecCommandList sec_sequence;
// check if voltage is disabled
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;
+ frontend.getData(eDVBFrontend::SATCR, satcr);
+ frontend.getData(eDVBFrontend::DICTION, diction);
+ frontend.getData(eDVBFrontend::PIN, pin);
+
+ switch (diction)
+ {
+ case 1:
+ if(pin < 1)
+ {
+ diseqc.len = 4;
+ diseqc.data[0] = 0x70;
+ }
+ else
+ {
+ diseqc.len = 5;
+ diseqc.data[0] = 0x71;
+ diseqc.data[4] = pin;
+ }
+ diseqc.data[1] = satcr << 3;
+ diseqc.data[2] = 0x00;
+ diseqc.data[3] = 0x00;
+ break;
+ case 0:
+ default:
+ if(pin < 1)
+ {
+ diseqc.len = 5;
+ diseqc.data[2] = 0x5A;
+ }
+ else
+ {
+ diseqc.len = 6;
+ diseqc.data[2] = 0x5C;
+ diseqc.data[5] = pin;
+ }
+ diseqc.data[0] = 0xE0;
+ diseqc.data[1] = 0x10;
+ diseqc.data[3] = satcr << 5;
+ diseqc.data[4] = 0x00;
+ break;
+ }
+ frontend.setData(eDVBFrontend::SATCR, -1);
sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) );
}
/* Unicable Specific Parameters */
+RESULT eDVBSatelliteEquipmentControl::setLNBSatCRformat(int SatCR_format)
+{
+ eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCRformat(%d)", SatCR_format);
+ if(!((SatCR_format >-1) && (SatCR_format < 2)))
+ return -EPERM;
+ if ( currentLNBValid() )
+ m_lnbs[m_lnbidx].SatCR_format = SatCR_format;
+ else
+ return -ENOENT;
+ return 0;
+}
+
RESULT eDVBSatelliteEquipmentControl::setLNBSatCR(int SatCR_idx)
{
eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCR(%d)", SatCR_idx);
return -ENOENT;
}
+RESULT eDVBSatelliteEquipmentControl::getLNBSatCRformat()
+{
+ if ( currentLNBValid() )
+ return m_lnbs[m_lnbidx].SatCR_format;
+ return -ENOENT;
+}
+
RESULT eDVBSatelliteEquipmentControl::getLNBSatCR()
{
if ( currentLNBValid() )