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()
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"