X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FVendingMachine.py;h=52b66cf00e23afd827af54530e3a3c9f2a30ca37;hp=2574c6d36a23ffc9c82adb62200df5d30ebbae3c;hb=cd1d55b2aec4c7b1186c5ea2f241bca6c876e361;hpb=5b7731894d56c10c4deae2e23686742d790a8a27 diff --git a/sql-edition/servers/VendingMachine.py b/sql-edition/servers/VendingMachine.py index 2574c6d..52b66cf 100644 --- a/sql-edition/servers/VendingMachine.py +++ b/sql-edition/servers/VendingMachine.py @@ -1,3 +1,4 @@ +# vim:ts=4 import re, pg from CRC import do_crc from select import select @@ -36,7 +37,7 @@ class VendingMachine: s = '' while True: s = self.rfh.read(1) - if s == '': raise Exception + if s == '': raise Exception('nothing read!') if s == '\n' or s == '\r': state = 1 prefix = '' @@ -49,7 +50,7 @@ class VendingMachine: self.challenge = int(prefix, 16) return - def get_response(self): + def get_response(self, async = False): self.wfh.flush() while True: s = '' @@ -61,6 +62,7 @@ class VendingMachine: text = s[4:] if code in asynchronous_responses: self.handle_event(code, text) + if async: return None else: self.await_prompt() return (code, text) @@ -82,7 +84,7 @@ class VendingMachine: elif code == '401': self.events.append((DOOR, 1)) elif code == '610': - self.events_append((SWITCH, None)) + self.events.append((SWITCH, None)) self.interpret_switches(text) elif code[0] == '2': self.events.append((KEY, int(code[1:3]))) @@ -139,18 +141,17 @@ class VendingMachine: (code, string) = self.get_response() return (code == '300', code, string) - def next_event(self): - if len(self.events) > 0: - ret = self.events[0] - del self.events[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 + 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 len(self.events) > 0: timeout = 0 while True: - r.get_response() - (r, _, _) = select([self.rfh], [], [], 0) - if not r: return event_added + (r, _, _) = select([self.rfh], [], [], timeout) + if r: + self.get_response(async = True) + else: + break + if len(self.events) == 0: return None + ret = self.events[0] + del self.events[0] + return ret