/[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.2 by dagobah, Fri Jun 25 16:40:56 2004 UTC revision 1.6 by dagobah, Sun Jun 27 11:11:00 2004 UTC
# Line 1  Line 1 
1    # vim:ts=4
2  import re, pg  import re, pg
3  from CRC import do_crc  from CRC import do_crc
4  from select import select  from select import select
# Line 36  class VendingMachine: Line 37  class VendingMachine:
37                  s = ''                  s = ''
38                  while True:                  while True:
39                          s = self.rfh.read(1)                          s = self.rfh.read(1)
40                          if s == '': raise Exception                          if s == '': raise Exception('nothing read!')
41                          if s == '\n' or s == '\r':                          if s == '\n' or s == '\r':
42                                  state = 1                                  state = 1
43                                  prefix = ''                                  prefix = ''
# Line 49  class VendingMachine: Line 50  class VendingMachine:
50                                          self.challenge = int(prefix, 16)                                          self.challenge = int(prefix, 16)
51                                          return                                          return
52    
53          def get_response(self):          def get_response(self, async = False):
54                  self.wfh.flush()                  self.wfh.flush()
55                  while True:                  while True:
56                          s = ''                          s = ''
# Line 61  class VendingMachine: Line 62  class VendingMachine:
62                          text = s[4:]                          text = s[4:]
63                          if code in asynchronous_responses:                          if code in asynchronous_responses:
64                                  self.handle_event(code, text)                                  self.handle_event(code, text)
65                                    if async: return None
66                          else:                          else:
67                                  self.await_prompt()                                  self.await_prompt()
68                                  return (code, text)                                  return (code, text)
# Line 82  class VendingMachine: Line 84  class VendingMachine:
84                  elif code == '401':                  elif code == '401':
85                          self.events.append((DOOR, 1))                          self.events.append((DOOR, 1))
86                  elif code == '610':                  elif code == '610':
87                          self.events_append((SWITCH, None))                          self.events.append((SWITCH, None))
88                          self.interpret_switches(text)                          self.interpret_switches(text)
89                  elif code[0] == '2':                  elif code[0] == '2':
90                          self.events.append((KEY, int(code[1:3])))                          self.events.append((KEY, int(code[1:3])))
# Line 129  class VendingMachine: Line 131  class VendingMachine:
131                          msg += '%02x'%duration                          msg += '%02x'%duration
132                  self.wfh.write(msg+'\n')                  self.wfh.write(msg+'\n')
133                  (code, string) = self.get_response()                  (code, string) = self.get_response()
134                  # FIXME: workaround a bug in rom W. should be just: return (code == '500', code, string)                  return (code == '501', code, string)
                 return (code == '500' or code == '501', code, string)  
135    
136          def display(self, string):          def display(self, string):
137                  if len(string) > 10:                  if len(string) > 10:
# Line 139  class VendingMachine: Line 140  class VendingMachine:
140                  (code, string) = self.get_response()                  (code, string) = self.get_response()
141                  return (code == '300', code, string)                  return (code == '300', code, string)
142    
143          def next_event(self):          def next_event(self, timeout = None):
144                  if len(self.events) > 0:                  # we don't want to buffer in the serial port, so we get all the events
145                          ret = self.events[0]                  # we can ASAP.
146                          del self.events[0]                  if len(self.events) > 0: timeout = 0
                         return ret  
                 return None  
   
         def wait_for_events(self, timeout = None):  
                 (r, _, _) = select([self.rfh], [], [], timeout)  
                 if not r: return False  
                 event_added = False  
147                  while True:                  while True:
148                      r.get_response()                          (r, _, _) = select([self.rfh], [], [], timeout)
149                      (r, _, _) = select([self.rfh], [], [], 0)                          if r:
150                      if not r: return event_added                                  self.get_response(async = True)
151                                    timeout = 0
152                            else:
153                                    break
154                    if len(self.events) == 0: return None
155                    ret = self.events[0]
156                    del self.events[0]
157                    return ret

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

Managed by UCC Webmasters ViewVC Help
Powered by ViewVC 1.1.26