X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FVendingMachine.py;h=d86cc3f2635ae0effe09cc4c4405afc976d4c57c;hp=52b66cf00e23afd827af54530e3a3c9f2a30ca37;hb=0e5e24625cd54e0010360d6c81fb94e7b395a069;hpb=a25bd42477d495307951c061a3c17630c7d92fb9 diff --git a/sql-edition/servers/VendingMachine.py b/sql-edition/servers/VendingMachine.py index 52b66cf..d86cc3f 100644 --- a/sql-edition/servers/VendingMachine.py +++ b/sql-edition/servers/VendingMachine.py @@ -1,5 +1,5 @@ # vim:ts=4 -import re, pg +import re from CRC import do_crc from select import select @@ -12,6 +12,8 @@ DOOR = 1 SWITCH = 2 KEY = 3 +class VendingException(Exception): pass + class VendingMachine: def __init__(self, rfh, wfh): self.events = [] @@ -27,7 +29,7 @@ class VendingMachine: self.wfh.write('PING\n') code = '' while code != '000': - (code, _) = self.get_response() + code = self.get_response()[0] self.get_switches() def await_prompt(self): @@ -36,8 +38,12 @@ class VendingMachine: prefix = '' s = '' while True: - s = self.rfh.read(1) - if s == '': raise Exception('nothing read!') + 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 == '\n' or s == '\r': state = 1 prefix = '' @@ -56,7 +62,8 @@ class VendingMachine: s = '' while s == '': s = self.rfh.readline() - if s == '': return None + if s == '': + raise VendingException('Input socket has closed!') s = s.strip('\r\n') code = s[0:3] text = s[4:] @@ -131,8 +138,7 @@ class VendingMachine: msg += '%02x'%duration self.wfh.write(msg+'\n') (code, string) = self.get_response() - # FIXME: workaround a bug in rom W. should be just: return (code == '500', code, string) - return (code == '500' or code == '501', code, string) + return (code == '501', code, string) def display(self, string): if len(string) > 10: @@ -149,6 +155,7 @@ class VendingMachine: (r, _, _) = select([self.rfh], [], [], timeout) if r: self.get_response(async = True) + timeout = 0 else: break if len(self.events) == 0: return None