Mercurial > code > home > repos > light9
annotate bin/gyrocontroller @ 254:1546c423b467
Fix bugs introduced in "SubClient created, keyboardcomposer and gyrocontroller use it now"
author | David McClosky <dmcc@bigasterisk.com> |
---|---|
date | Wed, 15 Jun 2005 09:00:27 +0000 |
parents | a92b6d1ac072 |
children | 6f6d9235e8a0 |
rev | line source |
---|---|
246
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
2 # vi: syntax=python |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
3 |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
4 import run_local |
254
1546c423b467
Fix bugs introduced in "SubClient created, keyboardcomposer and gyrocontroller use it now"
David McClosky <dmcc@bigasterisk.com>
parents:
253
diff
changeset
|
5 from light9.Submaster import Submasters, combine_subdict |
253
a92b6d1ac072
SubClient created, keyboardcomposer and gyrocontroller use it now
David McClosky <dmcc@bigasterisk.com>
parents:
246
diff
changeset
|
6 from light9.subclient import SubClient |
246
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
7 |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
8 class circcycle: |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
9 """Like itertools.cycle, but with a prev() method too. You lose |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
10 all iterator benefits by using this, since it will store the whole |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
11 sequence/iterator in memory. Also, do not run this on an infinite |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
12 iterator, as it tuple'ifies the input.""" |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
13 def __init__(self, sequence): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
14 self.sequence = tuple(sequence) |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
15 self.index = 0 |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
16 def __iter__(self): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
17 return self |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
18 def change_index(self, delta): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
19 self.index = (self.index + delta) % len(self.sequence) |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
20 def next(self): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
21 ret = self.sequence[self.index] |
254
1546c423b467
Fix bugs introduced in "SubClient created, keyboardcomposer and gyrocontroller use it now"
David McClosky <dmcc@bigasterisk.com>
parents:
253
diff
changeset
|
22 self.change_index(1) |
246
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
23 return ret |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
24 def prev(self): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
25 ret = self.sequence[self.index] |
254
1546c423b467
Fix bugs introduced in "SubClient created, keyboardcomposer and gyrocontroller use it now"
David McClosky <dmcc@bigasterisk.com>
parents:
253
diff
changeset
|
26 self.change_index(-1) |
246
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
27 return ret |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
28 |
253
a92b6d1ac072
SubClient created, keyboardcomposer and gyrocontroller use it now
David McClosky <dmcc@bigasterisk.com>
parents:
246
diff
changeset
|
29 class AbstractSimpleController(SubClient): |
246
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
30 """Simple controller with minimal input and output: |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
31 |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
32 Input is 4 directions and 3 buttons. |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
33 Output is an integer and a color and maybe more. |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
34 |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
35 Left + B1/right + B1: prev/next sub |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
36 Y-axis + B2: set current level |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
37 B3: toggle keep/solo mode |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
38 Double-B3: clear kept levels""" |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
39 def __init__(self, subnames): |
253
a92b6d1ac072
SubClient created, keyboardcomposer and gyrocontroller use it now
David McClosky <dmcc@bigasterisk.com>
parents:
246
diff
changeset
|
40 SubClient.__init__(self) |
246
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
41 self.subnames = subnames |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
42 self.refresh() |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
43 def refresh(self): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
44 # reload subs from disk |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
45 self.submasters = Submasters() |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
46 self.all_subs = circcycle(self.subnames) |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
47 self.current_sub = self.all_subs.next() |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
48 self.current_level = 1.0 |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
49 self.kept_levels = {} # subname : level [0..1] |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
50 self.keep_solo_mode = 'keep' # either 'keep' or 'solo' |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
51 def clear_kept_levels(self): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
52 self.kept_levels.clear() |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
53 def next(self): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
54 if self.keep_solo_mode == 'keep': |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
55 self.kept_levels[self.current_sub] = self.current_level |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
56 |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
57 self.current_sub = self.submasters.get_sub_by_name(self.all_subs.next()) |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
58 def prev(self): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
59 if self.keep_solo_mode == 'keep': |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
60 self.kept_levels[self.current_sub] = self.current_level |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
61 |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
62 self.current_sub = self.submasters.get_sub_by_name(self.all_subs.prev()) |
253
a92b6d1ac072
SubClient created, keyboardcomposer and gyrocontroller use it now
David McClosky <dmcc@bigasterisk.com>
parents:
246
diff
changeset
|
63 |
246
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
64 def get_levels_as_sub(self): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
65 if self.keep_solo_mode == 'keep': |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
66 # send all levels in self.kept_levels |
253
a92b6d1ac072
SubClient created, keyboardcomposer and gyrocontroller use it now
David McClosky <dmcc@bigasterisk.com>
parents:
246
diff
changeset
|
67 levelsub = combine_subdict(self.kept_levels) |
246
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
68 else: |
253
a92b6d1ac072
SubClient created, keyboardcomposer and gyrocontroller use it now
David McClosky <dmcc@bigasterisk.com>
parents:
246
diff
changeset
|
69 levelsub = self.current_sub * self.current_level |
246
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
70 |
253
a92b6d1ac072
SubClient created, keyboardcomposer and gyrocontroller use it now
David McClosky <dmcc@bigasterisk.com>
parents:
246
diff
changeset
|
71 return levelsub |
246
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
72 |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
73 if __name__ == "__main__": |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
74 if 0: |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
75 x = range(20) |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
76 for z in circcycle(x): |
89cd37c4314b
gyrocontroller and Submaster.combine_subdict
David McClosky <dmcc@bigasterisk.com>
parents:
diff
changeset
|
77 print z |