class Elevator_tracker(object):
    def __init__(self, building, TRACKER_INTERVAL=1):
        self.building = building
        self.elevators = building.get_elevators()
        self.elevator_count = len(self.elevators)
        self.TRACKER_INTERVAL = TRACKER_INTERVAL
        self.visited_floors = [
            x[:] for x in [[] * self.elevator_count] * self.elevator_count
        ]
        self.tracker_timer = RepeatedTimer(self.TRACKER_INTERVAL,
                                           self.get_elevators_floors)

    def start_tracking(self):
        self.tracker_timer.start()

    def end_tracking(self):
        self.tracker_timer.stop()
        return self.visited_floors

    def get_tracker_status(self):
        if self.tracker_timer.isRunning():
            return "Running"
        else:
            return "Terminaed"

    def get_elevators_floors(self):
        for i in range(0, self.elevator_count):
            self.visited_floors[i].append(
                self.elevators[i].get_current_floor())

    def save_result(self):
        print(self.visited_floors)
        with open('visited_floors.csv', 'a') as fp:
            a = csv.writer(fp, delimiter=',', lineterminator="\n")
            a.writerows(self.result)

    def plot_track(self):
        #plt.hold(True)
        fig = plt.figure()
        ax = fig.add_subplot(1, 1, 1)
        x_axis = numpy.arange(
            0,
            len(self.visited_floors[0]) * self.TRACKER_INTERVAL,
            self.TRACKER_INTERVAL)
        labels = []
        lines = []
        for i in range(0, self.elevator_count):
            lines += plt.plot(x_axis,
                              self.visited_floors[i],
                              label='Elevator ' + str(i))
            #plt.plot(x_axis, self.visited_floors[i])

        # Plot decorations
        major_ticks = numpy.arange(0, self.building.get_floor_count(), 1)
        ax.set_yticks(major_ticks)
        labels = [l.get_label() for l in lines]
        plt.legend(lines, labels)
        plt.xlabel('Time [s]')
        plt.ylabel('Floor')
        plt.show()
class Elevator_tracker(object):
    def __init__(self, building, TRACKER_INTERVAL = 1):
        self.building = building
        self.elevators = building.get_elevators()
        self.elevator_count = len(self.elevators)
        self.TRACKER_INTERVAL = TRACKER_INTERVAL
        self.visited_floors = [x[:] for x in [[]*self.elevator_count]*self.elevator_count]
        self.tracker_timer = RepeatedTimer(self.TRACKER_INTERVAL, self.get_elevators_floors)

    def start_tracking(self):    
        self.tracker_timer.start()
        
    def end_tracking(self):
        self.tracker_timer.stop()
        return self.visited_floors
        
    def get_tracker_status(self):
        if self.tracker_timer.isRunning():
            return "Running"
        else: 
            return "Terminaed"
        
    def get_elevators_floors(self):
        for i in range(0, self.elevator_count):
            self.visited_floors[i].append(self.elevators[i].get_current_floor())
        
    def save_result(self):      
        print (self.visited_floors)
        with open('visited_floors.csv', 'a') as fp:
            a = csv.writer(fp, delimiter=',', lineterminator="\n")
            a.writerows(self.result)
            
    def plot_track(self):
        #plt.hold(True)
        fig = plt.figure() 
        ax = fig.add_subplot(1,1,1)   
        x_axis = numpy.arange(0, len(self.visited_floors[0])*self.TRACKER_INTERVAL, self.TRACKER_INTERVAL)
        labels = []
        lines = [] 
        for i in range(0, self.elevator_count):
            lines += plt.plot(x_axis, self.visited_floors[i], label='Elevator '+ str(i))
            #plt.plot(x_axis, self.visited_floors[i])
        
        # Plot decorations        
        major_ticks = numpy.arange(0, self.building.get_floor_count(), 1)                                              
        ax.set_yticks(major_ticks)
        labels = [l.get_label() for l in lines]
        plt.legend(lines, labels)
        plt.xlabel('Time [s]')
        plt.ylabel('Floor')
        plt.show()
예제 #3
0
class Elevator(object):
    'An elevator'
    elevator_count = 0
    def __init__(self, building, name, current_floor):
        self.name = name
        self.current_floor = current_floor
        self.building = building
        self.destination_floor = []
        self.active_calls = []
        self.SPEED = 1 # s / floor
        self.TIME_AT_FLOOR = 5 # s / floor
        Elevator.elevator_count += 1
        self.run_timer = RepeatedTimer(self.SPEED, self.execute_call())
             
    def start_elevator(self):
        self.run_timer.start()
        
    def get_name(self):
        return self.name
        
    def get_current_floor(self):
        return self.current_floor
        
    def get_destination_floor(self):
        return self.destination_floor

    def get_direction(self):
        if not self.destination_floor:# or len(self.destination_floor) == 0:
            return 0
        else:
            return numpy.sign(self.destination_floor[0] - self.current_floor)       
    
    def get_speed(self):
        return self.SPEED
        
    def get_time_to_floor(self, floor):
        distance_to_destination = abs(floor - self.get_current_floor())  
        time_to_destination = self.get_speed()*distance_to_destination
        return time_to_destination
    
    def set_current_floor(self, floor):
        self.current_floor = floor
      
    def set_destination_floor(self, floor, on_the_way = False):
        if self.current_floor != floor:
            if on_the_way:
                self.destination_floor = [floor] + self.destination_floor
            else:
                self.destination_floor.append(floor)
               
    def execute_call(self):
        ''' checks if there is a call to execute. if yes, run elevator '''
        print('execute_call()')
        if self.active_calls:
            print("I got a call, Elevator " + str(self.name) + " will start!")
            self.run_timer.stop()
            self.run_elevator()
    
    def run_elevator(self):
        curret_call = self.active_calls[0]
        while self.current_floor != self.destination_floor[0]:
            new_floor = self.current_floor + self.get_direction() 
            self.set_current_floor(new_floor)
            sleep(self.SPEED)
        
        self.stop_at_floor(curret_call)

    def stop_at_floor(self, call):
        floor = call.get_floor()
        print ("Elevator " + str(self.name) + " now at floor " + str(floor) + ".")
        sleep(self.TIME_AT_FLOOR)
        self.destination_floor = [x for x in  self.destination_floor if x != floor]
        call.get_selected_floor()
        self.run_timer.start()

    def recieve_call(self, call):
        print ("Elevator " + str(self.name) + "has recieved a call.")
        self.active_calls.append(call)
        self.set_destination_floor(call.get_floor(), call.get_on_the_way())

    def stop_elevator(self):
        print ("Elevator to stop: " + str(self.name))
        if self.get_elevator_status() == "Running":
            self.run_timer.stop()
    
    def get_elevator_status(self):
        if self.run_timer.isRunning():
            return "Running"
        else: 
            return "Terminated"