A usable UI.
authorBernard Blackham <dagobah@ucc.gu.uwa.edu.au>
Sun, 27 Jun 2004 18:19:11 +0000 (18:19 +0000)
committerBernard Blackham <dagobah@ucc.gu.uwa.edu.au>
Sun, 27 Jun 2004 18:19:11 +0000 (18:19 +0000)
sql-edition/servers/HorizScroll.py [new file with mode: 0644]
sql-edition/servers/VendServer.py

diff --git a/sql-edition/servers/HorizScroll.py b/sql-edition/servers/HorizScroll.py
new file mode 100644 (file)
index 0000000..69644fb
--- /dev/null
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+
+import string
+import sys
+import time
+
+class HorizScroll:
+       def __init__(self, text):
+               self.text = text
+               pass
+
+       def expand(self, padding=None, paddingchar=" ", dir=None, wraparound=False):
+               if len(self.text) <= 10:
+                       return [text]
+
+               if not padding:
+                       padding = len(self.text) / 2 + 1
+
+               format = "%-" + str(padding) + "." + str(padding) + "s"
+               pad = string.replace(format % " "," ",paddingchar)
+               padtext = self.text + pad
+               if wraparound:
+                       numiters = len(self.text) - 1
+               else:
+                       numiters = len(padtext)
+
+               expansion = []
+
+               for x in range(0,numiters):
+                         expansion.append("%-10.10s" % (padtext[x:] + padtext[:x]))
+               
+               if dir == -1:
+                       expansion.reverse()
+
+               return expansion
+
+if __name__ == '__main__':
+       h = HorizScroll("hello cruel world")
+       eh = h.expand()
+       while 1:
+               for x in eh:
+                       sys.stdout.write("\r")
+                       print "%-10.10s" % x,
+                       sys.stdout.flush()
+                       time.sleep(0.1)
+
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