--- /dev/null
+#!/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)
+
from LATClient import LATClient
from VendingMachine import VendingMachine
from ConfigParser import ConfigParser
+from HorizScroll import HorizScroll
GREETING = 'UCC SNACKS'
PIN_LENGTH = 4
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)
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
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]
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 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)
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)
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)
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'))
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]))