Add sensibility
[uccvend-vendserver.git] / sql-edition / servers / VendServer.py
index 09bfe66..b1274da 100755 (executable)
@@ -1,13 +1,16 @@
 #!/usr/bin/python
 # vim:ts=4
 
 #!/usr/bin/python
 # vim:ts=4
 
+USE_DB = 0
+
 import sys, os, string, re, pwd
 import sys, os, string, re, pwd
-import pg
+if USE_DB: import pg
 from time import time, sleep
 from popen2 import popen2
 from LATClient import LATClient
 from VendingMachine import VendingMachine
 from ConfigParser import ConfigParser
 from time import time, sleep
 from popen2 import popen2
 from LATClient import LATClient
 from VendingMachine import VendingMachine
 from ConfigParser import ConfigParser
+from HorizScroll import HorizScroll
 
 GREETING = 'UCC SNACKS'
 PIN_LENGTH = 4
 
 GREETING = 'UCC SNACKS'
 PIN_LENGTH = 4
@@ -46,6 +49,32 @@ class DispenseDatabase:
                        self.process_requests()
                        notify = self.db.getnotify()
 
                        self.process_requests()
                        notify = self.db.getnotify()
 
+def scroll_options(username, mk, welcome = False):
+       if welcome:
+               msg = [(center('WELCOME'), False, 0.8),
+                          (center(username), False, 0.8)]
+       else:
+               msg = []
+       choices = ' '*10+'CHOICES: '
+       try:
+               coke_machine = file('/home/other/coke/coke_contents')
+               cokes = coke_machine.readlines()
+               coke_machine.close()
+       except:
+               cokes = []
+               pass
+       for c in cokes:
+               c = c.strip()
+               (slot_num, price, slot_name) = c.split(' ', 2)
+               if slot_name == 'dead': continue
+               choices += '%s8-%s (%sc) '%(slot_num, slot_name, price)
+       choices += '55-DOOR '
+       choices += 'OR A SNACK. '
+       choices += '99 TO READ AGAIN. '
+       choices += 'CHOICE?   '
+       msg.append((choices, False, None))
+       mk.set_messages(msg)
+
 def get_pin(uid):
        try:
                info = pwd.getpwuid(uid)
 def get_pin(uid):
        try:
                info = pwd.getpwuid(uid)
@@ -98,6 +127,8 @@ def center(str):
 
 class MessageKeeper:
        def __init__(self, vendie):
 
 class MessageKeeper:
        def __init__(self, vendie):
+               # Each element of scrolling_message should be a 3-tuple of
+               # ('message', True/False if it is to be repeated, time to display)
                self.scrolling_message = []
                self.v = vendie
                self.next_update = None
                self.scrolling_message = []
                self.v = vendie
                self.next_update = None
@@ -114,6 +145,18 @@ class MessageKeeper:
                if not forced and self.next_update != None and time() < self.next_update:
                        return
                if len(self.scrolling_message) > 0:
                if not forced and self.next_update != None and time() < self.next_update:
                        return
                if len(self.scrolling_message) > 0:
+                       if len(self.scrolling_message[0][0]) > 10:
+                               (m, r, t) = self.scrolling_message[0]
+                               a = []
+                               exp = HorizScroll(m).expand(padding = 0, wraparound = False)
+                               if t == None:
+                                       t = 0.1
+                               else:
+                                       t = t / len(exp)
+                               for x in exp:
+                                       a.append((x, r, t))
+                               del self.scrolling_message[0]
+                               self.scrolling_message = a + self.scrolling_message
                        newmsg = self.scrolling_message[0]
                        if newmsg[2] != None:
                                self.next_update = time() + newmsg[2]
                        newmsg = self.scrolling_message[0]
                        if newmsg[2] != None:
                                self.next_update = time() + newmsg[2]
@@ -124,6 +167,9 @@ class MessageKeeper:
                                self.scrolling_message.append(self.scrolling_message[0])
                        del self.scrolling_message[0]
 
                                self.scrolling_message.append(self.scrolling_message[0])
                        del self.scrolling_message[0]
 
+       def done(self):
+               return len(self.scrolling_message) == 0
+
 if __name__ == '__main__':
        cp = ConfigParser()
        cp.read('/etc/dispense/servers.conf')
 if __name__ == '__main__':
        cp = ConfigParser()
        cp.read('/etc/dispense/servers.conf')
