/[anoncvs]/projects/dispense2/sql-edition/servers/VendingMachine.py


UCC Code Repository

Diff of /projects/dispense2/sql-edition/servers/VendingMachine.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by dagobah, Fri Jun 25 15:33:12 2004 UTC revision 1.2 by dagobah, Fri Jun 25 16:40:56 2004 UTC
# Line 1  Line 1 
1  import re  import re, pg
2  from CRC import do_crc  from CRC import do_crc
3  from binascii import unhexlify  from select import select
4    
5  asynchronous_responses = [      '400', '401', # door open/closed  asynchronous_responses = [      '400', '401', # door open/closed
6                                  '610',        # switches changed                                  '610',        # switches changed
7                                    '200', '201', '202', '203', '204', '205', '206',
8                                    '207', '208', '209', '211', # key presses
9                           ]                           ]
10    DOOR = 1
11    SWITCH = 2
12    KEY = 3
13    
14  class VendingMachine:  class VendingMachine:
15          def __init__(self, rfh, wfh):          def __init__(self, rfh, wfh):
16                    self.events = []
17                  self.secret = 'AAAAAAAAAAAAAAAA'                  self.secret = 'AAAAAAAAAAAAAAAA'
18                  self.rfh = rfh                  self.rfh = rfh
19                  self.wfh = wfh                  self.wfh = wfh
# Line 21  class VendingMachine: Line 27  class VendingMachine:
27                  code = ''                  code = ''
28                  while code != '000':                  while code != '000':
29                          (code, _) = self.get_response()                          (code, _) = self.get_response()
30                    self.get_switches()
31    
32          def await_prompt(self):          def await_prompt(self):
33                  self.wfh.flush()                  self.wfh.flush()
# Line 39  class VendingMachine: Line 46  class VendingMachine:
46                                          self.challenge = None                                          self.challenge = None
47                                          return                                          return
48                                  if re.search('^[0-9a-fA-F]{4}$', prefix):                                  if re.search('^[0-9a-fA-F]{4}$', prefix):
49                                          self.challenge = unhexlify(prefix)                                          self.challenge = int(prefix, 16)
50                                          return                                          return
51    
52          def get_response(self):          def get_response(self):
# Line 58  class VendingMachine: Line 65  class VendingMachine:
65                                  self.await_prompt()                                  self.await_prompt()
66                                  return (code, text)                                  return (code, text)
67    
68            def get_switches(self):
69                    self.wfh.write('S\n')
70                    (code, text) = self.get_response()
71                    if code != '600':
72                            return (False, code, text)
73                    self.interpret_switches(text)
74                    return (True, code, text)
75    
76            def interpret_switches(self, text):
77                    self.switches = (int(text[0:2], 16) << 8) | int(text[3:5], 16)
78    
79          def handle_event(self, code, text):          def handle_event(self, code, text):
80                  pass                  if code == '400':
81                            self.events.append((DOOR, 0))
82                    elif code == '401':
83                            self.events.append((DOOR, 1))
84                    elif code == '610':
85                            self.events_append((SWITCH, None))
86                            self.interpret_switches(text)
87                    elif code[0] == '2':
88                            self.events.append((KEY, int(code[1:3])))
89                    else:
90                            sys.stderr.write('WARNING: Unhandled event! (%s %s)\n'%(code,text))
91    
92          def authed_message(self, message):          def authed_message(self, message):
93                  if self.challenge == None:                  if self.challenge == None:
# Line 79  class VendingMachine: Line 107  class VendingMachine:
107                          return (False, 'Invalid item requested (%s)'%item)                          return (False, 'Invalid item requested (%s)'%item)
108                  self.wfh.write(self.authed_message(('V%s\n'%item)+'\n'))                  self.wfh.write(self.authed_message(('V%s\n'%item)+'\n'))
109                  (code, string) = self.get_response()                  (code, string) = self.get_response()
110                  return (code, string)                  return (code == '100', code, string)
111    
112          def beep(self, duration = None, synchronous = True):          def beep(self, duration = None, synchronous = True):
113                  msg = 'B'                  msg = 'B'
# Line 111  class VendingMachine: Line 139  class VendingMachine:
139                  (code, string) = self.get_response()                  (code, string) = self.get_response()
140                  return (code == '300', code, string)                  return (code == '300', code, string)
141    
142            def next_event(self):
143                    if len(self.events) > 0:
144                            ret = self.events[0]
145                            del self.events[0]
146                            return ret
147                    return None
148    
149            def wait_for_events(self, timeout = None):
150                    (r, _, _) = select([self.rfh], [], [], timeout)
151                    if not r: return False
152                    event_added = False
153                    while True:
154                        r.get_response()
155                        (r, _, _) = select([self.rfh], [], [], 0)
156                        if not r: return event_added

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

Managed by UCC Webmasters ViewVC Help
Powered by ViewVC 1.1.26