Files
WGU_Truck_Delivery/main.py
T
2026-01-13 18:07:01 -08:00

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()