X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FVendingMachine.py;h=e96832a9f52b22c57c86c24a97d8afc8fcfd849f;hp=ee9b0634ab4d96e75aa83d68b396c8d7daf48309;hb=08a392617c464e6336d47ba37168c3a3a2529123;hpb=b0c89a2c388412848923d2eb5f6058b2c9ea5131 diff --git a/sql-edition/servers/VendingMachine.py b/sql-edition/servers/VendingMachine.py index ee9b063..e96832a 100644 --- a/sql-edition/servers/VendingMachine.py +++ b/sql-edition/servers/VendingMachine.py @@ -4,6 +4,7 @@ from CRC import do_crc from select import select import socket, logging from time import time, sleep +from MIFAREClient import MIFAREClient asynchronous_responses = [ '400', '401', # door open/closed '610', # switches changed @@ -14,13 +15,15 @@ DOOR = 1 SWITCH = 2 KEY = 3 TICK = 4 +MIFARE = 5 class VendingException(Exception): pass class VendingMachine: - def __init__(self, rfh, wfh): + def __init__(self, rfh, wfh, use_mifare): self.events = [] - self.secret = 'AAAAAAAAAAAAAAAA' + # Secret + self.secret = 'SN4CKZ0RZZZZZZZZ' self.rfh = rfh self.wfh = wfh self.challenge = None @@ -34,12 +37,22 @@ class VendingMachine: while code != '000': code = self.get_response()[0] self.get_switches() + if use_mifare: + self.mifare = MIFAREClient() + self.mifare_timeout = 0 + else: + self.mifare = None def await_prompt(self): self.wfh.flush() state = 1 + timeout = 0.5 prefix = '' s = '' + # mtearle - vending machine was dying wait for a response from + # the hardware, suspect it was missing characters + # + # fixed by migration to pyserial - but future good place to start while True: try: s = self.rfh.read(1) @@ -94,7 +107,8 @@ class VendingMachine: 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]))) @@ -154,15 +168,34 @@ 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. + + # Never have no timeout... + if timeout == None: timeout = 60*60*24*365 + + # Make sure we go through the loop at least once. if timeout < 0: timeout = 0 - if len(self.events) > 0: timeout = 0 - while True: - (r, _, _) = select([self.rfh], [], [], timeout) + + while timeout >= 0: + this_timeout = min(timeout, 0.2) + timeout -= this_timeout + + (r, _, _) = select([self.rfh], [], [], this_timeout) if r: self.get_response(async = True) timeout = 0 - else: + + if self.mifare: + now = time() + if now > self.mifare_timeout: + self.mifare_timeout = now + 0.5 + mifare_uid = self.mifare.get_card_id() + if mifare_uid != None: + logging.info('Got MIFARE card id %s'%(repr(mifare_uid))) + self.events.append((MIFARE, mifare_uid)) + timeout = 0 + if timeout == 0: break + if len(self.events) == 0: return (TICK, time()) ret = self.events[0] del self.events[0]