40 SetValues(
"DispatchController",
"Dispatch Controller " +
ToString(number),
false);
87 for (
size_t i = 0; i <
Elevators.size(); i++)
95 for (
size_t j = 0; j <
Routes.size(); j++)
99 bool direction_standard =
false;
100 if (
Routes[j].destination ==
true)
102 if (
Routes[j].starting_floor <
Routes[j].destination_floor)
109 if (
Routes[j].direction == 1)
110 direction_standard =
true;
112 direction_standard =
false;
118 if (
Routes[j].destination ==
true)
122 bool route_direction =
false;
123 if (direction_dd == 1)
124 route_direction =
true;
132 for (
size_t k = 0; k <
Elevators[i].assigned_destination.size(); k++)
134 if (
Routes[j].destination_floor ==
Elevators[i].assigned_destination[k])
159 if (direction_standard ==
true)
160 Routes[j].station->UpLight(
false);
162 Routes[j].station->DownLight(
false);
184 for (
size_t i = 0; i <
Routes.size(); i++)
209 ReportError(
"RequestRoute: Destination Dispatch not enabled");
213 if (starting_floor == destination_floor)
221 Report(
"Requesting route from origin floor " +
ToString(starting_floor) +
" to destination floor " +
ToString(destination_floor));
246 bool isvalid =
false;
247 for (
size_t i = 0; i <
Elevators.size(); i++)
256 if (isvalid ==
false)
264 for (
size_t i = 0; i <
Routes.size(); i++)
276 if (
Routes[i].assigned_elevator > 0)
280 if (
Routes[i].station && e)
281 Routes[i].station->ReportElevator(e);
298 Routes.emplace_back(route);
317 ReportError(
"RequestRoute: Destination Dispatch is enabled");
327 Report(
"Calling an elevator from origin floor " +
ToString(floor));
338 bool isvalid =
false;
339 for (
size_t i = 0; i <
Elevators.size(); i++)
348 if (isvalid ==
false)
356 if (direction ==
true)
362 for (
size_t i = 0; i <
Routes.size(); i++)
364 if (
Routes[i].starting_floor == floor &&
Routes[i].direction == dir)
367 if (
Routes[i].assigned_elevator > 0)
371 if (
Routes[i].station && e)
372 Routes[i].station->ReportElevator(e);
389 Routes.emplace_back(route);
400 for (
size_t i = 0; i <
Routes.size(); i++)
402 if (
Routes[i].processed ==
true)
409 Report(
"Assigned elevator " +
ToString(
Routes[i].assigned_elevator) +
" became unavailable, reprocessing route");
410 Routes[i].processed =
false;
411 Routes[i].assigned_elevator = 0;
424 if (
Routes[i].destination ==
false)
438 if (
Elevators[closest].number !=
Routes[i].assigned_elevator && busy ==
false)
442 if (newelevator->
IsIdle() ==
true)
451 Routes[i].assigned_elevator = 0;
454 Routes[i].processed =
false;
471 int starting_floor =
Routes[i].starting_floor;
472 int destination_floor =
Routes[i].destination_floor;
477 if (
Routes[i].direction == 0)
485 Report(
"ProcessRoutes: No available elevators found");
487 Routes[i].station->Error();
492 if (
Routes[i].direction == 1)
493 Routes[i].station->UpLight(
false);
495 Routes[i].station->DownLight(
false);
504 if (
Routes[i].destination ==
false &&
Routes[i].assigned_elevator > 0)
512 for (
size_t j = 0; j <
Elevators.size(); j++)
517 call.
floor = starting_floor;
519 if (
Routes[i].direction == 1)
528 Routes[i].processed =
true;
542 int direction =
Routes[i].direction;
546 if (destination_floor > starting_floor)
554 Routes[i].station->ReportElevator(elevator);
557 if (
Routes[i].destination ==
true)
559 for (
size_t j = 0; j <
Elevators.size(); j++)
563 Elevators[j].destination_floor = destination_floor;
565 call.
floor = starting_floor;
579 if (
Routes[i].destination ==
true)
582 Routes[i].processed =
true;
601 for (
size_t i = 0; i <
Elevators.size(); i++)
609 newelevator.
number = elevator;
615 newelevator.
calls.clear();
637 for (
size_t i = 0; i <
Elevators.size(); i++)
665 for (
size_t i = 0; i <
Elevators.size(); i++)
682 SBS_PROFILE(
"DispatchController::FindClosestElevator");
690 int closest_busy = -1;
691 int closest_notbusy = -1;
696 if (destination ==
true)
698 if (destination_floor > starting_floor)
712 Report(
"Finding nearest available elevator...");
715 for (
int i = 0; i < count; i++)
721 if (destination ==
true)
724 if (serviced ==
false)
734 if (destination ==
true)
740 Report(
"Skipping elevator " +
ToString(elevator->
Number) +
" due to reached max passengers value");
746 if (abs(car->
GetFloor() - starting_floor) < closest || check ==
false || closest_busy >= 0)
749 result = elevator->
AvailableForCall(destination, starting_floor, direction,
true);
752 if (closest_busy >= 0 && result == 1)
762 if (destination ==
true)
775 Report(
"Marking - closest so far as busy");
776 closest = abs(car->
GetFloor() - starting_floor);
783 Report(
"Marking - closest so far");
784 closest = abs(car->
GetFloor() - starting_floor);
789 else if (result == 2)
802 item =
"All elevators";
806 Report(item +
" unavailable due to service modes or errors");
816 Report(
"No elevator found");
820 if (closest_notbusy >= 0)
823 return closest_notbusy;
835 std::string msg =
"Dispatch Controller " +
ToString(
Number) +
": " + message;
842 std::string msg =
"Dispatch Controller " +
ToString(
Number) +
": " + message;
850 SBS_PROFILE(
"DispatchController::ElevatorArrived");
856 for (
size_t i = 0; i <
Elevators.size(); i++)
871 for (
size_t j = 0; j < (int)
Elevators[i].calls.size(); j++)
873 if (
Elevators[i].calls[j].floor == floor &&
Elevators[i].calls[j].direction == direction)
877 Elevators[i].arrival_direction = direction;
886 for (
size_t j = 0; j <
Elevators[i].assigned_destination.size(); j++)
888 if (
Elevators[i].assigned_destination[j] == floor)
890 Elevators[i].assigned_destination.erase(
Elevators[i].assigned_destination.begin() + j);
896 for (
size_t j = 0; j <
Elevators[i].assigned_directions.size(); j++)
899 if (direction ==
true)
902 if (
Elevators[i].assigned_directions[j] == direction2)
910 if (
Elevators[i].assigned_destination.size() == 0 &&
Elevators[i].assigned_directions.size() == 0)
929 if (elevator && floor)
931 Report(
"Dispatching elevator " +
ToString(number) +
" to floor " +
ToString(destination_floor) +
" (" + floor->
ID +
")");
936 else if (destination ==
false)
940 elevator->
AddRoute(destination_floor, direction, type);
952 for (
size_t i = 0; i <
Elevators.size(); i++)
959 for (
size_t j = 0; j <
Elevators[i].assigned_destination.size(); j++)
961 if (
Elevators[i].assigned_destination[j] == destination_floor &&
Elevators[i].assigned ==
true)
968 for (
size_t j = 0; j <
Elevators[i].assigned_directions.size(); j++)
970 if (
Elevators[i].assigned_directions[j] == direction &&
Elevators[i].assigned ==
true)
989 for (
size_t i = 0; i <
Elevators.size(); i++)
999 if (
Elevators[i].assigned_destination[0] != destination_floor &&
Elevators[i].assigned ==
true &&
1011 if (
Elevators[i].assigned_directions[0] != direction &&
Elevators[i].assigned ==
true)
1029 for (
size_t i = 0; i <
Elevators.size(); i++)
1038 Elevators[i].assigned_destination.emplace_back(destination_floor);
1043 for (
size_t j = 0; j <
Elevators[i].assigned_directions.size(); j++)
1045 if (
Elevators[i].assigned_directions[j] == direction)
1047 Report(
"Elevator already assigned to direction");
1053 Elevators[i].assigned_directions.emplace_back(direction);
1099 std::vector<CallStation*> stationlist;
1120 for (
size_t i = 0; i <
Elevators.size(); i++)
1124 if (
Elevators[i].arrival_floor == starting_floor &&
Elevators[i].destination_floor == destination_floor)
1140 for (
size_t i = 0; i <
Elevators.size(); i++)
1144 if (
Elevators[i].arrival_floor == floor &&
Elevators[i].arrival_direction == direction)
1155 bool firstrun =
true;
1157 for (
size_t i = 0; i <
Elevators.size(); i++)
1163 for (
int j = 1; j <= carnum; j++)
1172 if (tmptop >
top_floor || firstrun ==
true)
1185 for (
size_t i = 0; i <
Elevators.size(); i++)
1205 bool status =
false, status2 =
false;
1207 for (
size_t i = 0; i <
Elevators.size(); i++)
1212 if (status2 ==
true)
1234 for (
size_t i = 0; i <
Elevators.size(); i++)
1244 for (
size_t i = 0; i <
Routes.size(); i++)
1246 for (
size_t j = 0; j <
Elevators[index].assigned_destination.size(); j++)
1248 if (
Elevators[index].assigned_destination[j] == destination_floor &&
Elevators[index].assigned ==
true)
1267 for (
size_t i = 0; i <
Elevators.size(); i++)
1344 if (index < 0 || index >
Elevators.size() - 1)
1357 if (
Elevators.size() != elevators.size())
1360 for (
size_t i = 0; i <
Elevators.size(); i++)
1362 if (
Elevators[i].number != elevators[i])
1379 bool result =
false;
1381 for (
size_t i = 0; i <
Elevators.size(); i++)
1385 for (
size_t j = 0; j <
Elevators[i].calls.size(); j++)
1387 if (
Elevators[i].calls[j].floor == floor)
1389 if (
Elevators[i].calls[j].direction ==
true)
1412 for (
size_t i = 0; i <
Elevators.size(); i++)
bool IsElevatorAssignedToOther(int number, int destination_floor, int direction)
bool AddElevator(int elevator)
std::vector< Route > Routes
std::vector< ElevMap > Elevators
bool IsServicedFloor(int floor)
bool ServesFloor(int floor)
void AssignElevator(int number, int destination_floor, int direction)
bool ServicesElevator(int elevator)
std::vector< CallStation * > GetCallStations(int floor)
bool GetCallStatus(int elevator, int floor, bool &up, bool &down)
bool SameElevators(const std::vector< int > &elevators)
DispatchController(Object *parent, int number)
bool FireService(int value)
int GetElevatorArrived(int starting_floor, int destination_floor)
int FindClosestElevator(bool &busy, bool destination, int starting_floor, int destination_floor, int direction=0)
bool IsElevatorAssigned(int number, int destination_floor, int direction)
bool RemoveElevator(int elevator)
bool ElevatorUnavailable(int elevator)
bool CallElevator(CallStation *station, bool direction)
void UnregisterCallStation(CallStation *station)
bool ReportError(const std::string &message)
int GetElevatorArrivedStandard(int floor, bool direction)
void Report(const std::string &message)
void DispatchElevator(bool destination, int number, int destination_floor, int direction, bool call)
void RegisterCallStation(CallStation *station)
int GetElevator(int index)
bool RequestRoute(CallStation *station, int starting_floor, int destination_floor)
void ResetArrival(int number)
void RemoveRoute(const Route &route)
void ElevatorArrived(int number, int floor, bool direction)
std::vector< CallStation * > CallStations
bool AtMaxRequests(int elevator, int destination_floor)
int AvailableForCall(bool destination, int floor, int direction, bool report_on_failure=true)
bool EnableFireService1(int value)
void CancelHallCall(int floor, int direction)
ElevatorCar * GetCar(int number)
bool AddRoute(int floor, int direction, int call_type)
void RemoveController(int controller)
ElevatorCar * GetCarForFloor(int number, bool report_on_failure=false)
bool IsServicedFloor(int floor, bool report=true)
void AddController(int controller)
virtual bool ReportError(const std::string &message)
virtual void Report(const std::string &message)
void SetValues(const std::string &type, const std::string &name, bool is_permanent, bool is_movable=true)
void EnableLoop(bool value)
Elevator * GetElevator(int number)
Floor * GetFloor(int number)
void RemoveController(DispatchController *controller)
std::string ToString(int number)
#define SBS_PROFILE(name)
std::vector< Call > calls