Пример #1
0
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);
	}
}
Пример #2
0
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;
}