void CFrontend::setInput(t_satellite_position satellitePosition, uint32_t frequency, uint8_t polarization) { sat_iterator_t sit = satellites.find(satellitePosition); /* unicable uses diseqc parameter for input selection */ config.uni_lnb = sit->second.diseqc; setLnbOffsets(sit->second.lnbOffsetLow, sit->second.lnbOffsetHigh, sit->second.lnbSwitch); if (config.diseqcType == DISEQC_UNICABLE) return; if (config.diseqcType != DISEQC_ADVANCED) { setDiseqc(sit->second.diseqc, polarization, frequency); return; } if (config.diseqc_order /*sit->second.diseqc_order*/ == COMMITED_FIRST) { if (setDiseqcSimple(sit->second.commited, polarization, frequency)) uncommitedInput = 255; sendUncommittedSwitchesCommand(sit->second.uncommited); } else { if (sendUncommittedSwitchesCommand(sit->second.uncommited)) currentTransponder.diseqc = -1; setDiseqcSimple(sit->second.commited, polarization, frequency); } }
bool DvbStream::tuneDvb( ChannelDesc *chan, bool dvr ) { unsigned long lof=0; int res, hiband=0; struct dvb_frontend_info fe_info; fe_status_t status; unsigned long freq=chan->tp.freq; unsigned long srate=chan->tp.sr; int lnbPos = getSatPos( chan->tp.source ); int rotorMove = 0; int loop=0, i; struct dtv_property cmdargs[20]; struct dtv_properties cmdseq; int inversion; int bandwidth; if ( chan->tp.S2 && !dvbDevice->doS2 ) return false; closeFe(); if ( !openFe() ) return false; if ( (res = ioctl( fdFrontend, FE_GET_INFO, &fe_info ) < 0) ) { perror("FE_GET_INFO: "); return false; } probeCam(); fprintf(stderr, "Using DVB device %d:%d \"%s\"\n", dvbDevice->adapter, dvbDevice->tuner, fe_info.name); freq*=1000; srate*=1000; QTime t1 = QTime::currentTime(); if ( chan->tp.inversion==INVERSION_AUTO ) { if ( fe_info.caps & FE_CAN_INVERSION_AUTO ) inversion = chan->tp.inversion; else { fprintf(stderr,"Can NOT inversion_auto\n"); inversion = INVERSION_OFF; } } else inversion=chan->tp.inversion; switch( fe_info.type ) { case FE_OFDM : { QString s = fe_info.name; //if ( s.contains("TerraTec/qanu USB2.0 Highspeed DVB-T Receiver") ) // cinergyT2 hack // freq+=167000; if (freq < 1000000) freq*=1000UL; cmdargs[0].cmd = DTV_DELIVERY_SYSTEM; cmdargs[0].u.data = SYS_DVBT; cmdargs[1].cmd = DTV_FREQUENCY; cmdargs[1].u.data = freq; cmdargs[2].cmd = DTV_MODULATION; cmdargs[2].u.data = chan->tp.modulation; cmdargs[3].cmd = DTV_CODE_RATE_HP; cmdargs[3].u.data = chan->tp.coderateH; cmdargs[4].cmd = DTV_CODE_RATE_LP; cmdargs[4].u.data = chan->tp.coderateL; cmdargs[5].cmd = DTV_GUARD_INTERVAL; cmdargs[5].u.data = chan->tp.guard; cmdargs[6].cmd = DTV_TRANSMISSION_MODE; cmdargs[6].u.data = chan->tp.transmission; cmdargs[7].cmd = DTV_HIERARCHY; cmdargs[7].u.data = chan->tp.hierarchy; if ( chan->tp.bandwidth==BANDWIDTH_8_MHZ ) bandwidth = 8000000; else if ( chan->tp.bandwidth==BANDWIDTH_7_MHZ ) bandwidth = 7000000; else if ( chan->tp.bandwidth==BANDWIDTH_6_MHZ ) bandwidth = 6000000; cmdargs[8].cmd = DTV_BANDWIDTH_HZ; cmdargs[8].u.data = bandwidth; cmdargs[9].cmd = DTV_INVERSION; cmdargs[9].u.data = inversion; cmdargs[10].cmd = DTV_TUNE; cmdseq.num = 11; cmdseq.props = cmdargs; fprintf(stderr,"tuning DVB-T to %lu Hz\n", freq); fprintf(stderr,"inv:%d bw:%d fecH:%d fecL:%d mod:%d tm:%d gi:%d hier:%d\n", chan->tp.inversion, chan->tp.bandwidth, chan->tp.coderateH, chan->tp.coderateL, chan->tp.modulation, chan->tp.transmission, chan->tp.guard, chan->tp.hierarchy ); break; } case FE_QAM : { cmdargs[0].cmd = DTV_DELIVERY_SYSTEM; cmdargs[0].u.data = SYS_DVBC_ANNEX_AC; cmdargs[1].cmd = DTV_FREQUENCY; cmdargs[1].u.data = freq; cmdargs[2].cmd = DTV_MODULATION; cmdargs[2].u.data = chan->tp.modulation; cmdargs[3].cmd = DTV_SYMBOL_RATE; cmdargs[3].u.data = srate; cmdargs[4].cmd = DTV_INNER_FEC; cmdargs[4].u.data = chan->tp.coderateH; cmdargs[5].cmd = DTV_INVERSION; cmdargs[5].u.data = inversion; cmdargs[6].cmd = DTV_TUNE; cmdseq.num = 7; cmdseq.props = cmdargs; fprintf(stderr,"tuning DVB-C to %lu\n", freq); fprintf(stderr,"inv:%d sr:%lu fecH:%d mod:%d\n", chan->tp.inversion, srate, chan->tp.coderateH, chan->tp.modulation ); break; } case FE_QPSK : { fprintf(stderr,"tuning DVB-S to %lu %c %lu\n", freq, chan->tp.pol, srate); if (freq > 2200000) { if ( dvbDevice->lnb[lnbPos].switchFreq ) { // Dual LO if ( freq<(dvbDevice->lnb[lnbPos].switchFreq*1000) ) { lof = dvbDevice->lnb[lnbPos].loFreq*1000; } else { lof = dvbDevice->lnb[lnbPos].hiFreq*1000; hiband = 1; } } else { if ( dvbDevice->lnb[lnbPos].hiFreq ) { // C Band Multipoint if ( (chan->tp.pol=='h') || (chan->tp.pol=='H') ) lof = (dvbDevice->lnb[lnbPos].hiFreq*1000); else lof = (dvbDevice->lnb[lnbPos].loFreq*1000); } else // Single LO lof = (dvbDevice->lnb[lnbPos].loFreq*1000); } if ( freq<lof ) freq = ( lof-freq ); else freq = ( freq-lof ); } fprintf(stderr,"inv:%d fecH:%d mod:%d\n", chan->tp.inversion, chan->tp.coderateH, chan->tp.modulation ); if ( setDiseqc( lnbPos, chan, hiband, rotorMove, dvr )!=0 ) { closeFe(); return false; } fprintf( stderr, "Diseqc settings time = %d ms\n", t1.msecsTo( QTime::currentTime() ) ); t1 = QTime::currentTime(); if ( chan->tp.S2 ) { fprintf(stderr,"\nTHIS IS DVB-S2 >>>>>>>>>>>>>>>>>>>\n"); cmdargs[0].cmd = DTV_DELIVERY_SYSTEM; cmdargs[0].u.data = SYS_DVBS2; cmdargs[1].cmd = DTV_FREQUENCY; cmdargs[1].u.data = freq; cmdargs[2].cmd = DTV_MODULATION; cmdargs[2].u.data = chan->tp.modulation; cmdargs[3].cmd = DTV_SYMBOL_RATE; cmdargs[3].u.data = srate; cmdargs[4].cmd = DTV_INNER_FEC; cmdargs[4].u.data = chan->tp.coderateH; cmdargs[5].cmd = DTV_PILOT; cmdargs[5].u.data = PILOT_AUTO; cmdargs[6].cmd = DTV_ROLLOFF; cmdargs[6].u.data = chan->tp.rolloff; cmdargs[7].cmd = DTV_INVERSION; cmdargs[7].u.data = inversion; cmdargs[8].cmd = DTV_TUNE; cmdseq.num = 9; cmdseq.props = cmdargs; } else { cmdargs[0].cmd = DTV_DELIVERY_SYSTEM; cmdargs[0].u.data = SYS_DVBS; cmdargs[1].cmd = DTV_FREQUENCY; cmdargs[1].u.data = freq; cmdargs[2].cmd = DTV_MODULATION; cmdargs[2].u.data = chan->tp.modulation; if ( chan->tp.modulation==QAM_AUTO ) cmdargs[2].u.data = QPSK; cmdargs[3].cmd = DTV_SYMBOL_RATE; cmdargs[3].u.data = srate; cmdargs[4].cmd = DTV_INNER_FEC; cmdargs[4].u.data = chan->tp.coderateH; cmdargs[5].cmd = DTV_INVERSION; cmdargs[5].u.data = inversion; cmdargs[6].cmd = DTV_TUNE; cmdseq.num = 7; cmdseq.props = cmdargs; } break; } case FE_ATSC : { cmdargs[0].cmd = DTV_DELIVERY_SYSTEM; cmdargs[0].u.data = SYS_ATSC; cmdargs[1].cmd = DTV_FREQUENCY; cmdargs[1].u.data = freq; cmdargs[2].cmd = DTV_MODULATION; cmdargs[2].u.data = chan->tp.modulation; cmdargs[3].cmd = DTV_INVERSION; cmdargs[3].u.data = inversion; cmdargs[4].cmd = DTV_TUNE; cmdseq.num = 5; cmdseq.props = cmdargs; fprintf(stderr,"tuning ATSC to %lu\n", freq); fprintf(stderr,"inv:%d mod:%d\n", chan->tp.inversion, chan->tp.modulation ); break; } } if ( rotorMove ) { if ( ioctl( fdFrontend, FE_SET_PROPERTY, &cmdseq )<0 ) { perror("ERROR tuning\n"); closeFe(); return false; } moveRotor( lnbPos, chan, hiband, dvr ); loop = 2; } while ( loop>-1 ) { if ( ioctl( fdFrontend, FE_SET_PROPERTY, &cmdseq )<0 ) { perror("ERROR tuning\n"); closeFe(); return false; } QTime lockTime = QTime::currentTime(); do { usleep( 100000 ); fprintf( stderr, "." ); if ( ioctl( fdFrontend, FE_READ_STATUS, &status )==-1 ) { perror( "FE_READ_STATUS" ); break; } if ( status & FE_HAS_LOCK ) { fprintf(stderr," LOCKED."); loop = 0; break; } } while ( lockTime.msecsTo( QTime::currentTime() )<=dvbDevice->tuningTimeout ); fprintf(stderr,"\n"); --loop; } if ( !( status & FE_HAS_LOCK ) ) { fprintf( stderr, "\nNot able to lock to the signal on the given frequency\n" ); closeFe(); return false; } fprintf( stderr, "Tuning time = %d ms\n", t1.msecsTo( QTime::currentTime() ) ); if ( rotorMove ) dvbDevice->lnb[lnbPos].currentSource = chan->tp.source; if ( !dvr ) return true; if ( ( fdDvr = open( dvrName.ascii(), O_RDONLY|O_NONBLOCK)) < 0 ) { perror("DVR DEVICE: "); closeFe(); fdDvr = 0; return false; } pfd.fd=fdDvr; pfd.events=POLLIN|POLLPRI; currentTransponder = chan->tp; return true; }