- 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
- while True:
- r.get_response()
- (r, _, _) = select([self.rfh], [], [], 0)
- if not r: return event_added
+ 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
+
+ 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
+
+ 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'%(str(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]
+ return ret