From e8a09d141c7bbb875baa2e45ec08cf8f99c1fe94 Mon Sep 17 00:00:00 2001 From: Bernard Blackham Date: Sun, 27 Jun 2004 12:55:08 +0000 Subject: [PATCH] Perhaps a little more sensibility. --- sql-edition/servers/VendServer.py | 309 +++++++++++++++--------------- 1 file changed, 155 insertions(+), 154 deletions(-) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 35d5d33..09bfe66 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -1,8 +1,10 @@ #!/usr/bin/python # vim:ts=4 -import sys, os, string, time, re, pwd +import sys, os, string, re, pwd import pg +from time import time, sleep +from popen2 import popen2 from LATClient import LATClient from VendingMachine import VendingMachine from ConfigParser import ConfigParser @@ -87,13 +89,41 @@ def door_open_mode(vending_machine): if event == DOOR: if params == 1: # door closed v.display("BYE BYE!") - time.sleep(1) + sleep(1) return def center(str): LEN = 10 return ' '*((LEN-len(str))/2)+str +class MessageKeeper: + def __init__(self, vendie): + 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: + 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] + if __name__ == '__main__': cp = ConfigParser() cp.read('/etc/dispense/servers.conf') @@ -105,180 +135,151 @@ if __name__ == '__main__': ServiceName = cp.get('VendingMachine', 'ServiceName') ServicePassword = cp.get('VendingMachine', 'Password') # Open vending machine via LAT - latclient = LATClient(service = ServiceName, password = ServicePassword) - (rfh, wfh) = latclient.get_fh() + if 0: + latclient = LATClient(service = ServiceName, password = ServicePassword) + (rfh, wfh) = latclient.get_fh() + else: + #(rfh, wfh) = popen2('../../virtualvend/vvend.py') + import socket + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) + sock.connect(('localhost', 5150)) + rfh = sock.makefile('r') + wfh = sock.makefile('w') v = VendingMachine(rfh, wfh) print 'PING is', v.ping() - #print 'BEEP is', v.beep() - #print 'VEND 11 is', v.vend('11') - #print 'SILENCE is', v.silence() - #print 'DISPLAY is', v.display('WELCOME') - print 'S is', v.get_switches() db = DispenseDatabase(v, DBServer, DBName, DBUser, DBPassword) - db.process_requests() cur_user = '' cur_pin = '' cur_selection = '' - scrolling_message = [GREETING] - scrolling_wraps = False - need_repaint = True - timeout = None - last_tick = time.time() + mk = MessageKeeper(v) + mk.set_message(GREETING) + logout_timeout = None + last_timeout_refresh = None while True: - if time.time() > last_tick+1: - if timeout != None and timeout > 0: timeout -= 1 - if len(scrolling_message) > 0: - need_repaint = True - last_tick = time.time() - if need_repaint and len(scrolling_message) > 0: - v.display(scrolling_message[0]) - if scrolling_wraps: - scrolling_message.append(scrolling_message[0]) - del scrolling_message[0] - need_repaint = False - if timeout == 0: - timeout = None + db.handle_events() + + if logout_timeout != None: + time_left = logout_timeout - time() + if time_left < 10 and last_timeout_refresh > time_left: + mk.set_message('LOGOUT: '+str(int(time_left))) + last_timeout_refresh = int(time_left) + + if logout_timeout != None and logout_timeout - time() <= 0: + logout_timeout = None cur_user = '' cur_pin = '' cur_selection = '' - scrolling_message = [GREETING] - scrolling_wraps = False - need_repaint = True - continue + mk.set_message(GREETING) + + mk.update_display() - while True: - #print 'waiting for event' - e = v.next_event(0) + e = v.next_event(0) + if e == None: + e = v.next_event(0.1) if e == None: - #print 'waiting harder for event' - e = v.next_event(0.1) - if e == None: - #print 'no event. passing' - break - #print 'got event' - (event, params) = e - print e - if event == DOOR: - if params == 0: - door_open_mode(v); + continue + (event, params) = e + print e + if event == DOOR: + if params == 0: + door_open_mode(v); + cur_user = '' + cur_pin = '' + mk.set_message(GREETING) + elif event == SWITCH: + # don't care right now. + pass + elif event == KEY: + key = params + # complicated key handling here: + if len(cur_user) < 5: + if key == 11: cur_user = '' - cur_pin = '' - scrolling_message = [GREETING] - scrolling_wraps = False - need_repaint = True - elif event == SWITCH: - # don't care right now. - pass - elif event == KEY: - key = params - # complicated key handling here: - if len(cur_user) < 5: - if key == 11: + mk.set_message(GREETING) + continue + cur_user += chr(key + ord('0')) + mk.set_message('UID: '+cur_user) + if len(cur_user) == 5: + uid = int(cur_user) + if not has_good_pin(uid): + mk.set_messages( + [(center('INVALID'), False, 0.7), + (center('PIN'), False, 0.7), + (center('SETUP'), False, 1.0), + (GREETING, False, None)]) cur_user = '' - scrolling_message = [GREETING] - scrolling_wraps = False - need_repaint = True - continue - cur_user += chr(key + ord('0')) - scrolling_message = [] - v.display('UID: '+cur_user) - if len(cur_user) == 5: - uid = int(cur_user) - if not has_good_pin(uid): - scrolling_message = map(center, ['INVALID','PIN','SETUP',GREETING]) - scrolling_wraps = False - need_repaint = True - cur_user = '' - cur_pin = '' - continue cur_pin = '' - v.display('PIN: ') - scrolling_message = [] continue - elif len(cur_pin) < PIN_LENGTH: - if key == 11: - if cur_pin == '': - cur_user = '' - scrolling_message = [GREETING] - scrolling_wraps = False - need_repaint = True - continue - cur_pin = '' - v.display('PIN: ') - scrolling_message = [] + cur_pin = '' + mk.set_message('PIN: ') + continue + elif len(cur_pin) < PIN_LENGTH: + if key == 11: + if cur_pin == '': + cur_user = '' + mk.set_message(GREETING) continue - cur_pin += chr(key + ord('0')) - v.display('PIN: '+'X'*len(cur_pin)) - scrolling_message = [] - if len(cur_pin) == PIN_LENGTH: - username = verify_user_pin(int(cur_user), int(cur_pin)) - if username: - v.beep(0, False) - cur_selection = '' - - scrolling_message = [' WELCOME ', username] - scrolling_message.append('OR A SNACK') - scrolling_wraps = True - need_repaint = True - continue - else: - v.beep(40, False) - scrolling_message = [' BAD PIN ', ' SORRY ', GREETING] - scrolling_wraps = False - need_repaint = True + cur_pin = '' + mk.set_message('PIN: ') + continue + cur_pin += chr(key + ord('0')) + mk.set_message('PIN: '+'X'*len(cur_pin)) + if len(cur_pin) == PIN_LENGTH: + username = verify_user_pin(int(cur_user), int(cur_pin)) + if username: + v.beep(0, False) + cur_selection = '' - cur_user = '' - cur_pin = '' - continue - elif len(cur_selection) == 0: - if key == 11: - cur_pin = '' + 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) + continue + else: + v.beep(40, False) + mk.set_messages( + [(center('BAD PIN'), False, 1.0), + (center('SORRY'), False, 0.5), + (GREETING, False, None)]) cur_user = '' - cur_selection = '' - v.display('BYE!') - time.sleep(0.5) - scrolling_message = [GREETING] - scrolling_wraps = False - need_repaint = True + cur_pin = '' continue + elif len(cur_selection) == 0: + if key == 11: + cur_pin = '' + cur_user = '' + cur_selection = '' + v.display('BYE!') + sleep(0.5) + mk.set_message(GREETING) + continue + cur_selection += chr(key + ord('0')) + mk.set_message('SELECT: '+cur_selection) + elif len(cur_selection) == 1: + if key == 11: + cur_selection = '' + mk.set_message('SELECT: ') + continue + else: cur_selection += chr(key + ord('0')) - scrolling_message = [] - v.display('SELECT: '+cur_selection) - elif len(cur_selection) == 1: - if key == 11: - cur_selection = '' - scrolling_message = [] - v.display('SELECT: ') - continue + #make_selection(cur_selection) + # XXX this should move somewhere else: + if cur_selection == '55': + v.display('GOT DOOR?') + os.system('su - "%s" -c "dispense door"'%username) + elif cur_selection[1] == '8': + v.display('GOT COKE?') + os.system('su - "%s" -c "dispense %s"'%(username, cur_selection[0])) else: - cur_selection += chr(key + ord('0')) - #make_selection(cur_selection) - # XXX this should move somewhere else: - if cur_selection == '55': - v.display('GOT DOOR?') - os.system('su - "%s" -c "dispense door"'%username) - elif cur_selection[1] == '8': - v.display('GOT COKE?') - os.system('su - "%s" -c "dispense %s"'%(username, cur_selection[0])) - else: - v.display('HERES A '+cur_selection) - v.vend(cur_selection) - time.sleep(0.5) - v.display('THANK YOU') - time.sleep(0.5) - cur_selection = '' - scrolling_message = [ - 'LOGOUT: 5', - 'LOGOUT: 4', - 'LOGOUT: 3', - 'LOGOUT: 2', - 'LOGOUT: 1', - 'BYE BYE!'] - timeout = 7 - scrolling_wraps = True - need_repaint = True - - db.handle_events() + v.display('HERES A '+cur_selection) + v.vend(cur_selection) + sleep(0.5) + v.display('THANK YOU') + sleep(0.5) + cur_selection = '' + logout_timeout = time() + 10 -- 2.20.1