fix bugs in last few commits
[uccvend-vendserver.git] / sql-edition / servers / Idler.py
1 #!/usr/bin/env python
2
3 import string
4
5 class Idler:
6         def __init__(self, v):
7                 self.v = v
8
9         def next(self):
10                 pass
11
12 class TrainIdler(Idler):
13         def __init__(self, v):
14                 self.idle_state = 0
15                 self.v = v
16
17         def put_shark(self, s, l):
18                 if self.s[l] == ' ':
19                         self.s[l] = s
20                 elif self.s[l] == 'X':
21                         self.s[l] = '*'
22                 else:
23                         self.s[l] = 'X'
24
25         def next(self):
26                 # does the next stage of a dance
27                 self.s = [' ']*10
28                 shark1 = self.idle_state % 18
29                 if shark1 < 9:
30                         self.put_shark('^', shark1)
31                 else:
32                         self.put_shark('^', 18-shark1)
33
34                 shark2 = ((self.idle_state+4) % 36)/2
35                 if shark2 < 9:
36                         self.put_shark('<', shark2)
37                 else:
38                         self.put_shark('<', 18-shark2)
39
40                 shark3 = ((self.idle_state+7) % 54)/3
41                 if shark3 < 9:
42                         self.put_shark('>', 9-shark3)
43                 else:
44                         self.put_shark('>', 9-(18-shark3))
45
46                 train1 = ((self.idle_state%(18*36)))
47                 train1_start = 122
48                 if train1 > train1_start and train1 < train1_start+(10*2):
49                         for i in range(5):
50                                 ptr = i+train1-train1_start-5
51                                 if ptr >= 0 and ptr < 10: self.s[ptr] = '#'
52
53                 train2 = ((self.idle_state%(18*36)))
54                 train2_start = 400
55                 if train2 > train2_start and train2 < train2_start+(10*2):
56                         for i in range(5):
57                                 ptr = i+train2-train2_start-5
58                                 if ptr >= 0 and ptr < 10: self.s[9-ptr] = '#'
59
60                 train3 = ((self.idle_state%(18*36)))
61                 train3_start = 230
62                 if train3 > train3_start and train3 < train3_start+(10*2):
63                         for i in range(10):
64                                 ptr = i+train3-train3_start-10
65                                 if ptr >= 0 and ptr < 10: self.s[ptr] = '-'
66
67                 self.v.display(string.join(self.s, ''))
68                 self.idle_state += 1
69                 self.idle_state %= 18*36*54
70
71 class GrayIdler(Idler):
72         def __init__(self, v, one=None, zero=None):
73                 self.bits = 8
74                 self.size = 1 << self.bits
75                 self.i = 0
76                 self.grayCode = 0
77                 self.v = v
78                 self.one = one
79                 self.zero = zero
80
81         def next(self):
82                 output = self.do_next_state()
83                 # does the next stage of a dance
84                 if self.zero:
85                         output = string.replace(output, "0", self.zero)
86                 if self.one:
87                         output = string.replace(output, "1", self.one)
88                 self.v.display(" %8.8s " % (output))
89                 self.i = (self.i + 1) % self.size
90
91         def do_next_state(self):
92                 self.grayCode = self.i ^ (self.i >> 1)
93                 output = self.dec2bin(self.grayCode)
94
95                 return "0"*(self.bits-len(output))+output
96
97
98         def dec2bin(self,num):
99             """Convert long/integer number to binary string.
100
101             E.g. dec2bin(12) ==> '1100'.
102             
103             from http://starship.python.net/~gherman/playground/decbingray/decbingray.py"""
104
105             assert num >= 0, "Decimal number must be >= 0!"
106
107             # Gracefully handle degenerate case.
108             # (Not really needed, but anyway.)    
109             if num == 0:
110                 return '0'
111
112             # Find highest value bit.
113             val, j = 1L, 1L
114             while val < num:
115                 val, j = val*2L, j+1L
116
117             # Convert.
118             bin = '' 
119             i = j - 1
120             while i + 1L:
121                 k = pow(2L, i)
122                 if num >= k:
123                     bin = bin + '1'
124                     num = num - k
125                 else:
126                     if len(bin) > 0:
127                         bin = bin + '0'
128                 i = i - 1L
129
130             return bin
131
132
133

UCC git Repository :: git.ucc.asn.au