import socket
from posix import geteuid
from OpenDispense import OpenDispense as Dispense
+import TracebackPrinter
CREDITS="""
This vending machine software brought to you by:
# If the user has just logged in, show them their balance
if welcome:
balance = self.dispense.getBalance()
- balance = balance[:-4] + '.' + balance[-4] + balance[-2:] # Work around display bug
-
msg = [(self.center('WELCOME'), False, TEXT_SPEED),
(self.center(self.dispense.getUsername()), False, TEXT_SPEED),
(self.center(balance), False, TEXT_SPEED),]
self.vstatus.last_timeout_refresh = int(time_left)
self.vstatus.cur_selection = ''
+ # Login timed out: Log out the current user.
if self.vstatus.time_to_autologout != None and self.vstatus.time_to_autologout - time() <= 0:
self.vstatus.time_to_autologout = None
self.vstatus.cur_user = ''
self.vstatus.cur_pin = ''
self.vstatus.cur_selection = ''
self._last_card_id = -1
+ self.dispense.logOut()
self.reset_idler()
### State fully logged out ... reset variables
self.vstatus.cur_pin = ''
self.vstatus.cur_user = ''
self.vstatus.cur_selection = ''
- _last_card_id = -1
+ self._last_card_id = -1
+ self.dispense.logOut()
self.vstatus.mk.set_messages([(self.center('BYE!'), False, 1.5)])
self.reset_idler(2)
return
if key == 11:
self.vstatus.cur_selection = ''
self.vstatus.time_to_autologout = None
+ self.dispense.logOut()
self.scroll_options(self.vstatus.username, self.vstatus.mk)
return
else:
self.vstatus.cur_selection += chr(key + ord('0'))
- if self.vstatus.cur_user:
+ if self.dispense.isLoggedIn():
self.make_selection()
self.vstatus.cur_selection = ''
self.vstatus.time_to_autologout = time() + 8
# Price check mode.
(name,price) = self.dispense.getItemInfo(self.vstatus.cur_selection)
dollarprice = "$%.2f" % ( price / 100.0 )
- dollarprice = dollarprice[:-4] + '.' + dollarprice[-4] + dollarprice[-2:] # Work around display bug
self.v.display( self.vstatus.cur_selection+' - %s'%dollarprice)
self.vstatus.cur_selection = ''
Triggered when the user has entered the id of something they would like to purchase.
"""
def make_selection(self):
+ logging.debug('Dispense item "%s"' % (self.vstatus.cur_selection,))
# should use sudo here
if self.vstatus.cur_selection == '55':
self.vstatus.mk.set_message('OPENSESAME')
exitcode = os.system('dispense -u "%s" snack:%s'%(self.vstatus.username, self.vstatus.cur_selection)) >> 8
if (exitcode == 0):
# magic dispense syslog service
- syslog.syslog(syslog.LOG_INFO | syslog.LOG_LOCAL4, "vended %s (slot %s) for %s" % (name, self.vstatus.cur_selection, self.vstatus.username))
(worked, code, string) = self.v.vend(self.vstatus.cur_selection)
if worked:
self.v.display('THANK YOU')
+ syslog.syslog(syslog.LOG_INFO | syslog.LOG_LOCAL4, "vended %s (slot %s) for %s" % (name, self.vstatus.cur_selection, self.vstatus.username))
else:
print "Vend Failed:", code, string
+ syslog.syslog(syslog.LOG_WARNING | syslog.LOG_LOCAL4, "vending %s (slot %s) for %s FAILED %r %r" % (name, self.vstatus.cur_selection, self.vstatus.username, code, string))
self.v.display('VEND FAIL')
elif (exitcode == 5): # RV_BALANCE
self.v.display('NO MONEY?')
if key == 11:
if self.vstatus.cur_pin == '':
self.vstatus.cur_user = ''
- slef.reset_idler()
+ self.dispense.logOut()
+ self.reset_idler()
return
self.vstatus.cur_pin = ''
self.vstatus.cur_pin += chr(key + ord('0'))
self.vstatus.mk.set_message('PIN: '+'X'*len(self.vstatus.cur_pin))
if len(self.vstatus.cur_pin) == PIN_LENGTH:
- self.dispense.authUserIdPin(self.vstatus.cur_user, self.vstatus.cur_pin)
- if self.dispense.getUsername():
+ if self.dispense.authUserIdPin(self.vstatus.cur_user, self.vstatus.cur_pin):
self.vstatus.username = self.dispense.getUsername()
self.v.beep(0, False)
self.vstatus.cur_selection = ''
if len(self.vstatus.cur_user) <8:
if key == 11:
self.vstatus.cur_user = ''
+ self.dispense.logOut()
self.reset_idler()
return
key = params
if key == 11:
self.vstatus.cur_user = ''
+ self.dispense.logOut()
self.reset_idler()
return
logging.warning("Entering open door mode")
self.v.display("-FEED ME-")
#door_open_mode(v);
+ self.dispense.logOut()
self.vstatus.cur_user = ''
self.vstatus.cur_pin = ''
elif params == 1: #door closed
self._last_card_id = card_id
- self.dispense.authMifareCard(card_id)
- logging.info('Mapped card id to uid %s'%self.dispense.getUsername())
- if not self.dispense.isLoggedIn():
+ if not self.dispense.authMifareCard(card_id):
self.v.beep(40, False)
self.vstatus.mk.set_messages(
[(self.center('BAD CARD'), False, 1.0),
self.reset_idler(2)
return
elif self.dispense.isDisabled():
+ logging.info('Mapped card id to uid %s'%self.dispense.getUsername())
self.v.beep(40, False)
self.vstatus.mk.set_messages(
[(self.center('ACCT DISABLED'), False, 1.0),
self.reset_idler(2)
return
else:
+ logging.info('Mapped card id to uid %s'%self.dispense.getUsername())
+ self.vstatus.cur_user = '----'
+ self.vstatus.username = self.dispense.getUsername()
self.vstatus.cur_selection = ''
self.vstatus.change_state(STATE_GET_SELECTION)
self.scroll_options(self.vstatus.username, self.vstatus.mk, True)
op.add_option('-v', '--verbose', dest='verbose', action='store_true', default=False, help='spit out lots of debug output')
op.add_option('-q', '--quiet', dest='quiet', action='store_true', default=False, help='only report errors')
op.add_option('--pid-file', dest='pid_file', metavar='FILE', default='', help='store daemon\'s pid in the given file')
+ op.add_option('--traceback-file', dest='traceback_file', default='', help='destination to print tracebacks when receiving SIGUSR1')
options, args = op.parse_args()
if len(args) != 0:
if options.daemon: become_daemon()
set_up_logging(options)
if options.pid_file != '': create_pid_file(options.pid_file)
-
+ if options.traceback_file != '': TracebackPrinter.traceback_init(options.traceback_file)
return options, config_opts
def clean_up_nicely(options, config_opts):
continue
# run_forever(rfh, wfh, options, config_opts)
-
+
try:
vserver = VendServer()
vserver.run_forever(rfh, wfh, options, config_opts)