/[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.6 by dagobah, Sun Jun 27 11:11:00 2004 UTC revision 1.16 by mtearle, Tue Apr 5 09:55:01 2005 UTC
# Line 1  Line 1 
1  # vim:ts=4  # vim:ts=4
2  import re, pg  import re
3  from CRC import do_crc  from CRC import do_crc
4  from select import select  from select import select
5    import socket, logging
6    from time import time, sleep
7    
8  asynchronous_responses = [      '400', '401', # door open/closed  asynchronous_responses = [      '400', '401', # door open/closed
9                                  '610',        # switches changed                                  '610',        # switches changed
# Line 11  asynchronous_responses = [     '400', '401', Line 13  asynchronous_responses = [     '400', '401',
13  DOOR = 1  DOOR = 1
14  SWITCH = 2  SWITCH = 2
15  KEY = 3  KEY = 3
16    TICK = 4
17    
18    class VendingException(Exception): pass
19    
20  class VendingMachine:  class VendingMachine:
21          def __init__(self, rfh, wfh):          def __init__(self, rfh, wfh):
# Line 27  class VendingMachine: Line 32  class VendingMachine:
32                  self.wfh.write('PING\n')                  self.wfh.write('PING\n')
33                  code = ''                  code = ''
34                  while code != '000':                  while code != '000':
35                          (code, _) = self.get_response()                          code = self.get_response()[0]
36                  self.get_switches()                  self.get_switches()
37    
38          def await_prompt(self):          def await_prompt(self):
# Line 36  class VendingMachine: Line 41  class VendingMachine:
41                  prefix = ''                  prefix = ''
42                  s = ''                  s = ''
43                  while True:                  while True:
44                          s = self.rfh.read(1)                          try:
45                          if s == '': raise Exception('nothing read!')                                  s = self.rfh.read(1)
46                            except socket.error:
47                                    raise VendingException('failed to read input from vending machine')
48                            if s == '': raise VendingException('nothing read!')
49                            if (s != '#' and s != '%') and state == 1: prefix += s
50                          if s == '\n' or s == '\r':                          if s == '\n' or s == '\r':
51                                  state = 1                                  state = 1
52                                  prefix = ''                                  prefix = ''
# Line 56  class VendingMachine: Line 65  class VendingMachine:
65                          s = ''                          s = ''
66                          while s == '':                          while s == '':
67                                  s = self.rfh.readline()                                  s = self.rfh.readline()
68                                  if s == '': return None                                  if s == '':
69                                            raise VendingException('Input socket has closed!')
70                                  s = s.strip('\r\n')                                  s = s.strip('\r\n')
71                          code = s[0:3]                          code = s[0:3]
72                          text = s[4:]                          text = s[4:]
# Line 80  class VendingMachine: Line 90  class VendingMachine:
90    
91          def handle_event(self, code, text):          def handle_event(self, code, text):
92                  if code == '400':                  if code == '400':
                         self.events.append((DOOR, 0))  
                 elif code == '401':  
93                          self.events.append((DOOR, 1))                          self.events.append((DOOR, 1))
94                    elif code == '401':
95                            self.events.append((DOOR, 0))
96                  elif code == '610':                  elif code == '610':
97                          self.events.append((SWITCH, None))                          self.events.append((SWITCH, None))
98                          self.interpret_switches(text)                          self.interpret_switches(text)
99                  elif code[0] == '2':                  elif code[0] == '2':
100                          self.events.append((KEY, int(code[1:3])))                          self.events.append((KEY, int(code[1:3])))
101                  else:                  else:
102                          sys.stderr.write('WARNING: Unhandled event! (%s %s)\n'%(code,text))                          logging.warning('Unhandled event! (%s %s)\n'%(code,text))
103    
104          def authed_message(self, message):          def authed_message(self, message):
105                  if self.challenge == None:                  if self.challenge == None:
# Line 107  class VendingMachine: Line 117  class VendingMachine:
117          def vend(self, item):          def vend(self, item):
118                  if not re.search('^[0-9][0-9]$', item):                  if not re.search('^[0-9][0-9]$', item):
119                          return (False, 'Invalid item requested (%s)'%item)                          return (False, 'Invalid item requested (%s)'%item)
120                  self.wfh.write(self.authed_message(('V%s\n'%item)+'\n'))                  self.wfh.write(self.authed_message(('V%s'%item))+'\n')
121                  (code, string) = self.get_response()                  (code, string) = self.get_response()
122                  return (code == '100', code, string)                  return (code == '100', code, string)
123    
# Line 136  class VendingMachine: Line 146  class VendingMachine:
146          def display(self, string):          def display(self, string):
147                  if len(string) > 10:                  if len(string) > 10:
148                          string = string[0:10]                          string = string[0:10]
149                    string = re.sub('(.)\.', lambda match: '.'+match.group(1), string)
150                  self.wfh.write('D'+string+'\n')                  self.wfh.write('D'+string+'\n')
151                  (code, string) = self.get_response()                  (code, string) = self.get_response()
152                  return (code == '300', code, string)                  return (code == '300', code, string)
# Line 151  class VendingMachine: Line 162  class VendingMachine:
162                                  timeout = 0                                  timeout = 0
163                          else:                          else:
164                                  break                                  break
165                  if len(self.events) == 0: return None                  if len(self.events) == 0: return (TICK, time())
166                  ret = self.events[0]                  ret = self.events[0]
167                  del self.events[0]                  del self.events[0]
168                  return ret                  return ret

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.16

Managed by UCC Webmasters ViewVC Help
Powered by ViewVC 1.1.26