X-Git-Url: https://git.ucc.asn.au/?p=zanchey%2Fdispense2.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FVendingMachine.py;h=5fb5451e27fb186ddc05b7aed0bb8bc6e718e50d;hp=d86cc3f2635ae0effe09cc4c4405afc976d4c57c;hb=85544838adb7f38847d0c0368784abb547fc9066;hpb=42fa681e12eae7a3548fee665ac829bbbc278e0c diff --git a/sql-edition/servers/VendingMachine.py b/sql-edition/servers/VendingMachine.py index d86cc3f..5fb5451 100644 --- a/sql-edition/servers/VendingMachine.py +++ b/sql-edition/servers/VendingMachine.py @@ -2,6 +2,8 @@ import re from CRC import do_crc from select import select +import socket, logging +from time import time, sleep asynchronous_responses = [ '400', '401', # door open/closed '610', # switches changed @@ -11,6 +13,7 @@ asynchronous_responses = [ '400', '401', # door open/closed DOOR = 1 SWITCH = 2 KEY = 3 +TICK = 4 class VendingException(Exception): pass @@ -41,9 +44,9 @@ class VendingMachine: try: s = self.rfh.read(1) except socket.error: - print "Blah, seems DEC server has fallen over" raise VendingException('failed to read input from vending machine') if s == '': raise VendingException('nothing read!') + if (s != '#' and s != '%') and state == 1: prefix += s if s == '\n' or s == '\r': state = 1 prefix = '' @@ -87,16 +90,17 @@ class VendingMachine: def handle_event(self, code, text): if code == '400': - self.events.append((DOOR, 0)) - elif code == '401': self.events.append((DOOR, 1)) + elif code == '401': + self.events.append((DOOR, 0)) elif code == '610': - self.events.append((SWITCH, None)) + # NOP this. Nothing handles this yet. + #self.events.append((SWITCH, None)) self.interpret_switches(text) elif code[0] == '2': self.events.append((KEY, int(code[1:3]))) else: - sys.stderr.write('WARNING: Unhandled event! (%s %s)\n'%(code,text)) + logging.warning('Unhandled event! (%s %s)\n'%(code,text)) def authed_message(self, message): if self.challenge == None: @@ -114,7 +118,7 @@ class VendingMachine: def vend(self, item): if not re.search('^[0-9][0-9]$', item): return (False, 'Invalid item requested (%s)'%item) - self.wfh.write(self.authed_message(('V%s\n'%item)+'\n')) + self.wfh.write(self.authed_message(('V%s'%item))+'\n') (code, string) = self.get_response() return (code == '100', code, string) @@ -143,6 +147,7 @@ class VendingMachine: def display(self, string): if len(string) > 10: string = string[0:10] + string = re.sub('(.)\.', lambda match: '.'+match.group(1), string) self.wfh.write('D'+string+'\n') (code, string) = self.get_response() return (code == '300', code, string) @@ -150,6 +155,7 @@ class VendingMachine: def next_event(self, timeout = None): # we don't want to buffer in the serial port, so we get all the events # we can ASAP. + if timeout < 0: timeout = 0 if len(self.events) > 0: timeout = 0 while True: (r, _, _) = select([self.rfh], [], [], timeout) @@ -158,7 +164,7 @@ class VendingMachine: timeout = 0 else: break - if len(self.events) == 0: return None + if len(self.events) == 0: return (TICK, time()) ret = self.events[0] del self.events[0] return ret