A usable UI.
[uccvend-vendserver.git] / sql-edition / servers / VendServer.py
index 09bfe66..c48d2bc 100755 (executable)
@@ -8,6 +8,7 @@ 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
@@ -46,6 +47,26 @@ class DispenseDatabase:
                        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: '
+       coke_machine = file('/home/other/coke/coke_contents')
+       cokes = coke_machine.readlines()
+       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.'
+       msg.append((choices, False, None))
+       mk.set_messages(msg)
+
 def get_pin(uid):
        try:
                info = pwd.getpwuid(uid)
@@ -98,6 +119,8 @@ def center(str):
 
 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
@@ -114,6 +137,18 @@ class MessageKeeper:
                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 = 10)
+                               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]
@@ -124,6 +159,9 @@ class MessageKeeper:
                                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')
@@ -163,7 +201,7 @@ if __name__ == '__main__':
 
                if logout_timeout != None:
                        time_left = logout_timeout - time()
-                       if time_left < 10 and last_timeout_refresh > time_left:
+                       if time_left < 10 and (last_timeout_refresh > time_left or last_timeout_refresh is None):
                                mk.set_message('LOGOUT: '+str(int(time_left)))
                                last_timeout_refresh = int(time_left)
 
@@ -174,6 +212,11 @@ if __name__ == '__main__':
                        cur_selection = ''
                        mk.set_message(GREETING)
 
+               if logout_timeout and not mk.done(): logout_timeout = None
+               if cur_user and cur_pin and mk.done() and logout_timeout == None:
+                       # start autologout
+                       logout_timeout = time() + 10
+
                mk.update_display()
 
                e = v.next_event(0)
@@ -232,13 +275,7 @@ if __name__ == '__main__':
                                        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)
@@ -263,7 +300,7 @@ if __name__ == '__main__':
                        elif len(cur_selection) == 1:
                                if key == 11:
                                        cur_selection = ''
-                                       mk.set_message('SELECT: ')
+                                       scroll_options(username, mk)
                                        continue
                                else:
                                        cur_selection += chr(key + ord('0'))
@@ -272,6 +309,10 @@ if __name__ == '__main__':
                                        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]))

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