Add struct to keep frontend settigs

* Add satellite map to keep configured satellites
* Change Lock() to handle usecount
* Use slave member to protect diseqc/voltage/tone operations
* Change debug to include frontend number


Origin commit data
------------------
Branch: ni/coolstream
Commit: c49ccd0b78
Author: [CST] Focus <focus.cst@gmail.com>
Date: 2012-01-13 (Fri, 13 Jan 2012)

Origin message was:
------------------
* Add struct to keep frontend settigs
* Add satellite map to keep configured satellites
* Change Lock() to handle usecount
* Use slave member to protect diseqc/voltage/tone operations
* Change debug to include frontend number


------------------
This commit was generated by Migit
This commit is contained in:
[CST] Focus
2012-01-13 14:09:13 +04:00
parent 7ed4693529
commit de155273dc
2 changed files with 170 additions and 123 deletions

View File

@@ -3,6 +3,8 @@
*
* (C) 2002-2003 Andreas Oberritter <obi@tuxbox.org>
*
* Copyright (C) 2011 CoolStream International Ltd
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -23,8 +25,9 @@
#define __zapit_frontend_h__
#include <inttypes.h>
#include "types.h"
#include "channel.h"
#include <zapit/types.h>
#include <zapit/channel.h>
#include <zapit/satconfig.h>
#include <map>
#define FEC_S2_QPSK_1_2 (fe_code_rate_t)(FEC_AUTO+1) //10
@@ -76,9 +79,16 @@ typedef struct dvb_frontend_parameters FrontendParameters;
#define MAX_LNBS 64 /* due to Diseqc 1.1 (2003-01-10 rasc) */
class CFrontend;
typedef std::map<unsigned short, CFrontend*> fe_map_t;
typedef fe_map_t::iterator fe_map_iterator_t;
class CFEManager;
typedef struct frontend_config {
int diseqcRepeats;
int diseqcType;
int uni_scr;
int uni_qrg;
int motorRotationSpeed;
int highVoltage;
} frontend_config_t;
class CFrontend
{
@@ -104,17 +114,9 @@ class CFrontend
int32_t currentSatellitePosition;
/* SETTINGS */
/* how often to repeat DiSEqC 1.1 commands */
uint8_t diseqcRepeats;
/* DiSEqC type of attached hardware */
diseqc_t diseqcType;
frontend_config_t config;
/* variables for EN 50494 (a.k.a Unicable) */
int uni_scr; /* the unicable SCR address, -1 == no unicable */
int uni_qrg; /* the unicable frequency in MHz, 0 == from spec */
int motorRotationSpeed; //in 0.1 degrees per second
bool highVoltage;
satellite_map_t satellites;
double gotoXXLatitude, gotoXXLongitude;
int gotoXXLaDirection, gotoXXLoDirection;
@@ -155,16 +157,17 @@ class CFrontend
/* Private constructor */
CFrontend(int Number = 0, int Adapter = 0);
static CFrontend *getInstance(int Number = 0, int Adapter = 0);
friend class CFEManager;
public:
~CFrontend(void);
static CFrontend *getInstance(int Number = 0, int Adapter = 0);
static fe_code_rate_t getCodeRate(const uint8_t fec_inner, int system = 0);
uint8_t getDiseqcPosition(void) const { return currentTransponder.diseqc; }
uint8_t getDiseqcRepeats(void) const { return diseqcRepeats; }
diseqc_t getDiseqcType(void) const { return diseqcType; }
uint32_t getFrequency(void) const;
uint8_t getDiseqcRepeats(void) const { return config.diseqcRepeats; }
diseqc_t getDiseqcType(void) const { return (diseqc_t) config.diseqcType; }
uint32_t getFrequency(void) const { return curfe.frequency; }
bool getHighBand() { return (int) getFrequency() >= lnbSwitch; }
static fe_modulation_t getModulation(const uint8_t modulation);
uint8_t getPolarization(void) const;
const struct dvb_frontend_info *getInfo(void) const { return &info; };
@@ -178,7 +181,7 @@ class CFrontend
int32_t getCurrentSatellitePosition() { return currentSatellitePosition; }
void setDiseqcRepeats(const uint8_t repeats) { diseqcRepeats = repeats; }
void setDiseqcRepeats(const uint8_t repeats) { config.diseqcRepeats = repeats; }
void setDiseqcType(const diseqc_t type);
void setTimeout(int timeout) { feTimeout = timeout; };
void configUsals(double Latitude, double Longitude, int LaDirection, int LoDirection, bool _repeatUsals)
@@ -190,8 +193,11 @@ class CFrontend
repeatUsals = _repeatUsals;
};
void configRotor(int _motorRotationSpeed, bool _highVoltage)
{ motorRotationSpeed = _motorRotationSpeed; highVoltage = _highVoltage; };
void configUnicable(int scr, int qrg) { uni_scr = scr; uni_qrg = qrg; };
{ config.motorRotationSpeed = _motorRotationSpeed; config.highVoltage = _highVoltage; };
void configUnicable(int scr, int qrg) { config.uni_scr = scr; config.uni_qrg = qrg; };
frontend_config_t& getConfig() { return config; };
void setConfig(frontend_config_t cfg) { setDiseqcType((diseqc_t) cfg.diseqcType); config = cfg; };
int setParameters(TP_params *TP, bool nowait = 0);
int tuneFrequency (struct dvb_frontend_parameters * feparams, uint8_t polarization, bool nowait = false);
@@ -208,24 +214,31 @@ class CFrontend
fe_code_rate_t getCFEC ();
transponder_id_t getTsidOnid() { return currentTransponder.TP_id; }
bool sameTsidOnid(transponder_id_t tpid)
{
return (currentTransponder.TP_id == 0)
|| (tpid == currentTransponder.TP_id);
}
void setTsidOnid(transponder_id_t newid) { currentTransponder.TP_id = newid; }
uint32_t getRate ();
bool Open();
void Close();
void Lock() { locked = true; };
void Unlock() { locked = false; };
void Lock();
void Unlock();
bool sendUncommittedSwitchesCommand(int input);
bool setInput(CZapitChannel *channel, bool nvod);
void setInput(t_satellite_position satellitePosition, uint32_t frequency, uint8_t polarization);
bool setDiseqcSimple(int sat_no, const uint8_t pol, const uint32_t frequency);
void setDiseqc(int sat_no, const uint8_t pol, const uint32_t frequency);
void setMasterSlave(bool _slave) { slave = _slave; };
void setMasterSlave(bool _slave);
int driveToSatellitePosition(t_satellite_position satellitePosition, bool from_scan = false);
void setLnbOffsets(int32_t _lnbOffsetLow, int32_t _lnbOffsetHigh, int32_t _lnbSwitch);
struct dvb_frontend_event getEvent(void);
bool Locked() { return locked; };
bool Locked() { return usecount; };
satellite_map_t & getSatellites() { return satellites; }
void setSatellites(satellite_map_t satmap) { satellites = satmap; }
int getNumber() { return fenumber; };
};
#endif /* __zapit_frontend_h__ */

