+ if not self.dispense.addCard(card_id):
+ self.vstatus.mk.set_messages(
+ [(self.center('ALREADY'), False, 0.5),
+ (self.center('ENROLLED'), False, 0.5)])
+ else:
+ self.vstatus.mk.set_messages(
+ [(self.center('CARD'), False, 0.5),
+ (self.center('ENROLLED'), False, 0.5)])
+
+ def return_to_idle(self, event, params):
+ self.reset_idler()
+
+ """
+ Maps what to do when the state changes.
+ """
+ def create_state_table(self):
+ self.vstatus.state_table[(STATE_IDLE,TICK,1)] = self.handle_idle_tick
+ self.vstatus.state_table[(STATE_IDLE,KEY,1)] = self.handle_idle_key
+ self.vstatus.state_table[(STATE_IDLE,DOOR,1)] = self.handle_door_event
+ self.vstatus.state_table[(STATE_IDLE,MIFARE,1)] = self.handle_mifare_event
+
+ self.vstatus.state_table[(STATE_DOOR_OPENING,TICK,1)] = self.handle_door_idle
+ self.vstatus.state_table[(STATE_DOOR_OPENING,DOOR,1)] = self.handle_door_event
+ self.vstatus.state_table[(STATE_DOOR_OPENING,KEY,1)] = self.do_nothing
+ self.vstatus.state_table[(STATE_DOOR_OPENING,MIFARE,1)] = self.do_nothing
+
+ self.vstatus.state_table[(STATE_DOOR_CLOSING,TICK,1)] = self.return_to_idle
+ self.vstatus.state_table[(STATE_DOOR_CLOSING,DOOR,1)] = self.handle_door_event
+ self.vstatus.state_table[(STATE_DOOR_CLOSING,KEY,1)] = self.do_nothing
+ self.vstatus.state_table[(STATE_DOOR_CLOSING,MIFARE,1)] = self.do_nothing
+
+ self.vstatus.state_table[(STATE_GETTING_UID,TICK,1)] = self.handle_getting_uid_idle
+ self.vstatus.state_table[(STATE_GETTING_UID,DOOR,1)] = self.handle_door_event
+ self.vstatus.state_table[(STATE_GETTING_UID,KEY,1)] = self.handle_getting_uid_key
+ self.vstatus.state_table[(STATE_GETTING_UID,MIFARE,1)] = self.handle_mifare_event
+
+ self.vstatus.state_table[(STATE_GETTING_PIN,TICK,1)] = self.handle_getting_pin_idle
+ self.vstatus.state_table[(STATE_GETTING_PIN,DOOR,1)] = self.handle_door_event
+ self.vstatus.state_table[(STATE_GETTING_PIN,KEY,1)] = self.handle_getting_pin_key
+ self.vstatus.state_table[(STATE_GETTING_PIN,MIFARE,1)] = self.handle_mifare_event
+
+ self.vstatus.state_table[(STATE_GET_SELECTION,TICK,1)] = self.handle_get_selection_idle
+ self.vstatus.state_table[(STATE_GET_SELECTION,DOOR,1)] = self.handle_door_event
+ self.vstatus.state_table[(STATE_GET_SELECTION,KEY,1)] = self.handle_get_selection_key
+ self.vstatus.state_table[(STATE_GET_SELECTION,MIFARE,1)] = self.handle_mifare_add_user_event
+
+ self.vstatus.state_table[(STATE_GRANDFATHER_CLOCK,TICK,1)] = self.handle_idle_grandfather_tick
+ self.vstatus.state_table[(STATE_GRANDFATHER_CLOCK,TICK,2)] = self.handle_grandfather_tick
+ self.vstatus.state_table[(STATE_GRANDFATHER_CLOCK,DOOR,1)] = self.handle_door_event
+ self.vstatus.state_table[(STATE_GRANDFATHER_CLOCK,DOOR,2)] = self.handle_door_event
+ self.vstatus.state_table[(STATE_GRANDFATHER_CLOCK,KEY,1)] = self.do_nothing
+ self.vstatus.state_table[(STATE_GRANDFATHER_CLOCK,KEY,2)] = self.do_nothing
+ self.vstatus.state_table[(STATE_GRANDFATHER_CLOCK,MIFARE,1)] = self.handle_mifare_event
+
+ """
+ Get what to do on a state change.
+ """
+ def get_state_table_handler(self, state, event, counter):
+ return self.vstatus.state_table[(state,event,counter)]
+
+ def time_to_next_update(self):
+ idle_update = self.vstatus.time_of_next_idlestep - time()
+ if not self.vstatus.mk.done() and self.vstatus.mk.next_update is not None:
+ mk_update = self.vstatus.mk.next_update - time()
+ if mk_update < idle_update:
+ idle_update = mk_update
+ return idle_update
+
+ def run_forever(self, rfh, wfh, options, cf):
+ self.v = VendingMachine(rfh, wfh, USE_MIFARE)
+ self.dispense = Dispense()
+ self.vstatus = VendState(self.v)
+ self.create_state_table()
+
+ logging.debug('PING is ' + str(self.v.ping()))
+
+ self.setup_idlers()
+ self.reset_idler()
+
+ while True:
+ timeout = self.time_to_next_update()
+ (event, params) = self.v.next_event(timeout)
+ self.run_handler(event, params)
+
+ def run_handler(self, event, params):
+ handler = self.get_state_table_handler(self.vstatus.state,event,self.vstatus.counter)
+ if handler:
+ handler(event, params)