diff --git a/Assets/Scripts/ParkingManager.cs b/Assets/Scripts/ParkingManager.cs index 1bed5d1..a4a23e2 100644 --- a/Assets/Scripts/ParkingManager.cs +++ b/Assets/Scripts/ParkingManager.cs @@ -102,6 +102,10 @@ namespace Parking // TODO: Check if car can stay before other reservation - may not work for priority-based reservations var triesToPark = _currentTime <= driver.Times[3].TimeOfDay && _currentTime > driver.Times[2].TimeOfDay; var leftTheParking = _currentTime > driver.Times[3].TimeOfDay && driver.Parked; + bool reservedButTimedout = + (_currentTime - driver.Times[0].TimeOfDay).TotalMinutes > driver.UpdateInterval && + GetReservedSpotCount(driver.Priority, driver.Size) > 0 + && !driver.Parked && !driver.Rejected && _currentTime <= driver.Times[3].TimeOfDay; if (triesToPark && !driver.Parked && !driver.Rejected) { if (!PlaceCarOnParking(driver)) { Debug.Log($"Placing failed for car {driver.Number}"); @@ -114,8 +118,13 @@ namespace Parking else if (leftTheParking) { driver.Spot.Reserved = false; driver.Reset(); + } else if (reservedButTimedout) { + Debug.Log($"Reserved but timed out driver {driver.Number}"); + driver.Rejected = true; } } + + ReconfigureSpots(); } private void ResetDrivers() @@ -129,6 +138,19 @@ namespace Parking } } + private int GetReservedSpotCount(int priority, Size size) + { + int count = 0; + foreach (List list in _spotMap) { + foreach (Spot spot in list) { + if (spot.Size == size && spot.Reserved && spot.ReservedPriority == priority) + count++; + } + } + + return count; + } + private bool FindReservedSpot(Driver driver, out Spot spot) { foreach (var list in _spotMap) @@ -209,8 +231,8 @@ namespace Parking int[] neededSpots = {0, 0, 0, 0}; for (var i = 0; i < neededSpots.Length; i++) - neededSpots[i] = Math.Max(freeSpots[i] - plannedSpots[i], 0); - if (neededSpots.Max() > 0) { + neededSpots[i] = Math.Max(plannedSpots[i] - freeSpots[i], 0); + if (neededSpots.Sum() > 5) { Debug.Log($"Needed spots = {neededSpots[0]} {neededSpots[1]} {neededSpots[2]} {neededSpots[3]}"); Debug.Log("Attempting reconfiguration..."); } @@ -233,8 +255,8 @@ namespace Parking TimeSpan updatedTime = _currentTime + TimeSpan.FromMinutes(stepTime); while (nextCars.Count < n && updatedTime < EndTime) { foreach (Driver driver in DataImporter.Drivers) - if (_currentTime + updatedTime <= driver.Times[3].TimeOfDay && - _currentTime > driver.Times[2].TimeOfDay && + if (updatedTime <= driver.Times[1].TimeOfDay && + updatedTime > driver.Times[0].TimeOfDay && !driver.Parked && !driver.Rejected && !nextCars.Contains(driver)) nextCars.Add(driver); updatedTime += TimeSpan.FromMinutes(stepTime);