[unicable] Support JESS(EN50607) and update unicable.xml, thanks to adenin.
[vuplus_dvbapp] / lib / dvb / sec.cpp
index 851e9b1..08976ef 100644 (file)
@@ -330,7 +330,6 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
 
                        lnb_param.guard_offset = 0; //HACK
 
-                       frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx);
 
                        if (diseqc13V)
                                voltage_mode = eDVBSatelliteSwitchParameters::HV;
@@ -400,21 +399,52 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        }
                        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);
                        }
 
@@ -711,15 +741,104 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                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]) );
@@ -954,8 +1073,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
        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
@@ -973,12 +1093,48 @@ void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend,
 
        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]) );
@@ -1254,6 +1410,18 @@ RESULT eDVBSatelliteEquipmentControl::setInputpowerDelta(int delta)
 }
 
 /* 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);
@@ -1299,6 +1467,13 @@ RESULT eDVBSatelliteEquipmentControl::getLNBSatCRpositions()
        return -ENOENT;
 }
 
+RESULT eDVBSatelliteEquipmentControl::getLNBSatCRformat()
+{
+       if ( currentLNBValid() )
+               return m_lnbs[m_lnbidx].SatCR_format;
+       return -ENOENT;
+}
+
 RESULT eDVBSatelliteEquipmentControl::getLNBSatCR()
 {
        if ( currentLNBValid() )