Hi,
Gregoire Favre wrote:
> Thank you very much for taking a look at VDR diseqc commands sequence :)
Attached is a patch which adds some output to the tuning process.
t: 1170360811.082, c: 0, r: 0, a:
----------------------------------------------
t: 1170360811.082, c: 0, r: 0, a: ioctl(fd_frontend, FE_SET_TONE,
SEC_TONE_OFF)
t: 1170360811.085, c: 0, r: 0, a: ioctl(fd_frontend, FE_SET_VOLTAGE,
SEC_VOLTAGE_18)
t: 1170360811.169, c: 0, r: 0, a: ioctl(fd_frontend,
FE_DISEQC_SEND_MASTER_CMD, &cmd)
t: 1170360811.205, c: 0, r: 0, a: ioctl(fd_frontend,
FE_DISEQC_SEND_BURST, SEC_MINI_A)
t: 1170360811.225, c: 0, r: 0, a: ioctl(fd_frontend, FE_SET_TONE,
SEC_TONE_ON)
t: 1170360811.225, c: 0, r: 0, a: ioctl(fd_frontend, FE_SET_FRONTEND,
&Frontend)
t: 1170360811.237, c: 0, r: 0, a:
==============================================
t: 1170360870.235, c: 1, r: 0, a:
----------------------------------------------
t: 1170360870.236, c: 1, r: 0, a: ioctl(fd_frontend, FE_SET_TONE,
SEC_TONE_OFF)
t: 1170360870.237, c: 1, r: 0, a: ioctl(fd_frontend, FE_SET_VOLTAGE,
SEC_VOLTAGE_18)
t: 1170360870.319, c: 1, r: 0, a: ioctl(fd_frontend,
FE_DISEQC_SEND_MASTER_CMD, &cmd)
t: 1170360870.355, c: 1, r: 0, a: ioctl(fd_frontend,
FE_DISEQC_SEND_BURST, SEC_MINI_B)
t: 1170360870.375, c: 1, r: 0, a: ioctl(fd_frontend, FE_SET_TONE,
SEC_TONE_OFF)
t: 1170360870.375, c: 1, r: 0, a: ioctl(fd_frontend, FE_SET_FRONTEND,
&Frontend)
t: 1170360870.443, c: 1, r: 0, a:
==============================================
t: 1170360891.319, c: 1, r: 0, a:
----------------------------------------------
t: 1170360891.319, c: 1, r: 0, a: ioctl(fd_frontend, FE_SET_FRONTEND,
&Frontend)
t: 1170360891.331, c: 1, r: 0, a:
==============================================
Legend:
t: current time in seconds
c: card index
r: result of action
a: action in the tuning code
-: start tuning
~: failed tuning (didn't locked)
=: succeeded tuning (locked)
As you can see in the above output, VDR tunes card 0 to some channel and
after 60 seconds, the EPG scan starts using card 1. After 20 seconds, it
tunes to a different transponder on the same "band", so there is just
FE_SET_FRONTEND reported.
I'll now add the same output to szap.
Bye.
--
Dipl.-Inform. (FH) Reinhard Nissl
mailto:[EMAIL PROTECTED]
--- ../vdr-1.4.5-orig/dvbdevice.c 2006-08-14 11:38:32.000000000 +0200
+++ dvbdevice.c 2007-02-01 21:38:44.000000000 +0100
@@ -176,6 +176,13 @@ static unsigned int FrequencyToHz(unsign
return f;
}
+#include <sys/time.h>
+static double now() { timeval t; gettimeofday(&t, 0); return t.tv_sec + t.tv_usec / 1e6; }
+static int check(int c, int r, char *a, double t) { fprintf(stderr, "t: %.3lf, c: %d, r: %d, a: %s\n", t, c, r, a); return r; }
+#define CHECK4(s) ::check(cardIndex, 0, s, ::now())
+#define CHECK3(s) ::check(cardIndex, s, #s, ::now())
+#define CHECK2(s) CHECK(::check(cardIndex, s, #s, ::now()))
+
bool cDvbTuner::SetFrontend(void)
{
dvb_frontend_parameters Frontend;
@@ -195,12 +202,12 @@ bool cDvbTuner::SetFrontend(void)
for (char *CurrentAction = NULL; (da = diseqc->Execute(&CurrentAction)) != cDiseqc::daNone; ) {
switch (da) {
case cDiseqc::daNone: break;
- case cDiseqc::daToneOff: CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_OFF)); break;
- case cDiseqc::daToneOn: CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_ON)); break;
- case cDiseqc::daVoltage13: CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); break;
- case cDiseqc::daVoltage18: CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_18)); break;
- case cDiseqc::daMiniA: CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_BURST, SEC_MINI_A)); break;
- case cDiseqc::daMiniB: CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_BURST, SEC_MINI_B)); break;
+ case cDiseqc::daToneOff: CHECK2(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_OFF)); break;
+ case cDiseqc::daToneOn: CHECK2(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_ON)); break;
+ case cDiseqc::daVoltage13: CHECK2(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); break;
+ case cDiseqc::daVoltage18: CHECK2(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_18)); break;
+ case cDiseqc::daMiniA: CHECK2(ioctl(fd_frontend, FE_DISEQC_SEND_BURST, SEC_MINI_A)); break;
+ case cDiseqc::daMiniB: CHECK2(ioctl(fd_frontend, FE_DISEQC_SEND_BURST, SEC_MINI_B)); break;
case cDiseqc::daCodes: {
int n = 0;
uchar *codes = diseqc->Codes(n);
@@ -208,7 +215,7 @@ bool cDvbTuner::SetFrontend(void)
struct dvb_diseqc_master_cmd cmd;
memcpy(cmd.msg, codes, min(n, int(sizeof(cmd.msg))));
cmd.msg_len = n;
- CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_MASTER_CMD, &cmd));
+ CHECK2(ioctl(fd_frontend, FE_DISEQC_SEND_MASTER_CMD, &cmd));
}
}
break;
@@ -285,7 +292,7 @@ bool cDvbTuner::SetFrontend(void)
esyslog("ERROR: attempt to set channel with unknown DVB frontend type");
return false;
}
- if (ioctl(fd_frontend, FE_SET_FRONTEND, &Frontend) < 0) {
+ if (CHECK3(ioctl(fd_frontend, FE_SET_FRONTEND, &Frontend)) < 0) {
esyslog("ERROR: frontend %d: %m", cardIndex);
return false;
}
@@ -306,11 +313,13 @@ void cDvbTuner::Action(void)
case tsIdle:
break;
case tsSet:
+CHECK4("----------------------------------------------");
tunerStatus = SetFrontend() ? tsTuned : tsIdle;
Timer.Set(tuneTimeout);
continue;
case tsTuned:
if (Timer.TimedOut()) {
+CHECK4("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
tunerStatus = tsSet;
diseqcCommands = NULL;
if (time(NULL) - lastTimeoutReport > 60) { // let's not get too many of these
@@ -328,6 +337,7 @@ void cDvbTuner::Action(void)
continue;
}
else if (Status & FE_HAS_LOCK) {
+if (tunerStatus != tsLocked) CHECK4("==============================================");
if (LostLock) {
isyslog("frontend %d regained lock on channel %d, tp %d", cardIndex, channel.Number(), channel.Transponder());
_______________________________________________
vdr mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr