D'oh. This was slowing it down like hell.
[zanchey/dispense2.git] / sql-edition / servers / VendServer.py
index 25a24b6..35d5d33 100755 (executable)
@@ -1,17 +1,23 @@
 #!/usr/bin/python
 #!/usr/bin/python
+# vim:ts=4
 
 import sys, os, string, time, re, pwd
 import pg
 from LATClient import LATClient
 from VendingMachine import VendingMachine
 
 import sys, os, string, time, re, pwd
 import pg
 from LATClient import LATClient
 from VendingMachine import VendingMachine
+from ConfigParser import ConfigParser
 
 GREETING = 'UCC SNACKS'
 PIN_LENGTH = 4
 
 
 GREETING = 'UCC SNACKS'
 PIN_LENGTH = 4
 
+DOOR = 1
+SWITCH = 2
+KEY = 3
+
 class DispenseDatabase:
 class DispenseDatabase:
-       def __init__(self, vending_machine):
+       def __init__(self, vending_machine, host, name, user, password):
                self.vending_machine = vending_machine
                self.vending_machine = vending_machine
-               self.db = pg.DB(dbname = 'dispense', host = 'dispense.ucc.gu.uwa.edu.au', user = 'vendserver', passwd = 'revresdnev')
+               self.db = pg.DB(dbname = name, host = host, user = user, passwd = password)
                self.db.query('LISTEN vend_requests')
 
        def process_requests(self):
                self.db.query('LISTEN vend_requests')
 
        def process_requests(self):
@@ -48,7 +54,7 @@ def get_pin(uid):
        try:
                s = os.stat(pinfile)
        except OSError:
        try:
                s = os.stat(pinfile)
        except OSError:
-               return False
+               return None
        if s.st_mode & 077:
                return None
        try:
        if s.st_mode & 077:
                return None
        try:
@@ -62,7 +68,7 @@ def get_pin(uid):
        return int(pinstr)
 
 def has_good_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:
 
 def verify_user_pin(uid, pin):
        if get_pin(uid) == pin:
@@ -75,20 +81,31 @@ def door_open_mode(vending_machine):
        print "Entering open door mode"
        v.display("DOOR  OPEN")
        while True:
        print "Entering open door mode"
        v.display("DOOR  OPEN")
        while True:
-               v.wait_for_events(1)
-               while True:
-                       e = v.next_event()
-                       if e == None: break
-                       (event, params) = e
-                       if event == DOOR:
-                               if params == 1: # door closed
-                                       v.display("BYE BYE!")
-                                       time.sleep(1)
-                                       return
+               e = v.next_event()
+               if e == None: break
+               (event, params) = e
+               if event == DOOR:
+                       if params == 1: # door closed
+                               v.display("BYE BYE!")
+                               time.sleep(1)
+                               return
+
+def center(str):
+       LEN = 10
+       return ' '*((LEN-len(str))/2)+str
 
 if __name__ == '__main__':
 
 if __name__ == '__main__':
+       cp = ConfigParser()
+       cp.read('/etc/dispense/servers.conf')
+       DBServer = cp.get('Database', 'Server')
+       DBName = cp.get('Database', 'Name')
+       DBUser = cp.get('VendingMachine', 'DBUser')
+       DBPassword = cp.get('VendingMachine', 'DBPassword')
+
+       ServiceName = cp.get('VendingMachine', 'ServiceName')
+       ServicePassword = cp.get('VendingMachine', 'Password')
        # Open vending machine via LAT
        # Open vending machine via LAT
-       latclient = LATClient(service = 'VEND', password = 'dmscptd')
+       latclient = LATClient(service = ServiceName, password = ServicePassword)
        (rfh, wfh) = latclient.get_fh()
        v = VendingMachine(rfh, wfh)
        print 'PING is', v.ping()
        (rfh, wfh) = latclient.get_fh()
        v = VendingMachine(rfh, wfh)
        print 'PING is', v.ping()
