From: Bernard Blackham Date: Sun, 27 Jun 2004 18:19:11 +0000 (+0000) Subject: A usable UI. X-Git-Url: https://git.ucc.asn.au/?p=zanchey%2Fdispense2.git;a=commitdiff_plain;h=49b70d20b2aad8be178f1002460947cc81228277 A usable UI. --- diff --git a/sql-edition/servers/HorizScroll.py b/sql-edition/servers/HorizScroll.py new file mode 100644 index 0000000..69644fb --- /dev/null +++ b/sql-edition/servers/HorizScroll.py @@ -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) + diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 09bfe66..c48d2bc 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -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]))