View File

@@ -3,6 +3,8 @@
*
* (C) 2002-2003 Andreas Oberritter <obi@tuxbox.org>
*
* Copyright (C) 2011 CoolStream International Ltd
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -114,8 +116,8 @@ static const struct dtv_property dvbc_cmdargs[] = {
((tv2.tv_usec-tv.tv_usec) / 1000); \
if(tmin > timer_msec) tmin = timer_msec; \
if(tmax < timer_msec) tmax = timer_msec; \
printf("%s: %u msec (min %u max %u)\n", \
label, timer_msec, tmin, tmax);
printf("[fe%d] %s: %u msec (min %u max %u)\n", \
fenumber, label, timer_msec, tmin, tmax);
// Internal Inner FEC representation
typedef enum dvb_fec {
@@ -132,6 +134,7 @@ typedef enum dvb_fec {
fNone = 15
} dvb_fec_t;
/*********************************************************************************************************/
// Global fe instance
CFrontend *CFrontend::currentFe = NULL;
@@ -150,10 +153,10 @@ CFrontend::CFrontend(int Number, int Adapter)
fd = -1;
fenumber = Number;
adapter = Adapter;
slave = fenumber; // FIXME
diseqcType = NO_DISEQC;
slave = false;
standby = true;
locked = false;
usecount = 0;
memset(&curfe, 0, sizeof(curfe));
@@ -169,23 +172,27 @@ CFrontend::CFrontend(int Number, int Adapter)
currentTransponder.TP_id = 0;
currentTransponder.diseqc = 255;
uni_scr = -1; /* the unicable SCR address, -1 == no unicable */
uni_qrg = 0; /* the unicable frequency in MHz, 0 == from spec */
config.diseqcType = NO_DISEQC;
config.diseqcRepeats = 0;
config.uni_scr = -1; /* the unicable SCR address, -1 == no unicable */
config.uni_qrg = 0; /* the unicable frequency in MHz, 0 == from spec */
config.highVoltage = false;
config.motorRotationSpeed = 0; //in 0.1 degrees per second
feTimeout = 40;
highVoltage = false;
motorRotationSpeed = 0; //in 0.1 degrees per second
// to allow Open() switch it off
currentVoltage = SEC_VOLTAGE_OFF; //SEC_VOLTAGE_13;
currentToneMode = SEC_TONE_ON;
}
CFrontend::~CFrontend(void)
{
printf("[fe%d] close frontend fd %d\n", fenumber, fd);
if(fd >= 0) {
if (diseqcType > MINI_DISEQC)
sendDiseqcStandby();
Close();
close(fd);
}
currentFe = NULL;
//currentFe = NULL;
}
bool CFrontend::Open(void)
@@ -205,11 +212,12 @@ bool CFrontend::Open(void)
return false;
}
fop(ioctl, FE_GET_INFO, &info);
printf("[fe0] frontend fd %d type %d\n", fd, info.type);
printf("[fe%d] frontend fd %d type %d\n", fenumber, fd, info.type);
}
//FIXME info.type = FE_QAM;
currentVoltage = SEC_VOLTAGE_OFF;
//currentVoltage = SEC_VOLTAGE_OFF;
//secSetVoltage(SEC_VOLTAGE_OFF, 15);
secSetVoltage(SEC_VOLTAGE_13, 15);
secSetTone(SEC_TONE_OFF, 15);
sendDiseqcPowerOn();
@@ -225,7 +233,7 @@ void CFrontend::Close(void)
if(standby)
return;
if (!slave && diseqcType > MINI_DISEQC)
if (!slave && config.diseqcType > MINI_DISEQC)
sendDiseqcStandby();
secSetVoltage(SEC_VOLTAGE_OFF, 0);
@@ -234,11 +242,44 @@ void CFrontend::Close(void)
standby = true;;
}
void CFrontend::setMasterSlave(bool _slave)
{
if(slave == _slave)
return;
if(_slave) {
secSetVoltage(SEC_VOLTAGE_OFF, 0);
secSetTone(SEC_TONE_OFF, 15);
}
slave = _slave;
if(!slave) {
secSetVoltage(SEC_VOLTAGE_13, 0);
#if 1
diseqc_t diseqcType = (diseqc_t) config.diseqcType;
config.diseqcType = NO_DISEQC;
setDiseqcType(diseqcType);
#endif
}
}
void CFrontend::reset(void)
{
// No-op
}
void CFrontend::Lock()
{
usecount++;
INFO("[fe%d] usecount %d tp %llx\n", fenumber, usecount, getTsidOnid());
}
void CFrontend::Unlock()
{
if(usecount > 0)
usecount--;
INFO("[fe%d] usecount %d tp %llx\n", fenumber, usecount, getTsidOnid());
}
fe_code_rate_t CFrontend::getCFEC()
{
if (info.type == FE_QPSK) {
@@ -320,22 +361,6 @@ fe_modulation_t CFrontend::getModulation(const uint8_t modulation)
}
}
uint32_t CFrontend::getFrequency(void) const
{
switch (info.type) {
case FE_QPSK:
if (currentToneMode == SEC_TONE_OFF)
return curfe.frequency;
else
return curfe.frequency;
case FE_QAM:
case FE_OFDM:
default:
return curfe.frequency;
}
}
uint8_t CFrontend::getPolarization(void) const
{
return currentTransponder.polarization;
@@ -415,7 +440,7 @@ struct dvb_frontend_event CFrontend::getEvent(void)
memset(&event, 0, sizeof(struct dvb_frontend_event));
printf("[fe0] getEvent: max timeout: %d\n", TIMEOUT_MAX_MS);
printf("[fe%d] getEvent: max timeout: %d\n", fenumber, TIMEOUT_MAX_MS);
FE_TIMER_START();
//while (msec <= TIMEOUT_MAX_MS ) {
@@ -427,12 +452,12 @@ struct dvb_frontend_event CFrontend::getEvent(void)
continue;
}
if (ret == 0) {
FE_TIMER_STOP("[fe0] ############################## poll timeout, time");
FE_TIMER_STOP("############################## poll timeout, time");
continue;
}
if (pfd.revents & (POLLIN | POLLPRI)) {
FE_TIMER_STOP("[fe0] poll has event after");
FE_TIMER_STOP("poll has event after");
memset(&event, 0, sizeof(struct dvb_frontend_event));
//fop(ioctl, FE_READ_STATUS, &event.status);
@@ -441,7 +466,7 @@ struct dvb_frontend_event CFrontend::getEvent(void)
perror("CFrontend::getEvent ioctl");
continue;
}
//printf("[fe0] poll events %d status %x\n", pfd.revents, event.status);
//printf("[fe%d] poll events %d status %x\n", fenumber, pfd.revents, event.status);
if (event.status & FE_HAS_LOCK) {
printf("[fe%d] ****************************** FE_HAS_LOCK: freq %lu\n", fenumber, (long unsigned int)event.parameters.frequency);
@@ -466,7 +491,7 @@ struct dvb_frontend_event CFrontend::getEvent(void)
/* msec = TIME_STEP; */
}
} else if (pfd.revents & POLLHUP) {
FE_TIMER_STOP("[fe0] poll hup after");
FE_TIMER_STOP("poll hup after");
reset();
}
}
@@ -560,7 +585,7 @@ void CFrontend::getDelSys(int f, int m, char *&fec, char *&sys, char *&mod)
fec = (char *)"9/10";
break;
default:
printf("[fe0] getDelSys: unknown FEC: %d !!!\n", f);
printf("[frontend] getDelSys: unknown FEC: %d !!!\n", f);
case FEC_AUTO:
fec = (char *)"AUTO";
break;
@@ -652,7 +677,7 @@ bool CFrontend::buildProperties(const struct dvb_frontend_parameters *feparams,
fec = FEC_9_10;
break;
default:
printf("[fe0] DEMOD: unknown FEC: %d\n", fec_inner);
printf("[fe%d] DEMOD: unknown FEC: %d\n", fenumber, fec_inner);
case FEC_AUTO:
case FEC_S2_AUTO:
fec = FEC_AUTO;
@@ -693,7 +718,7 @@ bool CFrontend::buildProperties(const struct dvb_frontend_parameters *feparams,
}
if (uni_scr >= 0)
if (config.uni_scr >= 0)
cmdseq.props[FREQUENCY].u.data = sendEN50494TuningCommand(feparams->frequency,
currentToneMode == SEC_TONE_ON,
currentVoltage == SEC_VOLTAGE_18,
@@ -714,18 +739,18 @@ int CFrontend::setFrontend(const struct dvb_frontend_parameters *feparams, bool
tuned = false;
//printf("[fe0] DEMOD: FEC %s system %s modulation %s pilot %s\n", f, s, m, pilot == PILOT_ON ? "on" : "off");
//printf("[fe%d] DEMOD: FEC %s system %s modulation %s pilot %s\n", fenumber, f, s, m, pilot == PILOT_ON ? "on" : "off");
struct dvb_frontend_event ev;
{
// Erase previous events
while (1) {
if (ioctl(fd, FE_GET_EVENT, &ev) < 0)
break;
printf("[fe0] DEMOD: event status %d\n", ev.status);
//printf("[fe%d] DEMOD: event status %d\n", fenumber, ev.status);
}
}
//printf("[fe0] DEMOD: FEC %s system %s modulation %s pilot %s, freq %d\n", f, s, m, pilot == PILOT_ON ? "on" : "off", p->props[FREQUENCY].u.data);
//printf("[fe%d] DEMOD: FEC %s system %s modulation %s pilot %s, freq %d\n", fenumber, f, s, m, pilot == PILOT_ON ? "on" : "off", p->props[FREQUENCY].u.data);
if (!buildProperties(feparams, cmdseq))
return 0;
@@ -736,7 +761,7 @@ int CFrontend::setFrontend(const struct dvb_frontend_parameters *feparams, bool
perror("FE_SET_PROPERTY failed");
return false;
}
FE_TIMER_STOP("[fe0] FE_SET_PROPERTY took");
FE_TIMER_STOP("FE_SET_PROPERTY took");
}
{
FE_TIMER_INIT();
@@ -745,7 +770,7 @@ int CFrontend::setFrontend(const struct dvb_frontend_parameters *feparams, bool
struct dvb_frontend_event event;
event = getEvent();
FE_TIMER_STOP("[fe0] tuning took");
FE_TIMER_STOP("tuning took");
}
return tuned;
@@ -753,13 +778,13 @@ int CFrontend::setFrontend(const struct dvb_frontend_parameters *feparams, bool
void CFrontend::secSetTone(const fe_sec_tone_mode_t toneMode, const uint32_t ms)
{
if (info.type != FE_QPSK)
if (slave || info.type != FE_QPSK)
return;
if (currentToneMode == toneMode)
return;
if (uni_scr >= 0) {
if (config.uni_scr >= 0) {
/* this is too ugly for words. the "currentToneMode" is the only place
where the global "highband" state is saved. So we need to fake it for
unicable and still set the tone on... */
@@ -774,24 +799,27 @@ void CFrontend::secSetTone(const fe_sec_tone_mode_t toneMode, const uint32_t ms)
FE_TIMER_START();
if (fop(ioctl, FE_SET_TONE, toneMode) == 0) {
currentToneMode = toneMode;
FE_TIMER_STOP("[fe0] FE_SET_TONE took");
FE_TIMER_STOP("FE_SET_TONE took");
usleep(1000 * ms);
}
}
void CFrontend::secSetVoltage(const fe_sec_voltage_t voltage, const uint32_t ms)
{
if (slave || info.type != FE_QPSK)
return;
if (currentVoltage == voltage)
return;
printf("[fe%d] voltage %s\n", fenumber, voltage == SEC_VOLTAGE_OFF ? "OFF" : voltage == SEC_VOLTAGE_13 ? "13" : "18");
//printf("[fe%d] voltage %s high %d\n", fenumber, voltage == SEC_VOLTAGE_OFF ? "OFF" : voltage == SEC_VOLTAGE_13 ? "13" : "18", highVoltage);
//int val = highVoltage;
//printf("[fe%d] voltage %s high %d\n", fenumber, voltage == SEC_VOLTAGE_OFF ? "OFF" : voltage == SEC_VOLTAGE_13 ? "13" : "18", config.highVoltage);
//int val = config.highVoltage;
//fop(ioctl, FE_ENABLE_HIGH_LNB_VOLTAGE, val);
//FE_TIMER_INIT();
//FE_TIMER_START();
if (uni_scr >= 0) {
if (config.uni_scr >= 0) {
/* see my comment in secSetTone... */
currentVoltage = voltage; /* need to know polarization for unicable */
fop(ioctl, FE_SET_VOLTAGE, SEC_VOLTAGE_13); /* voltage must not be 18V */
@@ -800,7 +828,7 @@ void CFrontend::secSetVoltage(const fe_sec_voltage_t voltage, const uint32_t ms)
if (fop(ioctl, FE_SET_VOLTAGE, voltage) == 0) {
currentVoltage = voltage;
//FE_TIMER_STOP("[fe0] FE_SET_VOLTAGE took");
//FE_TIMER_STOP("[frontend] FE_SET_VOLTAGE took");
usleep(1000 * ms); // FIXME : is needed ?
}
}
@@ -811,10 +839,12 @@ void CFrontend::secResetOverload(void)
void CFrontend::sendDiseqcCommand(const struct dvb_diseqc_master_cmd *cmd, const uint32_t ms)
{
printf("[fe0] Diseqc cmd: ");
printf("[fe%d] Diseqc cmd: ", fenumber);
for (int i = 0; i < cmd->msg_len; i++)
printf("0x%X ", cmd->msg[i]);
printf("\n");
if(slave)
return;
if (fop(ioctl, FE_DISEQC_SEND_MASTER_CMD, cmd) == 0)
usleep(1000 * ms);
}
@@ -834,25 +864,25 @@ void CFrontend::setDiseqcType(const diseqc_t newDiseqcType)
{
switch (newDiseqcType) {
case NO_DISEQC:
INFO("NO_DISEQC");
INFO("fe%d: NO_DISEQC", fenumber);
break;
case MINI_DISEQC:
INFO("MINI_DISEQC");
INFO("fe%d: MINI_DISEQC", fenumber);
break;
case SMATV_REMOTE_TUNING:
INFO("SMATV_REMOTE_TUNING");
INFO("fe%d: SMATV_REMOTE_TUNING", fenumber);
break;
case DISEQC_1_0:
INFO("DISEQC_1_0");
INFO("fe%d: DISEQC_1_0", fenumber);
break;
case DISEQC_1_1:
INFO("DISEQC_1_1");
INFO("fe%d: DISEQC_1_1", fenumber);
break;
case DISEQC_1_2:
INFO("DISEQC_1_2");
INFO("fe%d: DISEQC_1_2", fenumber);
break;
case DISEQC_ADVANCED:
INFO("DISEQC_ADVANCED");
INFO("fe%d: DISEQC_ADVANCED", fenumber);
break;
#if 0
case DISEQC_2_0:
@@ -871,20 +901,20 @@ void CFrontend::setDiseqcType(const diseqc_t newDiseqcType)
}
#if 0
if (!slave && (diseqcType <= MINI_DISEQC)
if (!slave && (config.diseqcType <= MINI_DISEQC)
&& (newDiseqcType > MINI_DISEQC)) {
sendDiseqcPowerOn();
sendDiseqcReset();
}
#else
if (diseqcType != newDiseqcType) {
if (config.diseqcType != newDiseqcType) {
sendDiseqcPowerOn();
sendDiseqcReset();
}
#endif
diseqcType = newDiseqcType;
config.diseqcType = newDiseqcType;
}
void CFrontend::setLnbOffsets(int32_t _lnbOffsetLow, int32_t _lnbOffsetHigh, int32_t _lnbSwitch)
@@ -892,7 +922,7 @@ void CFrontend::setLnbOffsets(int32_t _lnbOffsetLow, int32_t _lnbOffsetHigh, int
lnbOffsetLow = _lnbOffsetLow * 1000;
lnbOffsetHigh = _lnbOffsetHigh * 1000;
lnbSwitch = _lnbSwitch * 1000;
printf("[fe0] setLnbOffsets %d/%d/%d\n", lnbOffsetLow, lnbOffsetHigh, lnbSwitch);
printf("[fe%d] setLnbOffsets %d/%d/%d\n", fenumber, lnbOffsetLow, lnbOffsetHigh, lnbSwitch);
}
void CFrontend::sendMotorCommand(uint8_t cmdtype, uint8_t address, uint8_t command, uint8_t num_parameters, uint8_t parameter1, uint8_t parameter2, int repeat)
@@ -912,7 +942,7 @@ void CFrontend::sendMotorCommand(uint8_t cmdtype, uint8_t address, uint8_t comma
cmd.msg[4] = parameter2;
cmd.msg_len = 3 + num_parameters;
//secSetVoltage(highVoltage ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, 15);
//secSetVoltage(config.highVoltage ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, 15);
secSetVoltage(SEC_VOLTAGE_13, 15);
secSetTone(SEC_TONE_OFF, 15);
@@ -932,7 +962,7 @@ void CFrontend::positionMotor(uint8_t motorPosition)
};
if (motorPosition != 0) {
secSetVoltage(highVoltage ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, 15);
secSetVoltage(config.highVoltage ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, 15);
secSetTone(SEC_TONE_OFF, 25);
cmd.msg[3] = motorPosition;
@@ -972,14 +1002,14 @@ bool CFrontend::setInput(CZapitChannel * channel, bool nvod)
void CFrontend::setInput(t_satellite_position satellitePosition, uint32_t frequency, uint8_t polarization)
{
sat_iterator_t sit = satellitePositions.find(satellitePosition);
sat_iterator_t sit = satellites.find(satellitePosition);
#if 0
printf("[fe0] setInput: SatellitePosition %d -> %d\n", currentSatellitePosition, satellitePosition);
printf("[fe%d] setInput: SatellitePosition %d -> %d\n", fenumber, currentSatellitePosition, satellitePosition);
if (currentSatellitePosition != satellitePosition)
#endif
setLnbOffsets(sit->second.lnbOffsetLow, sit->second.lnbOffsetHigh, sit->second.lnbSwitch);
if (diseqcType != DISEQC_ADVANCED) {
if (config.diseqcType != DISEQC_ADVANCED) {
setDiseqc(sit->second.diseqc, polarization, frequency);
return;
}
@@ -1002,20 +1032,20 @@ uint32_t CFrontend::sendEN50494TuningCommand(const uint32_t frequency, const int
{
uint32_t uni_qrgs[] = { 1284, 1400, 1516, 1632, 1748, 1864, 1980, 2096 };
uint32_t bpf;
if (uni_qrg == 0)
bpf = uni_qrgs[uni_scr];
if (config.uni_qrg == 0)
bpf = uni_qrgs[config.uni_scr];
else
bpf = uni_qrg;
bpf = config.uni_qrg;
struct dvb_diseqc_master_cmd cmd = {
{0xe0, 0x10, 0x5a, 0x00, 0x00, 0x00}, 5
};
unsigned int t = (frequency / 1000 + bpf + 2) / 4 - 350;
if (t < 1024 && uni_scr >= 0 && uni_scr < 8)
if (t < 1024 && config.uni_scr >= 0 && config.uni_scr < 8)
{
fprintf(stderr, "VOLT18=%d TONE_ON=%d, freq=%d bpf=%d ret=%d\n", currentVoltage == SEC_VOLTAGE_18, currentToneMode == SEC_TONE_ON, frequency, bpf, (t + 350) * 4000 - frequency);
cmd.msg[3] = (t >> 8) | /* highest 3 bits of t */
(uni_scr << 5) | /* adress */
(config.uni_scr << 5) | /* adress */
(bank << 4) | /* not implemented yet */
(horizontal << 3) | /* horizontal == 0x08 */
(high_band) << 2; /* high_band == 0x04 */
@@ -1026,7 +1056,7 @@ uint32_t CFrontend::sendEN50494TuningCommand(const uint32_t frequency, const int
fop(ioctl, FE_SET_VOLTAGE, SEC_VOLTAGE_13);
return (t + 350) * 4000 - frequency;
}
WARN("ooops. t > 1024? (%d) or uni_scr out of range? (%d)", t, uni_scr);
WARN("ooops. t > 1024? (%d) or uni_scr out of range? (%d)", t, config.uni_scr);
return 0;
}
@@ -1104,7 +1134,7 @@ int CFrontend::setParameters(TP_params *TP, bool /*nowait*/)
#endif
}
printf("[fe0] tuner to frequency %d (offset %d)\n", feparams->frequency, freq_offset);
printf("[fe%d] tuner to frequency %d (offset %d)\n", fenumber, feparams->frequency, freq_offset);
setFrontend(feparams);
#if 0
@@ -1134,7 +1164,7 @@ bool CFrontend::sendUncommittedSwitchesCommand(int input)
{0xe0, 0x10, 0x39, 0x00, 0x00, 0x00}, 4
};
printf("[fe0] uncommitted %d -> %d\n", uncommitedInput, input);
printf("[fe%d] uncommitted %d -> %d\n", fenumber, uncommitedInput, input);
if ((input < 0) || (uncommitedInput == input))
return false;
@@ -1158,8 +1188,10 @@ bool CFrontend::setDiseqcSimple(int sat_no, const uint8_t pol, const uint32_t fr
{0xe0, 0x10, 0x38, 0x00, 0x00, 0x00}, 4
};
printf("[fe0] diseqc input %d -> %d\n", diseqc, sat_no);
INFO("[fe%d] diseqc input %d -> %d", fenumber, diseqc, sat_no);
currentTransponder.diseqc = sat_no;
if (slave)
return true;
if ((sat_no >= 0) && (diseqc != sat_no)) {
diseqc = sat_no;
printf("[fe%d] diseqc no. %d\n", fenumber, sat_no);
@@ -1176,10 +1208,10 @@ bool CFrontend::setDiseqcSimple(int sat_no, const uint8_t pol, const uint32_t fr
}
return false;
#if 0 //do we need this in advanced setup ?
if (diseqcType == SMATV_REMOTE_TUNING)
if (config.diseqcType == SMATV_REMOTE_TUNING)
sendDiseqcSmatvRemoteTuningCommand(frequency);
if (diseqcType == MINI_DISEQC)
if (config.diseqcType == MINI_DISEQC)
sendToneBurst(b, 15);
currentTransponder.diseqc = sat_no;
#endif
@@ -1195,6 +1227,7 @@ void CFrontend::setDiseqc(int sat_no, const uint8_t pol, const uint32_t frequenc
fe_sec_mini_cmd_t b = (sat_no & 1) ? SEC_MINI_B : SEC_MINI_A;
int delay = 0;
INFO("[fe%d] diseqc input %d -> %d", fenumber, diseqc, sat_no);
if (slave)
return;
@@ -1204,14 +1237,14 @@ void CFrontend::setDiseqc(int sat_no, const uint8_t pol, const uint32_t frequenc
//secSetVoltage(SEC_VOLTAGE_13, 15);//FIXME for test
secSetTone(SEC_TONE_OFF, 20);
for (loop = 0; loop <= diseqcRepeats; loop++) {
for (loop = 0; loop <= config.diseqcRepeats; loop++) {
//usleep(50*1000); /* sleep at least 50 milli seconds */
if (diseqcType == MINI_DISEQC)
if (config.diseqcType == MINI_DISEQC)
sendToneBurst(b, 1);
delay = 0;
if (diseqcType == DISEQC_1_1) { /* setup the uncommited switch first */
if (config.diseqcType == DISEQC_1_1) { /* setup the uncommited switch first */
delay = 60; // delay for 1.0 after 1.1 command
cmd.msg[2] = 0x39; /* port group = uncommited switches */
@@ -1230,7 +1263,7 @@ void CFrontend::setDiseqc(int sat_no, const uint8_t pol, const uint32_t frequenc
sendDiseqcCommand(&cmd, 100); /* send the command to setup second uncommited switch and wait 100 ms !!! */
#endif
}
if (diseqcType >= DISEQC_1_0) { /* DISEQC 1.0 */
if (config.diseqcType >= DISEQC_1_0) { /* DISEQC 1.0 */
usleep(delay * 1000);
//cmd.msg[0] |= 0x01; /* repeated transmission */
@@ -1244,7 +1277,7 @@ void CFrontend::setDiseqc(int sat_no, const uint8_t pol, const uint32_t frequenc
usleep(25 * 1000);
if (diseqcType == SMATV_REMOTE_TUNING)
if (config.diseqcType == SMATV_REMOTE_TUNING)
sendDiseqcSmatvRemoteTuningCommand(frequency);
#if 0 // setSec do this, when tune called
@@ -1330,24 +1363,24 @@ int CFrontend::driveToSatellitePosition(t_satellite_position satellitePosition,
int new_position = 0, old_position = 0;
bool use_usals = 0;
//if(diseqcType == DISEQC_ADVANCED) //FIXME testing
//if(config.diseqcType == DISEQC_ADVANCED) //FIXME testing
{
printf("[fe0] SatellitePosition %d -> %d\n", currentSatellitePosition, satellitePosition);
printf("[fe%d] SatellitePosition %d -> %d\n", fenumber, currentSatellitePosition, satellitePosition);
bool moved = false;
sat_iterator_t sit = satellitePositions.find(satellitePosition);
if (sit == satellitePositions.end()) {
printf("[fe0] satellite position %d not found!\n", satellitePosition);
sat_iterator_t sit = satellites.find(satellitePosition);
if (sit == satellites.end()) {
printf("[fe%d] satellite position %d not found!\n", fenumber, satellitePosition);
return 0;
} else {
new_position = sit->second.motor_position;
use_usals = sit->second.use_usals;
}
sit = satellitePositions.find(currentSatellitePosition);
if (sit != satellitePositions.end())
sit = satellites.find(currentSatellitePosition);
if (sit != satellites.end())
old_position = sit->second.motor_position;
printf("[fe0] motorPosition %d -> %d usals %s\n", old_position, new_position, use_usals ? "on" : "off");
printf("[fe%d] motorPosition %d -> %d usals %s\n", fenumber, old_position, new_position, use_usals ? "on" : "off");
if (currentSatellitePosition == satellitePosition)
return 0;
@@ -1363,15 +1396,16 @@ int CFrontend::driveToSatellitePosition(t_satellite_position satellitePosition,
}
if (from_scan || (new_position > 0 && old_position > 0)) {
waitForMotor = motorRotationSpeed ? 2 + abs(satellitePosition - currentSatellitePosition) / motorRotationSpeed : 0;
waitForMotor = config.motorRotationSpeed ? 2 + abs(satellitePosition - currentSatellitePosition) / config.motorRotationSpeed : 0;
}
if (moved) {
//currentSatellitePosition = satellitePosition;
waitForMotor = motorRotationSpeed ? 2 + abs(satellitePosition - currentSatellitePosition) / motorRotationSpeed : 0;
waitForMotor = config.motorRotationSpeed ? 2 + abs(satellitePosition - currentSatellitePosition) / config.motorRotationSpeed : 0;
currentSatellitePosition = satellitePosition;
}
}
//currentSatellitePosition = satellitePosition;
//FIXME we never remember currentSatellitePosition for non-rotor ?
currentSatellitePosition = satellitePosition;
return waitForMotor;
}
@@ -1626,5 +1660,5 @@ void CFrontend::gotoXX(t_satellite_position pos)
printf("RotorCmd = %04x\n", RotorCmd);
sendMotorCommand(0xE0, 0x31, 0x6E, 2, ((RotorCmd & 0xFF00) / 0x100), RotorCmd & 0xFF, repeatUsals);
secSetVoltage(highVoltage ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, 15); //FIXME ?
secSetVoltage(config.highVoltage ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, 15); //FIXME ?
}