{ init: function(elevators, floors) { console.clear(); console.log("Starting..."); // Get elevator/building info let floorCount = floors.length; let bottomFloor = 0; let topFloor = floorCount - 1; let elevatorCount = elevators.length; // Direction/status constants const UP = 0; const DOWN = 1; const IDLE = 2; // Create a data structure for floor requests let requests = [new Set(), new Set()]; // Register floor button presses floors.forEach(function (floor) { floor.on("up_button_pressed", function() { requests[UP].add(floor.floorNum); }); floor.on("down_button_pressed", function() { requests[DOWN].add(floor.floorNum); }); }); // ---- // Functions // ---- function getClosestFloor(currentFloor, floorList){ let distance = floorCount; let closestFloor = currentFloor; floorList.forEach(function(floorNum) { let newDistance = Math.abs(currentFloor - floorNum); if (newDistance < distance) { closestFloor = floorNum; distance = newDistance; } }) return closestFloor; } // ---- // Individual elevators // ---- elevators.forEach(function (elevator) { elevator.on("floor_button_pressed", function(floorNum) { destinations.add(floorNum); }); // Basic elevator info const elevatorIndex = elevators.indexOf(elevator); const restFloors = [ (elevatorIndex + 0) * Math.floor(floorCount / (elevatorCount + 1)), (elevatorIndex + 1) * Math.floor(floorCount / (elevatorCount + 1)), (elevatorIndex + 2) * Math.floor(floorCount / (elevatorCount + 1)) ] // Elevator variables let status = UP; let destinations = new Set(); // Go to designated starting floor console.log("Sending elevator[" + elevatorIndex + "] to floor[" + restFloors[0] + "]") elevator.goToFloor(restFloors[0]); elevator.on("idle", function() { status = IDLE; if (requests[UP].size == 0 && requests[DOWN].size == 0 && destinations.size == 0) { elevator.goToFloor(restFloors[1]); } else { let allStops = new Set([...destinations, ...requests[UP], ...requests[DOWN]]); elevator.goToFloor(getClosestFloor(elevator.currentFloor(), allStops)); } }); elevator.on("passing_floor", function(floorNum, direction) { if(requests[UP].has(floorNum) || requests[DOWN].has(floorNum) || destinations.has(floorNum)) { elevator.goToFloor(floorNum, true); } }); elevator.on("stopped_at_floor", function(floorNum) { requests[UP].delete(floorNum); requests[DOWN].delete(floorNum); destinations.delete(floorNum); if (destinations.size > 0 || requests[UP] > 0 || requests[DOWN] > 0) { let allStops = new Set([...destinations, ...requests[UP], ...requests[DOWN]]); elevator.goToFloor(getClosestFloor(elevator.currentFloor(), allStops)); } }); }); }, update: function(dt, elevators, floors) {} }