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

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