@@ -148,7 +194,7 @@ if __name__ == '__main__':
        v = VendingMachine(rfh, wfh)
        print 'PING is', v.ping()
 
        v = VendingMachine(rfh, wfh)
        print 'PING is', v.ping()
 
-       db = DispenseDatabase(v, DBServer, DBName, DBUser, DBPassword)
+       if USE_DB: db = DispenseDatabase(v, DBServer, DBName, DBUser, DBPassword)
        cur_user = ''
        cur_pin = ''
        cur_selection = ''
        cur_user = ''
        cur_pin = ''
        cur_selection = ''
@@ -159,13 +205,14 @@ if __name__ == '__main__':
        last_timeout_refresh = None
 
        while True:
        last_timeout_refresh = None
 
        while True:
-               db.handle_events()
+               if USE_DB: db.handle_events()
 
                if logout_timeout != None:
                        time_left = logout_timeout - time()
 
                if logout_timeout != None:
                        time_left = logout_timeout - time()
-                       if time_left < 10 and last_timeout_refresh > time_left:
+                       if time_left < 5 and (last_timeout_refresh is None or last_timeout_refresh > time_left):
                                mk.set_message('LOGOUT: '+str(int(time_left)))
                                last_timeout_refresh = int(time_left)
                                mk.set_message('LOGOUT: '+str(int(time_left)))
                                last_timeout_refresh = int(time_left)
+                               cur_selection = ''
 
                if logout_timeout != None and logout_timeout - time() <= 0:
                        logout_timeout = None
 
                if logout_timeout != None and logout_timeout - time() <= 0:
                        logout_timeout = None
@@ -174,6 +221,11 @@ if __name__ == '__main__':
                        cur_selection = ''
                        mk.set_message(GREETING)
 
                        cur_selection = ''
                        mk.set_message(GREETING)
 
+               if logout_timeout and not mk.done(): logout_timeout = None
+               if len(cur_pin) == PIN_LENGTH and mk.done() and logout_timeout == None:
+                       # start autologout
+                       logout_timeout = time() + 15
+
                mk.update_display()
 
                e = v.next_event(0)
                mk.update_display()
 
                e = v.next_event(0)
@@ -232,13 +284,7 @@ if __name__ == '__main__':
                                        if username:
                                                v.beep(0, False)
                                                cur_selection = ''
                                        if username:
                                                v.beep(0, False)
                                                cur_selection = ''
-
-                                               msg = [(center('WELCOME'), False, 0.8),
-                                                          (center(username), False, 0.9)]
-                                               msg.append(('CHOICES :', True, 1))
-                                               msg.append(('55 - DOOR', True, 1))
-                                               msg.append(('OR A SNACK', True, 1))
-                                               mk.set_messages(msg)
+                                               scroll_options(username, mk, True)
                                                continue
                                        else:
                                                v.beep(40, False)
                                                continue
                                        else:
                                                v.beep(40, False)
@@ -263,7 +309,8 @@ if __name__ == '__main__':
                        elif len(cur_selection) == 1:
                                if key == 11:
                                        cur_selection = ''
                        elif len(cur_selection) == 1:
                                if key == 11:
                                        cur_selection = ''
-                                       mk.set_message('SELECT: ')
+                                       logout_timeout = None
+                                       scroll_options(username, mk)
                                        continue
                                else:
                                        cur_selection += chr(key + ord('0'))
                                        continue
                                else:
                                        cur_selection += chr(key + ord('0'))
@@ -272,6 +319,10 @@ if __name__ == '__main__':
                                        if cur_selection == '55':
                                                v.display('GOT DOOR?')
                                                os.system('su - "%s" -c "dispense door"'%username)
                                        if cur_selection == '55':
                                                v.display('GOT DOOR?')
                                                os.system('su - "%s" -c "dispense door"'%username)
+                                       elif cur_selection == '99':
+                                               scroll_options(username, mk)
+                                               cur_selection = ''
+                                               continue
                                        elif cur_selection[1] == '8':
                                                v.display('GOT COKE?')
                                                os.system('su - "%s" -c "dispense %s"'%(username, cur_selection[0]))
                                        elif cur_selection[1] == '8':
                                                v.display('GOT COKE?')
                                                os.system('su - "%s" -c "dispense %s"'%(username, cur_selection[0]))

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