meta data for this page
  •  

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

courses:ct30a6000:exer_fsm_impl_result [2011/12/08 19:23] (current)
hevi created
Line 1: Line 1:
 +====== exer_fsm_impl Result Code ======
 +for [[exer_fsm_impl]]
 +
 +package: exer_fsm_impl
 +
 +**main.py**
 +<​code>​
 +import logging
 +log = logging.getLogger(__name__)
 +
 +import exer_fsm_impl.user as mu
 +import exer_fsm_impl.vending_machine as mvm
 +
 +def run():
 +  vm = mvm.VendingMachine()
 +  user = mu.User(vm)
 +  vm.set_user(user)
 +  user.run()
 +
 +if __name__ == '​__main__':​
 +  logging.basicConfig(level=logging.DEBUG)  ​
 +  run()
 +</​code>​
 +---------
 +
 +**interfaces.py**
 +<​code>​
 +class IFrontPanel(object):​
 +  '''​
 +  Interface to VendingMachine.
 +  User => VendingMachine
 +  '''​
 +  ​
 +  def insert_coin(self,​coin):​
 +    raise NotImplementedError()
 +  ​
 +  def return_coins(self):​
 +    raise NotImplementedError()
 +
 +  def Kola(self):
 +    raise NotImplementedError()
 +
 +  def Vissy(self):​
 +    raise NotImplementedError()
 +
 +  def Jaffa(self):​
 +    raise NotImplementedError()
 +
 +  def Muumi(self):​
 +    raise NotImplementedError()
 +
 +  def poweroff(self):​
 +    raise NotImplementedError()
 +
 +  def shutdown_timeout(self):​
 +    raise NotImplementedError()
 +
 +  # lets see if this is needed
 +  #def coins_ok(self):​
 +  #  raise NotImplementedError()
 +
 +class IUser(object):​
 +  ​
 +  def display(self,​text):​
 +    raise NotImplementedError()
 + 
 +  def error(self,​text):​
 +    raise NotImplementedError()
 +
 +  def delivery(self,​text):​
 +    raise NotImplementedError()
 +</​code>​
 +---------
 +
 +**user.py**
 +<​code>​
 +import cmd
 +import sys
 +
 +import logging
 +log = logging.getLogger(__name__)
 +
 +from exer_fsm_impl.interfaces import *
 +
 +class User(cmd.Cmd,​IUser):​
 +
 +  def __init__(self,​vm):​
 +    cmd.Cmd.__init__(self)
 +    self._vm = vm
 +
 +  def do_coins(self,​amount):​
 +    """​ coins <​money>​ -- Insert coins """​
 +    try:
 +      amount = float(amount)
 +    except ValueError, e:
 +      print "​Usage:​ coins <money as a real number>"​
 +      return  ​
 +    self._vm.insert_coin(amount)
 +
 +  def do_return(self,​arg):​
 +    """​ -- return money """​
 +    self._vm.return_coins()
 +    ​
 +  def do_kola(self,​arg):​
 +    """​ -- deliver Kola drink """​
 +    self._vm.Kola()
 +    ​
 +  def do_vissy(self,​arg):​
 +    """​ -- deliver Vissy drink """​
 +    self._vm.Vissy()
 +    ​
 +  def do_muumi(self,​arg):​
 +    """​ -- deliver Muumi drink """​
 +    self._vm.Muumi()
 +    ​
 +  def do_jaffa(self,​arg):​
 +    """​ -- deliver Jaffa drink """​
 +    self._vm.Jaffa()
 +    ​
 +  def do_poweroff(self,​arg):​
 +    """​ -- quit interaction """​
 +    self._vm.poweroff()
 +
 +  def display(self,​text):​
 +    print "[[ " + text + "​]]"​
 + 
 +  def error(self,​text):​
 +    print "Error !! " + text + " !!"
 +
 +  def delivery(self,​text):​
 +    print "​Deliver ==> " + text + " <​=="​
 +
 +  def run(self):
 +    log.debug("​User.run ..")
 +    self.cmdloop("​Vending Machine:"​)
 +</​code>​
 +---------
 +
 +**vending_machine.py**
 +<​code>​
 +import logging
 +log = logging.getLogger(__name__)
 +import threading
 +import sys
 +
 +from exer_fsm_impl.interfaces import *
 +
 +class VendingMachine(IFrontPanel):​
 +  ​
 +  ## States
 +  ​
 +  class State(object):​
 +    ​
 +    def name(self):
 +      raise NotImplementedError()
 +    ​
 +    def insert_coin(self,​ctx,​coin):​
 +      log.error("​insert_coin wrong state"​)
 +
 +    def return_coins(self,​ctx):​
 +      log.error("​return_coins wrong state"​) ​     ​
 +
 +    def Kola(self,​ctx):​
 +      log.error("​Kola wrong state"​) ​     ​
 +    ​
 +    def Vissy(self,​ctx):​
 +      log.error("​Vissy wrong state"​) ​     ​
 +
 +    def Jaffa(self,​ctx):​
 +      log.error("​Jaffa wrong state"​) ​     ​
 +
 +    def Muumi(self,​ctx):​
 +      log.error("​Muumi wrong state"​)
 +      ​
 +    def poweroff(self,​ctx):​
 +      ctx._user.delivery("​return coins " + 
 +                         ​str(ctx._money))
 +      ctx._money = 0
 +      ctx._user.display("​SHUTDOWN"​)
 +      ctx.changeState(ctx.SHUTDOWN)
 +      timer = threading.Timer(3,​ctx.shutdown_timeout)
 +      timer.start()
 +      ​
 +    def shutdown_timeout(self,​ctx):​
 +      log.error("​shutdown_timeout wrong state"​)
 +            ​
 +  class Idle(State):​
 +    ​
 +    def name(self):
 +      return "​IDLE"​
 +    ​
 +    def insert_coin(self,​ctx,​coin):​
 +      ctx._money += coin
 +      ctx._user.display("​Money:​ " + str(ctx._money)) ​     ​
 +      ctx.changeState(ctx.WF_COINS)  ​
 +
 +  class WfCoins(State):​
 +    ​
 +    def name(self):
 +      return "​WF_COINS"​
 +    ​
 +    def insert_coin(self,​ctx,​coin):​
 +      ctx._money += coin
 +      ctx._user.display("​Money:​ " + str(ctx._money)) ​     ​
 +      if ctx._money >= ctx._prize:
 +        ctx.changeState(ctx.WF_DRINK)
 +      else:
 +        ctx.changeState(ctx.WF_COINS) ​       ​
 +
 +    def return_coins(self,​ctx):​
 +      ctx._user.delivery("​return coins " + 
 +                         ​str(self._money))
 +      ctx._money = 0
 +      ctx.changeState(ctx.IDLE)
 +
 +  class WfDrink(State):​
 +    ​
 +    def name(self):
 +      return "​WF_DRINK"​
 +    ​
 +    def insert_coin(self,​ctx,​coin):​
 +      ctx._money += coin
 +      ctx._user.display("​Money:​ " + str(ctx._money))
 +      ctx.changeState(ctx.WF_DRINK)
 +
 +    def return_coins(self,​ctx):​
 +      ctx._user.delivery("​return coins " + 
 +                         ​str(self._money))
 +      ctx._money = 0
 +      ctx.changeState(ctx.IDLE)
 +
 +    def Kola(self,​ctx):​
 +      ctx._money -= ctx._prize
 +      ctx._user.delivery("​KOLA"​)
 +      ctx._user.delivery("​return coins " + 
 +                         ​str(ctx._money))
 +      ctx._money = 0
 +      ctx.changeState(ctx.IDLE)
 +    ​
 +    def Vissy(self,​ctx):​
 +      ctx._money -= ctx._prize
 +      ctx._user.delivery("​VISSY"​)
 +      ctx._user.delivery("​return coins " + 
 +                         ​str(ctx._money))
 +      ctx._money = 0
 +      ctx.changeState(ctx.IDLE)
 +
 +    def Jaffa(self,​ctx):​
 +      ctx._money -= ctx._prize ​     ​
 +      ctx._user.delivery("​JAFFA"​)
 +      ctx._user.delivery("​return coins " + 
 +                         ​str(ctx._money))
 +      ctx._money = 0
 +      ctx.changeState(ctx.IDLE)
 +
 +    def Muumi(self,​ctx):​
 +      ctx._money -= ctx._prize
 +      ctx._user.delivery("​MUUMI"​)
 +      ctx._user.delivery("​return coins " + 
 +                         ​str(ctx._money))
 +      ctx._money = 0
 +      ctx.changeState(ctx.IDLE)
 +
 +  class Shutdown(State):​
 +    ​
 +    def name(self):
 +      return "​SHUTDOWN"​
 +    ​
 +    def shutdown_timeout(self,​ctx):​
 +      ctx._user.display("​POWER OFF")
 +      sys.exit()
 +    ​
 +  ## Operations
 +
 +  def __init__(self):​
 +    self._user = None
 +    self._money = 0 # Money in the vending machine
 +    self._prize = 2.4 # Prize of the drink
 +    ## State
 +    self.IDLE = VendingMachine.Idle()
 +    self.WF_COINS = VendingMachine.WfCoins()
 +    self.WF_DRINK = VendingMachine.WfDrink()
 +    self.SHUTDOWN = VendingMachine.Shutdown()
 +    ## State variable and initial state
 +    self._state = self.IDLE
 +    ​
 +  def set_user(self,​user):​
 +    self._user = user
 +
 +  def changeState(self,​newState):​
 +    log.debug("​state change " + self._state.name() +
 +              " => " + newState.name())
 +    self._state = newState
 +
 +  ## Message delegation
 +  ​
 +  def insert_coin(self,​coin):​
 +    self._state.insert_coin(self,​ coin)
 +  ​
 +  def return_coins(self):​
 +    self._state.return_coins(self)
 +
 +  def Kola(self):
 +    self._state.Kola(self)
 +
 +  def Vissy(self):​
 +    self._state.Vissy(self)
 +
 +  def Jaffa(self):​
 +    self._state.Jaffa(self)
 +
 +  def Muumi(self):​
 +    self._state.Muumi(self)
 +    ​
 +  def poweroff(self):​
 +    self._state.poweroff(self)
 +  ​
 +  def shutdown_timeout(self):​
 +    self._state.shutdown_timeout(self)
 +  ​
 +
 +</​code>​
 +---------