@@ -98,7 +115,7 @@ if __name__ == '__main__':
        #print 'DISPLAY is', v.display('WELCOME')
        print 'S is', v.get_switches()
 
        #print 'DISPLAY is', v.display('WELCOME')
        print 'S is', v.get_switches()
 
-       db = DispenseDatabase(v)
+       db = DispenseDatabase(v, DBServer, DBName, DBUser, DBPassword)
        db.process_requests()
        cur_user = ''
        cur_pin = ''
        db.process_requests()
        cur_user = ''
        cur_pin = ''
@@ -111,22 +128,39 @@ if __name__ == '__main__':
        last_tick = time.time()
 
        while True:
        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 len(scrolling_message) > 0:
                                need_repaint = True
+                       last_tick = time.time()
                if need_repaint and len(scrolling_message) > 0:
                        v.display(scrolling_message[0])
                        if scrolling_wraps:
                                scrolling_message.append(scrolling_message[0])
                        del scrolling_message[0]
                        need_repaint = False
                if need_repaint and len(scrolling_message) > 0:
                        v.display(scrolling_message[0])
                        if scrolling_wraps:
                                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:
                while True:
-                       e = v.next_event()
-                       if e == None: break
+                       #print 'waiting for event'
+                       e = v.next_event(0)
+                       if e == None:
+                               #print 'waiting harder for event'
+                               e = v.next_event(0.1)
+                               if e == None:
+                                       #print 'no event. passing'
+                                       break
+                       #print 'got event'
                        (event, params) = e
                        (event, params) = e
+                       print e
                        if event == DOOR:
                                if params == 0:
                                        door_open_mode(v);
                        if event == DOOR:
                                if params == 0:
                                        door_open_mode(v);
@@ -149,14 +183,20 @@ if __name__ == '__main__':
                                                need_repaint = True
                                                continue
                                        cur_user += chr(key + ord('0'))
                                                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('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 = map(center, ['INVALID','PIN','SETUP',GREETING])
+                                                       scrolling_wraps = False
+                                                       need_repaint = True
+                                                       cur_user = ''
+                                                       cur_pin = ''
                                                        continue
                                                        continue
+                                               cur_pin = ''
                                                v.display('PIN: ')
                                                v.display('PIN: ')
+                                               scrolling_message = []
                                                continue
                                elif len(cur_pin) < PIN_LENGTH:
                                        if key == 11:
                                                continue
                                elif len(cur_pin) < PIN_LENGTH:
                                        if key == 11:
@@ -168,21 +208,24 @@ if __name__ == '__main__':
                                                        continue
                                                cur_pin = ''
                                                v.display('PIN: ')
                                                        continue
                                                cur_pin = ''
                                                v.display('PIN: ')
+                                               scrolling_message = []
                                                continue
                                        cur_pin += chr(key + ord('0'))
                                        v.display('PIN: '+'X'*len(cur_pin))
                                                continue
                                        cur_pin += chr(key + ord('0'))
                                        v.display('PIN: '+'X'*len(cur_pin))
+                                       scrolling_message = []
                                        if len(cur_pin) == PIN_LENGTH:
                                        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 = ''
 
                                                        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
                                                        scrolling_message.append('OR A SNACK')
                                                        scrolling_wraps = True
                                                        need_repaint = True
+                                                       continue
                                                else:
                                                else:
-                                                       v.beep(255, False)
+                                                       v.beep(40, False)
                                                        scrolling_message = [' BAD PIN  ', '  SORRY   ', GREETING]
                                                        scrolling_wraps = False
                                                        need_repaint = True
                                                        scrolling_message = [' BAD PIN  ', '  SORRY   ', GREETING]
                                                        scrolling_wraps = False
                                                        need_repaint = True
@@ -190,16 +233,52 @@ if __name__ == '__main__':
                                                        cur_user = ''
                                                        cur_pin = ''
                                                        continue
                                                        cur_user = ''
                                                        cur_pin = ''
                                                        continue
-                               elif len(cur_selection) < 2:
+                               elif len(cur_selection) == 0:
                                        if key == 11:
                                        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'))
                                                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
 
                db.handle_events()
 
                db.handle_events()

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