/[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.18 by dagobah, Fri Mar 2 12:33:13 2007 UTC revision 1.23 by zanchey, Sat Apr 9 03:29:12 2011 UTC
# Line 4  from CRC import do_crc Line 4  from CRC import do_crc
4  from select import select  from select import select
5  import socket, logging  import socket, logging
6  from time import time, sleep  from time import time, sleep
7    from MIFAREClient import MIFAREClient
8    
9  asynchronous_responses = [      '400', '401', # door open/closed  asynchronous_responses = [      '400', '401', # door open/closed
10                                  '610',        # switches changed                                  '610',        # switches changed
# Line 14  DOOR = 1 Line 15  DOOR = 1
15  SWITCH = 2  SWITCH = 2
16  KEY = 3  KEY = 3
17  TICK = 4  TICK = 4
18    MIFARE = 5
19    
20  class VendingException(Exception): pass  class VendingException(Exception): pass
21    
22  class VendingMachine:  class VendingMachine:
23          def __init__(self, rfh, wfh):          def __init__(self, rfh, wfh, use_mifare):
24                  self.events = []                  self.events = []
25                  self.secret = 'AAAAAAAAAAAAAAAA'                  # Secret
26                    self.secret = 'SN4CKZ0RZZZZZZZZ'
27                  self.rfh = rfh                  self.rfh = rfh
28                  self.wfh = wfh                  self.wfh = wfh
29                  self.challenge = None                  self.challenge = None
# Line 34  class VendingMachine: Line 37  class VendingMachine:
37                  while code != '000':                  while code != '000':
38                          code = self.get_response()[0]                          code = self.get_response()[0]
39                  self.get_switches()                  self.get_switches()
40                    if use_mifare:
41                            self.mifare = MIFAREClient()
42                            self.mifare_timeout = 0
43                    else:
44                            self.mifare = None
45    
46          def await_prompt(self):          def await_prompt(self):
47                  self.wfh.flush()                  self.wfh.flush()
48                  state = 1                  state = 1
49                    timeout = 0.5
50                  prefix = ''                  prefix = ''
51                  s = ''                  s = ''
52                    # mtearle - vending machine was dying wait for a response from
53                    # the hardware, suspect it was missing characters
54                    #
55                    # fixed by migration to pyserial - but future good place to start
56                  while True:                  while True:
57                          try:                          try:
58                                  s = self.rfh.read(1)                                  s = self.rfh.read(1)
# Line 155  class VendingMachine: Line 168  class VendingMachine:
168          def next_event(self, timeout = None):          def next_event(self, timeout = None):
169                  # we don't want to buffer in the serial port, so we get all the events                  # we don't want to buffer in the serial port, so we get all the events
170                  # we can ASAP.                  # we can ASAP.
171    
172                    # Never have no timeout...
173                    if timeout == None: timeout = 60*60*24*365
174    
175                    # Make sure we go through the loop at least once.
176                  if timeout < 0: timeout = 0                  if timeout < 0: timeout = 0
177                  if len(self.events) > 0: timeout = 0  
178                  while True:                  while timeout >= 0:
179                          (r, _, _) = select([self.rfh], [], [], timeout)                          this_timeout = min(timeout, 0.2)
180                            timeout -= this_timeout
181    
182                            (r, _, _) = select([self.rfh], [], [], this_timeout)
183                          if r:                          if r:
184                                  self.get_response(async = True)                                  self.get_response(async = True)
185                                  timeout = 0                                  timeout = 0
186                          else:  
187                            if self.mifare:
188                                    now = time()
189                                    if now > self.mifare_timeout:
190                                            self.mifare_timeout = now + 0.5
191                                            mifare_uid = self.mifare.get_card_id()
192                                            if mifare_uid != None:
193                                                    logging.info('Got MIFARE card id %s'%(repr(mifare_uid)))
194                                                    self.events.append((MIFARE, mifare_uid))
195                                                    timeout = 0
196                            if timeout == 0:
197                                  break                                  break
198    
199                  if len(self.events) == 0: return (TICK, time())                  if len(self.events) == 0: return (TICK, time())
200                  ret = self.events[0]                  ret = self.events[0]
201                  del self.events[0]                  del self.events[0]

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.23

Managed by UCC Webmasters ViewVC Help
Powered by ViewVC 1.1.26