Usable but ugly!
authorBernard Blackham <[email protected]>
Sat, 26 Jun 2004 09:38:39 +0000 (09:38 +0000)
committerBernard Blackham <[email protected]>
Sat, 26 Jun 2004 09:38:39 +0000 (09:38 +0000)
sql-edition/servers/VendServer.py
sql-edition/servers/VendingMachine.py

index 25a24b6..9d8e0ae 100755 (executable)
@@ -1,4 +1,5 @@
 #!/usr/bin/python
+# vim:ts=4
 
 import sys, os, string, time, re, pwd
 import pg
@@ -8,6 +9,10 @@ from VendingMachine import VendingMachine
 GREETING = 'UCC SNACKS'
 PIN_LENGTH = 4
 
+DOOR = 1
+SWITCH = 2
+KEY = 3
+
 class DispenseDatabase:
        def __init__(self, vending_machine):
                self.vending_machine = vending_machine
@@ -48,7 +53,7 @@ def get_pin(uid):
        try:
                s = os.stat(pinfile)
        except OSError:
-               return False
+               return None
        if s.st_mode & 077:
                return None
        try:
@@ -62,7 +67,7 @@ def get_pin(uid):
        return int(pinstr)
 
 def has_good_pin(uid):
-       return get_pin != None
+       return get_pin(uid) != None
 
 def verify_user_pin(uid, pin):
        if get_pin(uid) == pin:
@@ -111,8 +116,8 @@ if __name__ == '__main__':
        last_tick = time.time()
 
        while True:
-               if timeout != None and timeout > 0 and time.time() > last_tick+1:
-                       timeout -= 1
+               if time.time() > last_tick+1:
+                       if timeout != None and timeout > 0: timeout -= 1
                        if len(scrolling_message) > 0:
                                need_repaint = True
                if need_repaint and len(scrolling_message) > 0:
@@ -121,12 +126,22 @@ if __name__ == '__main__':
                                scrolling_message.append(scrolling_message[0])
                        del scrolling_message[0]
                        need_repaint = False
+               if timeout == 0:
+                       timeout = None
+                       cur_user = ''
+                       cur_pin = ''
+                       cur_selection = ''
+                       scrolling_message = [GREETING]
+                       scrolling_wraps = False
+                       need_repaint = True
+                       continue
 
                v.wait_for_events(1)
                while True:
                        e = v.next_event()
                        if e == None: break
                        (event, params) = e
+                       print e
                        if event == DOOR:
                                if params == 0:
                                        door_open_mode(v);
@@ -149,14 +164,20 @@ if __name__ == '__main__':
                                                need_repaint = True
                                                continue
                                        cur_user += chr(key + ord('0'))
+                                       scrolling_message = []
                                        v.display('UID: '+cur_user)
                                        if len(cur_user) == 5:
                                                uid = int(cur_user)
                                                if not has_good_pin(uid):
-                                                       v.display('PIN NO GOOD')
-                                                       time.sleep(1)
+                                                       scrolling_message = [' INVALID  ', '   PIN', '  `SETUP', GREETING]
+                                                       scrolling_wraps = False
+                                                       need_repaint = True
+                                                       cur_user = ''
+                                                       cur_pin = ''
                                                        continue
+                                               cur_pin = ''
                                                v.display('PIN: ')
+                                               scrolling_message = []
                                                continue
                                elif len(cur_pin) < PIN_LENGTH:
                                        if key == 11:
@@ -168,21 +189,24 @@ if __name__ == '__main__':
                                                        continue
                                                cur_pin = ''
                                                v.display('PIN: ')
+                                               scrolling_message = []
                                                continue
                                        cur_pin += chr(key + ord('0'))
                                        v.display('PIN: '+'X'*len(cur_pin))
+                                       scrolling_message = []
                                        if len(cur_pin) == PIN_LENGTH:
-                                               name = verify_user_pin(int(cur_user), int(cur_pin))
-                                               if name:
+                                               username = verify_user_pin(int(cur_user), int(cur_pin))
+                                               if username:
                                                        v.beep(0, False)
                                                        cur_selection = ''
 
-                                                       scrolling_message = [' WELCOME  ', name]
+                                                       scrolling_message = [' WELCOME  ', username]
                                                        scrolling_message.append('OR A SNACK')
                                                        scrolling_wraps = True
                                                        need_repaint = True
+                                                       continue
                                                else:
-                                                       v.beep(255, False)
+                                                       v.beep(40, False)
                                                        scrolling_message = [' BAD PIN  ', '  SORRY   ', GREETING]
                                                        scrolling_wraps = False
                                                        need_repaint = True
@@ -190,16 +214,54 @@ if __name__ == '__main__':
                                                        cur_user = ''
                                                        cur_pin = ''
                                                        continue
-                               elif len(cur_selection) < 2:
+                               elif len(cur_selection) == 0:
                                        if key == 11:
-                                               if cur_selection == '':
-                                                       cur_pin = ''
-                                                       cur_user = ''
-                                                       v.display(GREETING)
-                                                       continue
+                                               cur_pin = ''
+                                               cur_user = ''
+                                               cur_selection = ''
+                                               v.display('BYE!')
+                                               time.sleep(0.5)
+                                               scrolling_message = [GREETING]
+                                               scrolling_wraps = False
+                                               need_repaint = True
+                                               continue
+                                       cur_selection += chr(key + ord('0'))
+                                       scrolling_message = []
+                                       v.display('SELECT: '+cur_selection)
+                               elif len(cur_selection) == 1:
+                                       if key == 11:
+                                               cur_selection = ''
+                                               scrolling_message = []
+                                               v.display('SELECT: ')
+                                               continue
+                                       else:
                                                cur_selection += chr(key + ord('0'))
-                                               if len(cur_selection) == 2:
-                                                       make_selection(cur_selection)
+                                               #make_selection(cur_selection)
+                                               # XXX this should move somewhere else:
+                                               if cur_selection == '55':
+                                                       v.display('GOT DOOR?')
+                                                       os.system('su - "%s" -c "dispense door"'%username)
+                                               elif cur_selection[1] == '8':
+                                                       v.display('GOT COKE?')
+                                                       os.system('su - "%s" -c "dispense %s"'%(username, cur_selection[0]))
+                                               else:
+                                                       v.display('HERES A '+cur_selection)
+                                                       v.vend(cur_selection)
+                                               time.sleep(0.5)
+                                               v.display('THANK YOU')
+                                               time.sleep(0.5)
+                                               cur_selection = ''
+                                               scrolling_message = [
+                                                       'LOGOUT: 5',
+                                                       'LOGOUT: 4',
+                                                       'LOGOUT: 3',
+                                                       'LOGOUT: 2',
+                                                       'LOGOUT: 1',
+                                                       'BYE BYE!']
+                                               timeout = 7
+                                               scrolling_wraps = True
+                                               need_repaint = True
 
+                       v.wait_for_events(0)
 
                db.handle_events()
index 2574c6d..18f3067 100644 (file)
@@ -36,7 +36,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 +49,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 +61,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)
@@ -147,10 +148,11 @@ class VendingMachine:
                return None
 
        def wait_for_events(self, timeout = None):
+               if self.events: return True
                (r, _, _) = select([self.rfh], [], [], timeout)
                if not r: return False
                event_added = False
                while True:
-                   r.get_response()
+                   self.get_response(async = True)
                    (r, _, _) = select([self.rfh], [], [], 0)
                    if not r: return event_added

UCC git Repository :: git.ucc.asn.au