Nice idea, but not working for me.
If I hold down ChUp on my remote, VDR just goes one channel up. Then, the repeat kicks in and the channel number counts up rapidly, but resets to the current channel after 10-40 channels (1-2 seconds), then starts counting up again. No channel switches after the first one in log files. After releasing ChUp, the final channel switch happens, to the channel that was shown at that time.
With keyboard, the ChUp is waaay slower, but works. From the logs, each channel is switched separately, just as without repeat.
Remote support is based on remote-0.3.3, keyboard support is VDR-builtin. No other plugins loaded.
Cheers,
Udo
Udo Richter wrote:
I have as similar problem. On some channels, the repeat toggles between the next and the original channel. Starting from other channels, it is working better, but at some position, it switches back to the original channel and the sequence restarts.
If that matters, the repeat frequency of my keyboard is quite fast, about 2-3 events per second.
With keyboard, the ChUp is waaay slower, but works. From the logs, each channel is switched separately, just as without repeat.
Didn't test this (no keyboard connected).
Remote support is based on remote-0.3.3, keyboard support is VDR-builtin. No other plugins loaded.
For me it's remote-0.3.4 plus some other plugins.
Regards,
Wolfgang
En/na Joachim Wilke ha escrit:
Here with lirc (0.6.6) it jumps at most two channels. When I release the key it goes back one channel (i.e. the net effect is the same as pressing the key just once). irw shows that lirc is receiving all the time (the sequence is increasing).
Bye
Udo Richter wrote:
Well, I could only test this with my own RCU stuff, but I just assumed that it should work just as well with LIRC.
It can't work with the keyboard, because there is no "repeat" functionality in cKbdRemote. Maybe somebody could find a way to implement that ;-)
So basically I'm afraid I can't help here. The functionality works great with my RCU, so I would assume that there are some glitches in cLircRemote or the remote plugin you're using. My guess would be that there is no uninterrupted stream of "repeat" keypresses. As soon as a non-repeat keypress is received, a channel switch will take place.
Klaus
Andreas Share wrote:
Please put a line like
fprintf(stderr, "%04X\n", Key);
at the beginning of cDisplayChannel::ProcessKey() and check whether, when you press the Up key, hold it down for a while and finally release it, you get
0000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 4000
The important thing is that there is not a single 0000 between all the 8000. If you do get an interruption there, then you should trace that back to where it comes from.
Klaus
Klaus Schmidinger wrote:
The channel doesn't change. Just the displayed channel number counts up, then jumps back down.
I've added some more lines. Looks like the "makes sure a channel switch through the SVDRP CHAN command is displayed" part is causing the reset to the currently shown channel, whenever there's a kNone in the key sequence. This happens roughly once a second.
Here's a log, starting on channel 5:
cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(Channel+) case kUp/Dn: channel=6 channel=NewChannel: Channel=6 cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(Channel+|Repeat) case kUp/Dn: channel=7 cDisplayChannel::ProcessKey(None) timeout, kNone: Channel=6 cDisplayChannel::ProcessKey(Channel+|Repeat) case kUp/Dn: channel=7 cDisplayChannel::ProcessKey(Channel+|Repeat) case kUp/Dn: channel=8 cDisplayChannel::ProcessKey(Channel+|Repeat) case kUp/Dn: channel=9 cDisplayChannel::ProcessKey(Channel+|Repeat) case kUp/Dn: channel=10 cDisplayChannel::ProcessKey(Channel+|Repeat) case kUp/Dn: channel=11 cDisplayChannel::ProcessKey(None) timeout, kNone: Channel=6 cDisplayChannel::ProcessKey(Channel+|Repeat) case kUp/Dn: channel=7 cDisplayChannel::ProcessKey(Channel+|Repeat) case kUp/Dn: channel=8 cDisplayChannel::ProcessKey(Channel+|Repeat) case kUp/Dn: channel=9 [...] cDisplayChannel::ProcessKey(Channel+|Repeat) case kUp/Dn: channel=8 cDisplayChannel::ProcessKey(None) timeout, kNone: Channel=6 cDisplayChannel::ProcessKey(Channel+|Release) channel=NewChannel: Channel=6 cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None) cDisplayChannel::ProcessKey(None)
Channel=6 is always set within the last if block of ProcessKey(), the first time from the final channel=NewChannel, because the repeat did not yet kick in. Later, the channel is set from cDevice::CurrentChannel() on each kNone call. I have ChannelInfoTime=5, TimeoutRequChInfo=1.
Cheers,
Udo
Klaus Schmidinger wrote:
Ok, here is the log from holding down the 'up' key.
/dev/input/event2: press 0000000100010021 <-- debug output remote plugin: 'up' key pressed 50 0000 <-- (cDisplayChannel::ProcessKey 1st value = lastTime.Elapsed(), 2nd value = Key 307 0032 323 0032 339 0032 355 0032 371 0032 387 0032 403 0032 /dev/input/event2: repeat 0000000100010021 <-- key repeat kicks-in 404 8000 107 0032 /dev/input/event2: repeat 0000000100010021 92 8000 /dev/input/event2: repeat 0000000100010021 60 8000 75 0032 /dev/input/event2: repeat 0000000100010021 56 8000 /dev/input/event2: repeat 0000000100010021 68 8000 75 0032 /dev/input/event2: repeat 0000000100010021 56 8000 75 0032 /dev/input/event2: repeat 0000000100010021 64 8000 /dev/input/event2: repeat 0000000100010021 60 8000 79 0032 /dev/input/event2: repeat 0000000100010021 64 8000 /dev/input/event2: repeat 0000000100010021 66 8000 73 0032 /dev/input/event2: repeat 0000000100010021 56 8000 83 0032 /dev/input/event2: repeat 0000000100010021 60 8000 /dev/input/event2: repeat 0000000100010021 60 8000 71 0032 /dev/input/event2: repeat 0000000100010021 60 8000 75 0032 /dev/input/event2: repeat 0000000100010021 60 8000 /dev/input/event2: repeat 0000000100010021 71 8000 76 0032 /dev/input/event2: repeat 0000000100010021 56 8000 76 0032 /dev/input/event2: repeat 0000000100010021 55 8000 /dev/input/event2: repeat 0000000100010021 60 8000 71 0032 /dev/input/event2: repeat 0000000100010021 56 8000 79 0032 /dev/input/event2: repeat 0000000100010021 56 8000 79 0032 71 0032 87 0032 103 0032 119 0032 135 0032 152 0032 /dev/input/event2: release 0000000100010021 <-- key released 155 4000 540 0032 556 0032 572 0032 588 0032 604 0032 621 0032 636 0032 ... 4940 0032 4956 0032 4972 0032 4989 0032 5004 0032
The 0032 (kNone) keys look suspicious to me. The are _not_ created by the remote plugin.
Oliver
Oliver Endriss wrote:
Klaus, could you please have a look at this log?
Oliver
Oliver Endriss wrote:
Well, then they must be created by something else. Here's the same output on my system:
56 0000 <--- Up key pressed 605 8000 <--- right the next Key is kUp|k_Repeat, no intermittent kNone 74 8000 73 8000 76 8000 72 8000 72 8000 73 8000 71 8000 72 8000 72 8000 72 8000 71 8000 67 8000 68 8000 132 8000 72 8000 52 8000 44 8000 lots of kUp|k_Repeat, without any intermittent kNone 52 8000 52 8000 51 8000 44 8000 28 8000 52 8000 72 8000 80 8000 73 8000 59 8000 52 8000 32 8000 52 8000 44 8000 28 8000 32 8000 71 8000 76 8000 71 8000 72 8000 51 8000 52 4000 <--- kUp|k_Release 1034 0032 <--- these kNone are normal 1058 0032 1082 0032 1106 0032 1130 0032 1154 0032 1178 0032 1202 0032 1226 0032 1250 0032
There must be something on your system that creates these intermittent kNone key events, but I don't see where that would be happening in plain vanilla VDR.
From the sequence of kNone right after you pressed the Up key it looks like something is inserting kNone events every 16 ms.
Klaus
Klaus Schmidinger wrote:
It happens with vanilla vdr plus remote plugin. No patches.
From the sequence of kNone right after you pressed the Up key it looks like something is inserting kNone events every 16 ms.
On my system vdr is creating kNone events every 16ms as long as the channel info is displayed. On your system this interval seems to be 24ms.
My system uses a preemtible kernel. HZ is set to 250. Non-NPTL system.
Could you please tell me where these 'normal' events come from? I'd like to change the interval and see whether it affects the problem.
Oliver
Oliver Endriss wrote:
I believe I found what's causing this. In cInterface::GetKey() the line
return cRemote::Get(Wait ? 1000 : 10);
tries to fetch the next keypress from the remote control, and waits at most 10ms in this case. If the remote control doesn't provide another keypress within this timeout, cRemote::Get() returns kNone.
I was able to reproduce this here while debugging the case where the screen gets dark for a moment if pressing "Down" while on channel 1. Setting the timeout to 100ms, as in
return cRemote::Get(Wait ? 1000 : 100);
fixed it for me.
Can you confim this?
Klaus
I demand that Klaus Schmidinger may or may not have written...
[snip]
I believe I found what's causing this. In cInterface::GetKey() the line
return cRemote::Get(Wait ? 1000 : 10);
return cRemote::Get(Wait ? 1000 : 100);
fixed it for me.
FWIW, 100ms may not be enough. My Nova-T remote control currently has a repeat rate of 114ms, and I'm allowing for 133ms in my somewhat-patched budget-ci module.
En/na Klaus Schmidinger ha escrit:
Here with lirc 100 isn't enough. I'm trying with 200 and it solves the problem of getting kNone in between key repeats *but* I still get 3 kNone between the last repeat and the kRelease, so the net effect is that the channel won't change. Still investigating...
Bye
En/na Luca Olivetti ha escrit:
Ok, I see in lirc.c that the REPEATDELAY is 350 (used not only to start the repeat but also to detect that there's no key pressed to generate a release), changing it to 150 and using a delay of 200 in interface.c seems to solve it (but still I'm not sure it is completely reliable).
Bye
En/na Luca Olivetti ha escrit:
It's not reliable. Maybe, instead of just raising the delay in interface (which kinda defeats the purpose of not waiting) cDisplayChannel should remember that a key repeat is in effect and just ignore kNone until a key release or a timeout.
Bye
En/na Luca Olivetti ha escrit:
I just tried to do that with a quick and dirty hack (in order to avoid recompiling everything and plugins, instead of adding a boolean member I "overloaded" number) and it seems to work fine (with the original timeouts in lirc and interface).
Bye
Luca Olivetti wrote:
Based on your suggestion I have implemented a repeat timeout in cRemote, so it should work with any kind of remote control, and for all kinds of menus.
Please try the attached patch (against VD 1.3.40) and run it with the original interface.c.
Originally I didn't want to release a new version of VDR today, but since this repeat thing is rather problematic, and there is also a serious problem with the version of EPG events after a restart, I'm thinking of making a new release later today. So if somebody could confirm that this patch actually works, that would be nice.
Klaus
2006/1/29, Klaus Schmidinger Klaus.Schmidinger@cadsoft.de:
I tried it with success. When pressing the up-key on channel 1, VDR switches to channel 2, keeps showing this program while counting up the channel numbers. When releasing the up-key, VDR switches to the final channel.
Regards, Joachim.
En/na Klaus Schmidinger ha escrit:
I'm afraid it's not reliable enough with the default REPEATDELAY of 350 in lirc.c (sometimes cDIsplayChannels still gets a kNone before the k_Release). Changing REPEATDELAY to 250 seems to work better, but I don't think is the definitive solution.
Bye
Luca Olivetti wrote:
REPEATDELAY is the time from the first keypress until the repeat function actually kicks in. I'm afraid I don't see how this would have an effect here.
Ok, if the events from LIRC are actually more than 250ms apart, then skipping one could result in the repeatDelay timeout to expire. So maybe you should rather try increasing REPEATTIMEOUT in remote.c. I'd say a value of 1000 should really be enough for any remote control (after all, a repeat function is supposed to be _fast_ ;-).
Klaus
En/na Klaus Schmidinger ha escrit:
It's also used as a timeout to detect the release: else { printf("%d\n",LastTime.Elapsed()); if (FirstTime.Elapsed() < REPEATDELAY) continue; // repeat function kicks in after a short delay repeat = true; timeout = REPEATDELAY; <<<<<<< }
Bye
En/na Luca Olivetti ha escrit:
note that I added the printf here to see the time between repeats (that's around 110ms with my remote and lirc version)
Bye
En/na Klaus Schmidinger ha escrit: ded the printf here to see the time between repeats
I think that REPEATTIMEOUT should be at least double than REPEATDELAY (in lirc, I don't know other remotes). So I tried with the original REPEATDELAY 350 and REPEATTIMEOUT 700 as well as REPEATDELAY 250 and REPEATTIMEOUT 500. Both combinations work, so I'd say that a REPEATTIMEOUT of 1000 should definitely work (unless there's some remote that takes more than 500 ms to detect a release after a repeat).
Bye
Klaus Schmidinger wrote:
(Sorry for the late response. I was on vacation.)
I just tested VDR 1.3.41. Now it works perfectly with the remote plugin. Thank you for the fix.
Oliver