X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FVendServer.py;h=b173d3cce6ce5e740ee6ba1c951f1db71fd437af;hp=09bfe669ae1897a7df246c55ebe32ce3e5f1443d;hb=c9c2697965bbc2a88ed13e18c567792497b648f5;hpb=60850d87c4e40d87e4a7718517256fa4a1377583;ds=sidebyside diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 09bfe66..b173d3c 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -1,13 +1,16 @@ #!/usr/bin/python # vim:ts=4 +USE_DB = 0 + 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 HorizScroll import HorizScroll GREETING = 'UCC SNACKS' PIN_LENGTH = 4 @@ -46,6 +49,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 +121,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 +139,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 +161,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') @@ -148,7 +188,7 @@ if __name__ == '__main__': 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 = '' @@ -159,11 +199,11 @@ if __name__ == '__main__': 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 time_left < 10 and last_timeout_refresh > time_left: + if time_left < 10 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) @@ -174,6 +214,11 @@ if __name__ == '__main__': 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() + 10 + mk.update_display() e = v.next_event(0) @@ -232,13 +277,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 +302,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 +311,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]))