3 import string, time, popen2, os
4 from random import random
5 from MessageKeeper import MessageKeeper
10 def __init__(self, v):
25 class TrainIdler(Idler):
26 def __init__(self, v):
30 def put_shark(self, s, l):
33 elif self.s[l] == 'X':
39 # does the next stage of a dance
41 shark1 = self.idle_state % 18
43 self.put_shark('^', shark1)
45 self.put_shark('^', 18-shark1)
47 shark2 = ((self.idle_state+4) % 36)/2
49 self.put_shark('<', shark2)
51 self.put_shark('<', 18-shark2)
53 shark3 = ((self.idle_state+7) % 54)/3
55 self.put_shark('>', 9-shark3)
57 self.put_shark('>', 9-(18-shark3))
59 train1 = ((self.idle_state%(18*36)))
61 if train1 > train1_start and train1 < train1_start+(10*2):
63 ptr = i+train1-train1_start-5
64 if ptr >= 0 and ptr < 10: self.s[ptr] = '#'
66 train2 = ((self.idle_state%(18*36)))
68 if train2 > train2_start and train2 < train2_start+(10*2):
70 ptr = i+train2-train2_start-5
71 if ptr >= 0 and ptr < 10: self.s[9-ptr] = '#'
73 train3 = ((self.idle_state%(18*36)))
75 if train3 > train3_start and train3 < train3_start+(10*2):
77 ptr = i+train3-train3_start-10
78 if ptr >= 0 and ptr < 10: self.s[ptr] = '-'
80 self.v.display(string.join(self.s, ''))
82 self.idle_state %= 18*36*54
88 def __init__(self, n=8):
98 from copy import deepcopy
99 if len(self.s) == self.n:
100 self.a.append(deepcopy(self.s))
102 for x in range(0,self.n):
103 if self.u[x]: continue
113 class GrayIdler(Idler):
114 def __init__(self, v, one=None, zero=None, reorder=0):
116 self.size = 1 << self.bits
122 self.reorder = reorder
125 orderings = OrderMaker().order()
128 output = self.do_next_state()
129 # does the next stage of a dance
131 output = string.replace(output, "0", self.zero)
133 output = string.replace(output, "1", self.one)
138 newoutput += output[orderings[self.reorder][i]]
140 self.v.display(" %8.8s " % (output))
141 self.i = (self.i + 1) % self.size
143 def do_next_state(self):
144 self.grayCode = self.i ^ (self.i >> 1)
145 output = self.dec2bin(self.grayCode)
147 return "0"*(self.bits-len(output))+output
150 def dec2bin(self,num):
151 """Convert long/integer number to binary string.
153 E.g. dec2bin(12) ==> '1100'.
155 from http://starship.python.net/~gherman/playground/decbingray/decbingray.py"""
157 assert num >= 0, "Decimal number must be >= 0!"
159 # Gracefully handle degenerate case.
160 # (Not really needed, but anyway.)
164 # Find highest value bit.
167 val, j = val*2L, j+1L
188 self.reorder = int(random()*40319)+1
191 class StringIdler(Idler):
192 def __init__(self, v, text="Hello Cruel World! ",repeat=True):
194 self.mk = MessageKeeper(v)
195 self.text = self.clean_text(text) + " "
197 msg = [("",False, None),(self.text, repeat, 0.8)]
198 self.mk.set_messages(msg)
200 def clean_text(self, text):
201 # nothing like a bit of good clean text :)
202 valid = string.digits \
204 + string.punctuation \
207 text = string.upper(text)
217 self.mk.update_display()
220 return self.mk.done()
222 class ClockIdler(Idler):
223 def __init__(self, v):
228 output = time.strftime("%H:%M:%S")
229 if output != self.last:
230 self.v.display(" %8.8s " % (output))
233 class FortuneIdler(StringIdler):
234 def __init__(self, v):
235 fortune = "/usr/games/fortune"
236 text = "I broke my wookie...."
237 if os.access(fortune,os.F_OK|os.X_OK):
238 (stdout, stdin) = popen2.popen2(fortune)
239 text = string.join(stdout.readlines())
242 StringIdler.__init__(self, v, text,repeat=False)