Code for Elevator Saga
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. {
  2. init: function(elevators, floors) {
  3. console.clear();
  4. console.log("Starting...");
  5. // Get elevator/building info
  6. let floorCount = floors.length;
  7. let bottomFloor = 0;
  8. let topFloor = floorCount - 1;
  9. let elevatorCount = elevators.length;
  10. // Direction/status constants
  11. const UP = 0;
  12. const DOWN = 1;
  13. const IDLE = 2;
  14. // Create a data structure for floor requests
  15. let requests = [new Set(), new Set()];
  16. // Register floor button presses
  17. floors.forEach(function (floor) {
  18. floor.on("up_button_pressed", function() { requests[UP].add(floor.floorNum); });
  19. floor.on("down_button_pressed", function() { requests[DOWN].add(floor.floorNum); });
  20. });
  21. // ----
  22. // Functions
  23. // ----
  24. function getClosestFloor(currentFloor, floorList){
  25. let distance = floorCount;
  26. let closestFloor = currentFloor;
  27. floorList.forEach(function(floorNum) {
  28. let newDistance = Math.abs(currentFloor - floorNum);
  29. if (newDistance < distance) {
  30. closestFloor = floorNum;
  31. distance = newDistance;
  32. }
  33. })
  34. return closestFloor;
  35. }
  36. // ----
  37. // Individual elevators
  38. // ----
  39. elevators.forEach(function (elevator) {
  40. elevator.on("floor_button_pressed", function(floorNum) { destinations.add(floorNum); });
  41. // Basic elevator info
  42. const elevatorIndex = elevators.indexOf(elevator);
  43. const restFloors = [
  44. (elevatorIndex + 0) * Math.floor(floorCount / (elevatorCount + 1)),
  45. (elevatorIndex + 1) * Math.floor(floorCount / (elevatorCount + 1)),
  46. (elevatorIndex + 2) * Math.floor(floorCount / (elevatorCount + 1))
  47. ]
  48. // Elevator variables
  49. let status = UP;
  50. let destinations = new Set();
  51. // Go to designated starting floor
  52. console.log("Sending elevator[" + elevatorIndex + "] to floor[" + restFloors[0] + "]")
  53. elevator.goToFloor(restFloors[0]);
  54. elevator.on("idle", function() {
  55. status = IDLE;
  56. if (requests[UP].size == 0 && requests[DOWN].size == 0 && destinations.size == 0) {
  57. elevator.goToFloor(restFloors[1]);
  58. } else {
  59. let allStops = new Set([...destinations, ...requests[UP], ...requests[DOWN]]);
  60. elevator.goToFloor(getClosestFloor(elevator.currentFloor(), allStops));
  61. }
  62. });
  63. elevator.on("passing_floor", function(floorNum, direction) {
  64. if(requests[UP].has(floorNum) || requests[DOWN].has(floorNum) || destinations.has(floorNum)) {
  65. elevator.goToFloor(floorNum, true);
  66. }
  67. });
  68. elevator.on("stopped_at_floor", function(floorNum) {
  69. requests[UP].delete(floorNum);
  70. requests[DOWN].delete(floorNum);
  71. destinations.delete(floorNum);
  72. if (destinations.size > 0 || requests[UP] > 0 || requests[DOWN] > 0) {
  73. let allStops = new Set([...destinations, ...requests[UP], ...requests[DOWN]]);
  74. elevator.goToFloor(getClosestFloor(elevator.currentFloor(), allStops));
  75. }
  76. });
  77. });
  78. },
  79. update: function(dt, elevators, floors) {}
  80. }