The rotor moves the dish to the correct position, but then tvheadend is stuck in an infimite loop. Here is an example of moving from 4.8E to 0.8W and the back again.
tvheadend.txt:2014-09-20 08:33:11.865 [ TRACE]:diseqc: rotor USALS goto 0.8W (motor 20.50 counter-clockwise)
tvheadend.txt:2014-09-20 08:33:11.865 [ TRACE]:diseqc: sending diseqc (len 5) E0 31 6E D1 48
tvheadend.txt:2014-09-20 08:33:11.992 [ TRACE]:diseqc: waiting 120 seconds to finish setup for USALS
tvheadend.txt:2014-09-20 08:33:33.205 [ TRACE]:diseqc: rotor USALS goto 0.8W (motor 20.50 counter-clockwise)
tvheadend.txt:2014-09-20 08:33:33.205 [ TRACE]:diseqc: sending diseqc (len 5) E0 31 6E D1 48
tvheadend.txt:2014-09-20 08:33:33.332 [ TRACE]:diseqc: waiting 120 seconds to finish setup for USALS
tvheadend.txt:2014-09-20 08:33:54.517 [ TRACE]:diseqc: rotor USALS goto 0.8W (motor 20.50 counter-clockwise)
tvheadend.txt:2014-09-20 08:33:54.517 [ TRACE]:diseqc: sending diseqc (len 5) E0 31 6E D1 48
tvheadend.txt:2014-09-20 08:33:54.644 [ TRACE]:diseqc: waiting 120 seconds to finish setup for USALS
tvheadend.txt:2014-09-20 08:34:15.985 [ TRACE]:diseqc: rotor USALS goto 0.8W (motor 20.50 counter-clockwise)
tvheadend.txt:2014-09-20 08:34:15.985 [ TRACE]:diseqc: sending diseqc (len 5) E0 31 6E D1 48
tvheadend.txt:2014-09-20 08:34:16.112 [ TRACE]:diseqc: waiting 120 seconds to finish setup for USALS
tvheadend.txt:2014-09-20 08:34:37.318 [ TRACE]:diseqc: rotor USALS goto 0.8W (motor 20.50 counter-clockwise)
tvheadend.txt:2014-09-20 08:34:37.318 [ TRACE]:diseqc: sending diseqc (len 5) E0 31 6E D1 48
tvheadend.txt:2014-09-20 08:34:37.448 [ TRACE]:diseqc: waiting 120 seconds to finish setup for USALS
tvheadend.txt:2014-09-20 08:36:39.101 [ TRACE]:diseqc: rotor USALS goto 4.8E (motor 14.46 counter-clockwise)
tvheadend.txt:2014-09-20 08:36:39.101 [ TRACE]:diseqc: sending diseqc (len 5) E0 31 6E D0 E7
tvheadend.txt:2014-09-20 08:36:39.228 [ TRACE]:diseqc: waiting 120 seconds to finish setup for USALS
The I disabled the check for rate and orbital_dir in: src/input/mpegts/linuxdvb/linuxdvb_rotor.c
139 #if 0
140 if (!ls->ls_orbital_dir || lr->lr_rate == 0)
141 return 120;
And I got:
tvheadend.txt:2014-09-20 08:45:23.549 [ TRACE]:diseqc: rotor USALS goto 4.8E (motor 14.46 counter-clockwise)
tvheadend.txt:2014-09-20 08:45:23.549 [ TRACE]:diseqc: sending diseqc (len 5) E0 31 6E D0 E7
tvheadend.txt:2014-09-20 08:45:23.676 [ TRACE]:diseqc: waiting 202 seconds to finish setup for USALS
Then I reduced the rate to 1ms, changed position of the dish to 0.8W all channels on 0.8W works!
However, now it is not possible to move the dish back to 4.8E.
tvheadend.txt:2014-09-20 08:55:25.657 [ DEBUG]:diseqc: rotor already positioned to 0.8W
Well, then I decided to patch away the check for orbital position in src/input/mpegts/linuxdvb/linuxdvb_rotor.c:
257 #if 0
258 if (linuxdvb_rotor_check_orbital_pos(lm, ls))
259 return 0;
260 #endif
There will be a timeout between switching channels on the same satellite now (of course), but, it works!!!!!!!!!!!!!!!!!!
All channels on all satellites works just fine.
This is of course a horrible hack and it would be good if the code for the timeout and the check for the orbital position is adapted so it works also for my configuration.
If I get time I will add my own orbital check function and timeout calculation function that I used together with JSMs patch. Very simple functions that don't cover all the corner cases that your functions do i.e not for "commercial use" :)