135 lines
7.3 KiB
Python
Executable File
135 lines
7.3 KiB
Python
Executable File
# Derek Holloway 010396173
|
|
|
|
import datetime
|
|
import AssignmentData
|
|
import UI
|
|
from MyHashTable import DerekHashTable
|
|
from Truck import Truck
|
|
from DeliveryObject import deliveryStatus
|
|
|
|
def main():
|
|
|
|
UserUI = UI.DataUI() # Load in the UI library
|
|
globalTime = datetime.time(8, 0)
|
|
|
|
package_hash = DerekHashTable() # Init the hash table
|
|
for pkg in AssignmentData.packages: # Load the packages into the hash table
|
|
pkg.status = deliveryStatus.AT_THE_HUB
|
|
package_hash.addItem(pkg.id, pkg)
|
|
|
|
truck1 = Truck("1") # Init truck 1 starting at 8:00
|
|
truck1.startTime = datetime.time(8, 0)
|
|
|
|
truck2 = Truck("2") # Init truck 2 starting at 9:15 -> Delayed for package 6
|
|
truck2.startTime = datetime.time(9, 5)
|
|
|
|
truck3 = Truck("3") # Init truck 3 starting as soon as the fastest truck returned
|
|
truck3.startTime = None
|
|
|
|
pauseTime = UserUI.TimePrompt(globalTime, truck1, truck2, truck3, package_hash) # start the first time prompt
|
|
|
|
noRequirements = [1,2,4,5,7,8,10,11,12,17,21,22,23,24,26,27,29,30,31,33,34,35,37,39,40]
|
|
truck2Only = [3,18,36,38]
|
|
delayed = [6,9,25,28,32]
|
|
sameTruck = [13,14,15,16,19,20]
|
|
|
|
# Package requirements
|
|
priority = [1,6,13,14,15,16,21,25,29,30,31,34,37,40]
|
|
priority_hash = DerekHashTable() # Load the priority packages into a hash for quick lookup
|
|
for cur in priority:
|
|
priority_hash.addItem(cur, cur)
|
|
|
|
# Sort the known packages
|
|
t1_load = sameTruck # Start with the packages that requrie the same truck
|
|
t2_load = truck2Only + delayed # add in the truck 2 only and the delays
|
|
t3_load = [] # create an empty list
|
|
|
|
# Sort the Unknown packages
|
|
for i, v in enumerate(noRequirements): # enumerate through all the packages not predefined
|
|
if priority_hash.getItem(v): # if the item is a priority item
|
|
if len(t1_load) < 16: # load priorities on truck 1 first as it leaves earlier
|
|
t1_load.append(v)
|
|
elif len(t2_load) < 16: # fallback to truck 2
|
|
t2_load.append(v)
|
|
else: # fallback again to truck 3
|
|
t3_load.append(v)
|
|
else:
|
|
if len(t3_load) < 16: # non priority pkgs default to truck 3 as it leaves last
|
|
t3_load.append(v)
|
|
elif len(t2_load) < 16: # fall back to truck 2
|
|
t2_load.append(v)
|
|
elif len(t1_load) < 16: # fallback again to truck 1
|
|
t1_load.append(v)
|
|
|
|
# Run the simulation until all the packages have been delivered
|
|
debounce1 = True
|
|
debounce2 = True
|
|
debounce3 = True
|
|
truck3LoadDebounce = True
|
|
while True:
|
|
|
|
# check for pause time
|
|
if globalTime >= pauseTime:
|
|
pauseTime = UserUI.TimePrompt(globalTime, truck1, truck2, truck3, package_hash)
|
|
|
|
# update global time
|
|
if globalTime >= datetime.time(10, 20): # If the time is correct for update
|
|
pkg9 = package_hash.getItem(9) # Handle the Package #9 address correction before Truck 3 starts
|
|
pkg9.address = "410 S State St"
|
|
|
|
# load packages for truck 1
|
|
if globalTime >= truck1.startTime and debounce1: # If its time to laod the packages, run once
|
|
debounce1 = False # set debounce for only one run
|
|
truck1.hasLoad = True # Set the truck load variable
|
|
for pkg_id in t1_load: # Load the packages in truck 1
|
|
truck1.addPkg(package_hash.getItem(pkg_id))
|
|
|
|
# load packages for truck 2
|
|
if globalTime >= truck2.startTime and debounce2: # If its time to laod the packages, run once
|
|
debounce2 = False # set debounce for only one run
|
|
truck2.hasLoad = True # Set the truck load variable
|
|
for pkg_id in t2_load: # Load the packages in truck 2
|
|
truck2.addPkg(package_hash.getItem(pkg_id))
|
|
|
|
# load packages for truck 3
|
|
if type(truck3.startTime) is datetime.time: # Verify type corectness
|
|
if globalTime >= truck3.startTime and debounce3: # If its time to laod the packages, run once
|
|
debounce3 = False # set debounce for only one run
|
|
truck3.hasLoad = True # Set the truck load variable
|
|
for pkg_id in t3_load: # Load the packages in truck 2
|
|
truck3.addPkg(package_hash.getItem(pkg_id))
|
|
|
|
# deliver packages for truck 1
|
|
if truck1.hasLoad and globalTime >= truck1.getTimeOfDay(): # if there is more packages and the time has passed
|
|
truck1.driveNextClosest(priority_hash) # deliver the next set of packages
|
|
if len(truck1.packages) == 0 and truck3LoadDebounce: # if all the packages are delivered
|
|
truck1.driveNextClosest(priority_hash) # drive back to the HUB
|
|
truck3LoadDebounce = False # set the debouce
|
|
truck3.startTime = truck1.getTimeOfDay() # set truck3 start time
|
|
|
|
# deliver packages for truck 2
|
|
if truck2.hasLoad and globalTime >= truck2.getTimeOfDay(): # if there is more packages and the time has passed
|
|
truck2.driveNextClosest(priority_hash) # deliver the next set of packages
|
|
if len(truck2.packages) == 0 and truck3LoadDebounce: # if all the packages are delivered
|
|
truck2.driveNextClosest(priority_hash) # drive back to the HUB
|
|
truck3LoadDebounce = False # set the debouce
|
|
truck3.startTime = truck1.getTimeOfDay() # set truck3 start time
|
|
|
|
# deliver packages for truck 3
|
|
if truck3.hasLoad and globalTime >= truck3.getTimeOfDay(): # if there is more packages and the time has passed
|
|
truck3.driveNextClosest(priority_hash) # deliver the next set of packages
|
|
|
|
# Calculate new global time
|
|
totalMins = (globalTime.hour * 60) + globalTime.minute + 5 # Get total mins and add 30
|
|
offsetHour = (totalMins // 60) % 24 # pull hours back out
|
|
offsetMins = totalMins % 60 # pull minutes back out
|
|
globalTime = datetime.time(offsetHour, offsetMins) # return the time of day
|
|
|
|
# if we are done delivering
|
|
if (truck3.hasLoad == False and truck2.hasLoad == False and truck1.hasLoad == False):
|
|
break
|
|
|
|
UserUI.MainSelectionPrompt(truck1, truck2, truck3, package_hash) # Display the command prompt Menus
|
|
|
|
if __name__ == "__main__":
|
|
main() |