X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FVendServer.py;h=8c5ab7323fca2abab4688a8c66294f1881d8173c;hp=02d5f9b1af93aac68362f9410c4aebbe406da76d;hb=c76c74d4824b3a3ddf8d31dceae09a63bc083969;hpb=b52f37832bb59523d63967cad0e381300b02879d diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 02d5f9b..8c5ab73 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -4,20 +4,38 @@ USE_DB = 0 import ConfigParser -import sys, os, string, re, pwd, signal +import sys, os, string, re, pwd, signal, math import logging, logging.handlers from traceback import format_tb if USE_DB: import pg from time import time, sleep from popen2 import popen2 -from LATClient import LATClient, LATClientException +#from LATClient import LATClient, LATClientException +from SerialClient import SerialClient, SerialClientException from VendingMachine import VendingMachine, VendingException +from MessageKeeper import MessageKeeper from HorizScroll import HorizScroll from random import random, seed -from Idler import TrainIdler,GrayIdler +from Idler import TrainIdler,GrayIdler,StringIdler,ClockIdler,FortuneIdler,FileIdler import socket from posix import geteuid +CREDITS=""" +This vending machine software brought to you by: +Bernard Blackham +Mark Tearle +Nick Bannon +Cameron Patrick +and a collective of hungry alpacas. + + + +For a good time call +61 8 6488 3901 + + + +""" + GREETING = 'UCC SNACKS' PIN_LENGTH = 4 @@ -164,50 +182,58 @@ def center(str): LEN = 10 return ' '*((LEN-len(str))/2)+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 - - def set_message(self, string): - self.scrolling_message = [(string, False, None)] - self.update_display(True) - - def set_messages(self, strings): - self.scrolling_message = strings - self.update_display(True) - - def update_display(self, forced = False): - 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 = 0, wraparound = True) - 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] - else: - self.next_update = None - self.v.display(self.scrolling_message[0][0]) - if self.scrolling_message[0][1]: - self.scrolling_message.append(self.scrolling_message[0]) - del self.scrolling_message[0] - def done(self): - return len(self.scrolling_message) == 0 + +idlers = [] +idler = None + +def setup_idlers(v): + global idlers, idler + idlers = [ + GrayIdler(v), + StringIdler(v, text="Kill 'em all", repeat=False), + GrayIdler(v,one="*",zero="-"), + StringIdler(v, text=CREDITS), + GrayIdler(v,one="/",zero="\\"), + FileIdler(v, '/etc/passwd'), + GrayIdler(v,one="X",zero="O"), + FileIdler(v, '/usr/share/common-licenses/GPL-2'), + GrayIdler(v,one="*",zero="-",reorder=1), + StringIdler(v, text=str(math.pi) + " "), + GrayIdler(v,one="/",zero="\\",reorder=1), + StringIdler(v, text=str(math.e) + " "), + GrayIdler(v,one="X",zero="O",reorder=1), + FortuneIdler(v), + ClockIdler(v), + StringIdler(v), + TrainIdler(v), + ] + disabled = [ + ] + idler = choose_idler() + +def choose_idler(): + global idler + iiindex = 0 + + if idler: + iiindex = idlers.index(idler) + + iilen = len(idlers) + + move = int(random()*len(idlers)) + 1 + + while move >= 0: + idler = idlers[( (iiindex + 1) % iilen)] + move = move - idler.affinity() + + idler.reset() + +def idle_step(): + global idler + if idler.finished(): + choose_idler() + idler.next() def run_forever(rfh, wfh, options, cf): v = VendingMachine(rfh, wfh) @@ -221,9 +247,7 @@ def run_forever(rfh, wfh, options, cf): mk = MessageKeeper(v) mk.set_message(GREETING) time_to_autologout = None - #idler = TrainIdler(v) - #idler = GrayIdler(v) - idler = GrayIdler(v,one="*",zero="-") + setup_idlers(v) time_to_idle = None last_timeout_refresh = None @@ -254,15 +278,20 @@ def run_forever(rfh, wfh, options, cf): # start autologout time_to_autologout = time() + 15 - if time_to_idle == None and cur_user == '': time_to_idle = time() + 60 - if time_to_idle != None and cur_user != '': time_to_idle = None - if time_to_idle is not None and time() > time_to_idle: idler.next() + if time_to_idle == None and cur_user == '': + time_to_idle = time() + 5 + choose_idler() + if time_to_idle is not None and cur_user != '': time_to_idle = None + if time_to_idle is not None and time() > time_to_idle: idle_step() + if time_to_idle is not None and time() > time_to_idle + 300: + time_to_idle = time() + choose_idler() mk.update_display() e = v.next_event(0) if e == None: - e = v.next_event(0.1) + e = v.next_event(0.05) if e == None: continue time_to_idle = None @@ -388,7 +417,11 @@ def run_forever(rfh, wfh, options, cf): time_to_autologout = time() + 8 def connect_to_vend(options, cf): - # Open vending machine via LAT? + # Open vending machine via serial. + logging.info('Connecting to vending machine using serial') + serialclient = SerialClient(port = '/dev/ttyS1', baud = 9600) + return serialclient.get_fh() + if options.use_lat: logging.info('Connecting to vending machine using LAT') latclient = LATClient(service = cf.ServiceName, password = cf.ServicePassword, server_name = cf.ServerName, connect_password = cf.ConnectPassword, priv_password = cf.PrivPassword) @@ -518,21 +551,18 @@ def become_daemon(): os.dup2(fd, 0) os.dup2(fd, 1) os.dup2(fd, 2) - logging.debug('about to fork') try: if os.fork() != 0: - logging.debug('in parent process: dying') sys.exit(0) - logging.debug('back from fork') os.setsid() except OSError, e: - logging.critical('failed to fork: '+e) + raise SystemExit('failed to fork: '+str(e)) def do_vend_server(options, config_opts): while True: try: rfh, wfh = connect_to_vend(options, config_opts) - except (LATClientException, socket.error), e: + except (SerialClientException, socket.error), e: (exc_type, exc_value, exc_traceback) = sys.exc_info() del exc_traceback logging.error("Connection error: "+str(exc_type)+" "+str(e)) @@ -559,6 +589,8 @@ if __name__ == '__main__': clean_up_nicely(options, config_opts) logging.warning("Vend Server stopped") break + except SystemExit: + break except: (exc_type, exc_value, exc_traceback) = sys.exc_info() tb = format_tb(exc_traceback, 20)