USE_DB = 0
import ConfigParser
-import sys, os, string, re, pwd, signal, math
+import sys, os, string, re, pwd, signal, math, syslog
import logging, logging.handlers
from traceback import format_tb
if USE_DB: import pg
from HorizScroll import HorizScroll
from random import random, seed
from Idler import GreetingIdler,TrainIdler,GrayIdler,StringIdler,ClockIdler,FortuneIdler,FileIdler,PipeIdler
+from SnackConfig import get_snacks, get_snack
import socket
from posix import geteuid
TICK = 4
-STATE_IDLE = 1
-STATE_DOOR_OPENING = 2
-STATE_DOOR_CLOSING = 3
-STATE_GETTING_UID = 4
-STATE_GETTING_PIN = 5
-STATE_GET_SELECTION = 6
-STATE_GRANDFATHER_CLOCK = 7
+(
+STATE_IDLE,
+STATE_DOOR_OPENING,
+STATE_DOOR_CLOSING,
+STATE_GETTING_UID,
+STATE_GETTING_PIN,
+STATE_GET_SELECTION,
+STATE_GRANDFATHER_CLOCK,
+) = range(1,8)
TEXT_SPEED = 0.8
IDLE_SPEED = 0.05
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 += '%s-(%sc)-%s8 '%(slot_name, price, slot_num)
+
+# we don't want to print snacks for now since it'll be too large
+# and there's physical bits of paper in the machine anyway - matt
+# try:
+# snacks = get_snacks()
+# except:
+# snacks = {}
+#
+# for slot, ( name, price ) in snacks.items():
+# choices += '%s8-%s (%sc) ' % ( slot, name, price )
+
choices += '55-DOOR '
- choices += 'OR A SNACK. '
+ choices += 'OR ANOTHER SNACK. '
choices += '99 TO READ AGAIN. '
choices += 'CHOICE? '
msg.append((choices, False, None))
GrayIdler(v,one="/",zero="\\",reorder=1),
StringIdler(v, text=str(math.e) + " "),
GrayIdler(v,one="X",zero="O",reorder=1),
- StringIdler(v, text=" I want some pizza - please call Pizza Hut Shenton Park on +61 8 9381 9979 - and order as Quinn - I am getting really hungry", repeat=False),
+ StringIdler(v, text=" I want some pizza - please call Pizza Hut Shenton Park on +61 8 9381 9979 [now closed? - MSH] - and order as Quinn - I am getting really hungry", repeat=False),
PipeIdler(v, "/usr/bin/getent", "passwd"),
FortuneIdler(v),
ClockIdler(v),
idler = GreetingIdler(v, t)
vstatus.time_of_next_idlestep = time()+idler.next()
vstatus.time_of_next_idler = None
+ vstatus.time_to_autologout = None
vstatus.change_state(STATE_IDLE, 1)
def choose_idler():
return
else:
vstatus.cur_selection += chr(key + ord('0'))
- make_selection(v,vstatus)
- vstatus.cur_selection = ''
- vstatus.time_to_autologout = time() + 8
- vstatus.last_timeout_refresh = None
+ if vstatus.cur_user:
+ make_selection(v,vstatus)
+ vstatus.cur_selection = ''
+ vstatus.time_to_autologout = time() + 8
+ vstatus.last_timeout_refresh = None
+ else:
+ # Price check mode.
+ price_check(v,vstatus)
+ vstatus.cur_selection = ''
+ vstatus.time_to_autologout = None
+ vstatus.last_timeout_refresh = None
def make_selection(v, vstatus):
# should use sudo here
logging.warning('user %s tried to dispense a bad door'%vstatus.username)
vstatus.mk.set_message(center('BAD DOOR'))
sleep(1)
- elif vstatus.cur_selection == '91':
+ elif vstatus.cur_selection == '81':
cookie(v)
elif vstatus.cur_selection == '99':
scroll_options(vstatus.username, vstatus.mk)
vstatus.cur_selection = ''
return
elif vstatus.cur_selection[1] == '8':
- v.display('GOT COKE?')
+ v.display('GOT DRINK?')
if ((os.system('su - "%s" -c "dispense %s"'%(vstatus.username, vstatus.cur_selection[0])) >> 8) != 0):
v.display('SEEMS NOT')
else:
- v.display('GOT COKE!')
+ v.display('GOT DRINK!')
else:
- v.display(vstatus.cur_selection+' - $1.00')
- if ((os.system('su - "%s" -c "dispense snack"'%(vstatus.username)) >> 8) == 0):
+ # first see if it's a named slot
+ try:
+ price, shortname, name = get_snack( vstatus.cur_selection )
+ except:
+ price, shortname, name = get_snack( '--' )
+ dollarprice = "$%.2f" % ( price / 100.0 )
+ v.display(vstatus.cur_selection+' - %s'%dollarprice)
+ exitcode = os.system('su - "%s" -c "dispense give oday %d"'%(vstatus.username, price)) >> 8
+ if (exitcode == 0):
+ # magic dispense syslog service
+ syslog.syslog(syslog.LOG_INFO | syslog.LOG_LOCAL4, "vended %s (slot %s) for %s" % (name, vstatus.cur_selection, vstatus.username))
v.vend(vstatus.cur_selection)
v.display('THANK YOU')
else:
+ syslog.syslog(syslog.LOG_INFO | syslog.LOG_LOCAL4, "failed vending %s (slot %s) for %s (code %d)" % (name, vstatus.cur_selection, vstatus.username, exitcode))
v.display('NO MONEY?')
sleep(1)
+def price_check(v, vstatus):
+ if vstatus.cur_selection[1] == '8':
+ v.display(center('SEE COKE'))
+ else:
+ # first see if it's a named slot
+ try:
+ price, shortname, name = get_snack( vstatus.cur_selection )
+ except:
+ price, shortname, name = get_snack( '--' )
+ dollarprice = "$%.2f" % ( price / 100.0 )
+ v.display(vstatus.cur_selection+' - %s'%dollarprice)
+
+
def handle_getting_pin_key(state, event, params, v, vstatus):
#print "handle_getting_pin_key (s,e,p)", state, " ", event, " ", params
key = params
def handle_getting_uid_key(state, event, params, v, vstatus):
#print "handle_getting_uid_key (s,e,p)", state, " ", event, " ", params
key = params
+
# complicated key handling here:
- if len(vstatus.cur_user) < 5:
+
+ if len(vstatus.cur_user) == 0 and key == 9:
+ vstatus.cur_selection = ''
+ vstatus.time_to_autologout = None
+ vstatus.mk.set_message('PRICECHECK')
+ sleep(0.5)
+ scroll_options('', vstatus.mk)
+ vstatus.change_state(STATE_GET_SELECTION)
+ return
+
+ if len(vstatus.cur_user) <8:
if key == 11:
vstatus.cur_user = ''
reset_idler(v, vstatus)
return
-
vstatus.cur_user += chr(key + ord('0'))
- vstatus.mk.set_message('UID: '+vstatus.cur_user)
+ #logging.info('dob: '+vstatus.cur_user)
+ if len(vstatus.cur_user) > 5:
+ vstatus.mk.set_message('>'+vstatus.cur_user)
+ else:
+ vstatus.mk.set_message('UID: '+vstatus.cur_user)
+
+ # Easter egg for nikita's birthday -- DGB
+ if len(vstatus.cur_user) == 8:
+ if vstatus.cur_user != "07051980":
+ vstatus.mk.set_messages(
+ [(' '*9+'ONE MORE TRY NiKiTa'+' '*10, False, 3)])
+ vstatus.cur_user = ''
+ reset_idler(v, vstatus, 3)
+ return
+
+ # Do stuff here
+ vstatus.mk.set_messages(
+ [(center(' GUILD MAILBOX NUMBER 64 '), False, 20),
+ (center(' GUILD MAILBOX NUMBER 64 '), False, 20),
+ (center(' GUILD MAILBOX NUMBER 64 '), False, 20),
+ (center(' GUILD MAILBOX NUMBER 64 '), False, 20)])
+
+ # Reset
+ vstatus.cur_user = ''
+ vstatus.cur_pin = ''
+ #reset_idler(v, vstatus, 10)
+ reset_idler(v, vstatus, 2)
+ return
+ # End easter egg part 1
if len(vstatus.cur_user) == 5:
uid = int(vstatus.cur_user)
+
+ # Easter egg for nikita's birthday -- DGB
+ if vstatus.cur_user == '07051':
+ if key == 11:
+ vstatus.cur_user = ''
+ reset_idler(v, vstatus)
+ return
+# vstatus.cur_user += chr(key + ord('0'))
+ logging.info(' == 5 dob: '+vstatus.cur_user)
+ vstatus.mk.set_message('>'+vstatus.cur_user)
+ return
+ # end easter egg part 2
+
if uid == 0:
logging.info('user '+vstatus.cur_user+' has a bad PIN')
pfalken="""
vstatus.change_state(STATE_IDLE,1)
def handle_door_idle(state, event, params, v, vstatus):
+ def twiddle(clock,v,wise = 2):
+ if (clock % 4 == 0):
+ v.display("-FEED ME-")
+ elif (clock % 4 == 1+wise):
+ v.display("\\FEED ME/")
+ elif (clock % 4 == 2):
+ v.display("-FEED ME-")
+ elif (clock % 4 == 3-wise):
+ v.display("/FEED ME\\")
+
# don't care right now.
- pass
+ now = int(time())
+
+ if ((now % 60 % 2) == 0):
+ twiddle(now, v)
+ else:
+ twiddle(now, v, wise=0)
+
def handle_door_event(state, event, params, v, vstatus):
- if params == 1: #door open
+ if params == 0: #door open
vstatus.change_state(STATE_DOOR_OPENING)
logging.warning("Entering open door mode")
v.display("-FEED ME-")
#door_open_mode(v);
vstatus.cur_user = ''
vstatus.cur_pin = ''
- elif params == 0: #door closed
+ elif params == 1: #door closed
vstatus.change_state(STATE_DOOR_CLOSING)
reset_idler(v, vstatus, 3)