def __init__(self) : """ state """ self._demandQ = [] self.vehiclePhase = self.IDLE self.currentDemand = None # statistics self.demandLog = [] #self.odometer_full = 0. #self.odometer_empty = 0. """ sim interface """ # messaging interface self.signalWakeup = Signal() self.signalAssigned = Signal() self.signalPickup = Signal() # emited when a demand is picked up self.signalDeliver = Signal() # emited when a demand is delivered self.signalIdle = Signal() # state variables self.vehicle = Vehicle() # vehicle signal connections self.vehicle.signalArrived.connect( self.vehicleArrived )
class Taxi : """ vehicular agent whose tasks are pickup-and-delivery tasks """ IDLE = 0 EMPTY = 1 FULL = 2 class Demand : def __init__(self, orig, dest, arrivalTime=None ) : # task spec self.origin = orig self.destination = dest # statistics self.arrived = arrivalTime self.embarked = None self.delivered = None def __init__(self) : """ state """ self._demandQ = [] self.vehiclePhase = self.IDLE self.currentDemand = None # statistics self.demandLog = [] #self.odometer_full = 0. #self.odometer_empty = 0. """ sim interface """ # messaging interface self.signalWakeup = Signal() self.signalAssigned = Signal() self.signalPickup = Signal() # emited when a demand is picked up self.signalDeliver = Signal() # emited when a demand is delivered self.signalIdle = Signal() # state variables self.vehicle = Vehicle() # vehicle signal connections self.vehicle.signalArrived.connect( self.vehicleArrived ) """ programmer interface """ # vehicle pass-thrus def setLocation(self, location ) : self.vehicle.setLocation(location) def location(self) : return self.vehicle.location() def setSpeed(self, speed ) : self.vehicle.setSpeed(speed) def setPlanner(self, planningFunction ) : self.vehicle.setPlanner(planningFunction) # demand queue def _addDemand(self, demand ) : if DEBUG : time = self.sim.get_time() args = ( repr(self), time, repr(demand.origin), repr(demand.destination) ) #print '%s, got demand at %f: (%s, %s)' % args self._demandQ.append( demand ) self.demandLog.append( demand ) """ simulation interface """ def join_sim(self, sim ) : self.sim = sim # wake-up call msg = Message( self.signalWakeup, self.location() ) self.sim.schedule( msg ) self.vehicle.join_sim( sim ) # slotoid def _tryschedule(self) : # if there are demands waiting, claim one if len( self._demandQ ) > 0 : if self.currentDemand is None : dem = self._demandQ[0] self.vehicle.queueWaypoint( dem.origin ) self.currentDemand = dem self.vehiclePhase = self.EMPTY else : # we're already working on the first demand pass # otherwise, try to idle the taxi else : if not self.vehiclePhase == self.IDLE : msg = Message( self.signalIdle, self.location() ) self.sim.schedule( msg ) self.vehiclePhase = self.IDLE # slotoid def _activate(self) : if self.vehiclePhase == self.IDLE : self.vehiclePhase = self.EMPTY # target should already be None self._tryschedule() """ simulation messaging interface """ # slot def queueDemand(self, demand ) : self._addDemand( demand ) self._activate() # slot def appendDemands(self, seq ) : for dem in seq : self._addDemand( dem ) self._activate() # auto-slot? --- switch def vehicleArrived(self) : if self.vehiclePhase == self.EMPTY : self.arrivedOrigin() elif self.vehiclePhase == self.FULL : self.arrivedDestination() else : raise 'vehicle should not be moving' # slot-oid def arrivedOrigin(self) : demand = self._demandQ[0] time = self.sim.get_time() demand.embarked = time self.signalPickup() # send signal, does this need to be scheduled? self.vehicle.queueWaypoint( demand.destination ) self.vehiclePhase = self.FULL # slot-oid def arrivedDestination(self) : demand = self._demandQ.pop(0) time = self.sim.get_time() demand.delivered = time self.signalDeliver() # send signal, does this need to be scheduled? self.currentDemand = None self._tryschedule()