0% found this document useful (0 votes)
38 views

Source Code

The document describes a parking lot management system with the following key elements: - A Vehicle class to represent vehicles with attributes like type, plate, and entry time. - A Space class to represent parking spaces with attributes like occupied status and stored vehicle. - Functions to display the parking lot layout, enter a vehicle into a space, calculate fare for a departed vehicle, and view details of a parked vehicle. - The system tracks available spaces, calculates parking rates based on vehicle type and time parked, and ensures only one vehicle is assigned per space.

Uploaded by

Yees BoojPai
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
38 views

Source Code

The document describes a parking lot management system with the following key elements: - A Vehicle class to represent vehicles with attributes like type, plate, and entry time. - A Space class to represent parking spaces with attributes like occupied status and stored vehicle. - Functions to display the parking lot layout, enter a vehicle into a space, calculate fare for a departed vehicle, and view details of a parked vehicle. - The system tracks available spaces, calculates parking rates based on vehicle type and time parked, and ensures only one vehicle is assigned per space.

Uploaded by

Yees BoojPai
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 21

# Parking Lot Project - Yash Bajpai

import os

import time

# lot information and data structure

spaces = []

avail_spaces = 0

total_spaces = 0

rows = 0

# display function variables

space_count = 0

border = ""

# flags

linux = 0

# vehicle class, has a type and a plate number, upon creation, stores current epoch
time for later fare calculation

class Vehicle:

def __init__(self, v_type, plate):


self.type = v_type

self.plate = plate

self.entry_time = time.time()

# return type value (int)

def get_type(self):

return self.type

# return type value (string)

def get_type_string(self):

return "Car" if self.type == 1 else "Truck" if self.type == 2 else "Motorcycle"

def get_plate(self):

return self.plate

def get_entry_time(self):

return self.entry_time

# set epoch time manually - used for demo mode

def set_entry_time(self, new_time):

self.entry_time = new_time

def get_vehicle(self):
return self.type, self.plate, self.entry_time

# space class, stores a vehicle object and current occupied status,

class Space:

def __init__(self):

self.vehicle = None

self.occupied = False

def add_vehicle(self, vehicle):

self.vehicle = vehicle

self.occupied = True

# remove a vehicle from a space and return object for final fare calculation

def remove_vehicle(self):

v_exit = self.vehicle

self.vehicle = None

self.occupied = False

return v_exit

def vehicle_info(self):

return self.vehicle
def is_available(self):

return self.occupied

def print_row(row):

output = ""

output += "|"

for s in range(space_count * row, space_count * (row + 1)):

if not spaces[s].is_available():

output += "[ ]"

else:

output += "["

output += "c" if spaces[s].vehicle_info().get_type() == 1 \

else "t" if spaces[s].vehicle_info().get_type() == 2 \

else "m"

output += "]"

if s < space_count * (row + 1) - 1:

output += " "

output += "|"

return output
# display all spaces with availability

def display_lot():

global spaces, avail_spaces, total_spaces, rows

# generate the interface

output = "SPOTS AVAILABLE: " + str(avail_spaces) + "\n"

output += border

for row in range(rows):

output += print_row(row) + "\n"

output += border

# only uncomment when running on linux machine

if linux == 1:

os.system("clear")

print(output)

# display all spaces with row selection numbers for user to choose from

def display_row_selection():

global spaces, avail_spaces, total_spaces, rows


# generate the interface

output = "SPOTS AVAILABLE: " + str(avail_spaces) + "\n"

output += border

for row in range(rows):

output += print_row(row)

output += " <" + str(row) + ">\n"

output += border

# only uncomment when running on linux machine

if linux == 1:

os.system("clear")

print(output)

# display a specified row with space selection numbers for user to choose from

def display_space_selection(row):

global spaces, avail_spaces, total_spaces, rows

output = "VIEWING ROW: " + row + "\n"

output += border
output += print_row(int(row)) + "\n"

output += " "

for count in range(space_count):

if count < 10:

output += "<" + str(count) + "> "

else:

output += "<" + str(count) + ">"

output += "\n"

output += border

if linux == 1:

os.system("clear")

print(output)

return space_count

# used to park a vehicle within the lot

def enter_vehicle(v_type, plate, row, space):

global spaces, avail_spaces, total_spaces, rows


# do not allow a user to park a vehicle with a full lot

if avail_spaces == 0:

display_lot()

print("Error: No Available Spaces")

time.sleep(2)

return

# check if a specified space is already occupied

if spaces[(int(row) * space_count) + int(space)].is_available():

display_space_selection(row)

print("Error: Vehicle Already In Space")

time.sleep(2)

return -1

# check if specified plate number is in the lot

for uniq in spaces:

if uniq.is_available():

if uniq.vehicle_info().get_plate() == plate:

display_lot()

print("Error: Vehicle Already In Lot")

time.sleep(2)

return
# add a valid vehicle to the specified space and show the time of entry

new_vehicle = Vehicle(v_type, plate)

spaces[(int(row) * space_count) + int(space)].add_vehicle(new_vehicle)

avail_spaces -= 1

display_lot()

print("Vehicle Added to Lot!\n"

"Time Entered: " + str(time.strftime('%I:%M %p',

time.localtime(new_vehicle.get_entry_time()))))

time.sleep(2)

return new_vehicle

# used to calculate the fare of a vehicle

def fare_calculation(vehicle):

# calculate the number of seconds which have passed since a vehicle was
entered into the system

# if less than one hour has passed, then a minimum fare of one hour is priced

total_time = time.time() - vehicle.get_entry_time()

if total_time < 3600:

hours = 1

else:

hours = int(total_time / 3600)+1


# calculate fare based on vehicle type

if vehicle.get_type() == 1:

rate = hours * 3.50

elif vehicle.get_type() == 2:

rate = hours * 4.50

else:

rate = hours * 2.00

ret = "Vehicle Removed!\n" \

"Your Total for " + "{:.2f}".format(hours) + " hours is $" +


"{:.2f}".format(rate)

return ret

# used to removed a vehicle from the lot

def exit_lot(row, space):

global avail_spaces

# check if a specified space is occupied

if not spaces[(int(row) * space_count) + int(space)].is_available():

display_space_selection(row)
print("Error: No Vehicle In Space")

time.sleep(2)

return

# if the specified plate number is found within the lot, the vehicle is removed

removed = spaces[(int(row) * space_count) + int(space)].remove_vehicle()

avail_spaces += 1

# calculate fare if a vehicle is removed

display_lot()

print(fare_calculation(removed))

time.sleep(2)

# used to view a currently parked vehicle's information

def view_vehicle(row, space):

# check if a specified space is occupied

if not spaces[(int(row) * space_count) + int(space)].is_available():

display_space_selection(row)

print("Error: No Vehicle In Space")

time.sleep(2)
# collect vehicle information and display to user

else:

vehicle = spaces[(int(row) * space_count) + int(space)].vehicle_info()

display_space_selection(row)

input("Vehicle Type: " + vehicle.get_type_string() + "\n"

"Plate Number: " + vehicle.get_plate() + "\n"

"Entry Time: " +


str(

time.strftime('%m-%d-%Y %I:%M %p',

time.localtime(vehicle.get_entry_time()))) + "\n"

"\nPress Enter to return to menu")

# handles user commands as determined in main

def command_handler(command):

# command to park a car

if command == "P":

while True:

display_lot()

new_type = input("Enter Vehicle Type:\n"

"1. Car\n"

"2. Truck\n"

"3. Motorcycle\n"
">")

if new_type == "1" or new_type == "2" or new_type == "3":

break

# program will accept any valid string as a plate number

display_lot()

new_plate = input("Enter New Vehicle Plate Number:\n"

">")

# allow user to select the space they want to park in

# while loop is in case the user selects a spot which already has a vehicle

# or if the user inputs a plate number that has already been added

ret_val = -1

while ret_val == -1:

while True:

display_row_selection()

row = input("Select Row to Park In:\n"

">")

if row.isnumeric():

if int(row) < rows:

break

while True:

display_space_selection(row)
space = input("Select Space to Park In:\n"

">")

if space.isnumeric():

if int(space) < space_count:

break

ret_val = enter_vehicle(int(new_type), new_plate, row, space)

# command for exiting the lot

elif command == "E":

# user can specify a row and space within the lot, if a selected space is
occupied,

# vehicle information is returned

while True:

display_row_selection()

row = input("Select Row of Vehicle:\n"

">")

if row.isnumeric():

if int(row) < rows:

break

while True:

display_space_selection(row)
space = input("Select Space of Vehicle:\n"

">")

if space.isnumeric():

if int(space) < space_count:

break

# program will check for vehicle plate within system and remove if found,
returns error if no plate found

exit_lot(row, space)

# command for viewing a vehicle's information

elif command == "V":

# user can specify a row and space within the lot, if a selected space is
occupied,

# vehicle information is returned

while True:

display_row_selection()

row = input("Select Row to View:\n"

">")

if row.isnumeric():

if int(row) < rows:

break
while True:

display_space_selection(row)

space = input("Select Space to View:\n"

">")

if space.isnumeric():

if int(space) < space_count:

break

view_vehicle(row, space)

# display current parking lot rates

elif command == "R":

display_lot()

input("Current Parking Rates:\n"

"Cars - $3.50/hour\n"

"Trucks - $4.50/hour\n"

"Motorcycles - $2.00/hour\n"

"\nPress Enter to return to menu")

# return if the quit command is given

elif command == "Q":

return

# display an error if an invalid command is given


else:

display_lot()

print("Error: Invalid Command")

time.sleep(1)

# read config file to determine lot size and enable features

def read_config():

global spaces, total_spaces, avail_spaces, rows, linux, space_count, border

config = open('config.txt', 'r')

while True:

line = config.readline()

if line.find("total_spaces") != -1:

total_spaces = int(line[13:16])

avail_spaces = total_spaces

elif line.find("rows") != -1:

rows = int(line[5:7])

# enables static interface on linux machines

elif line.find("linux") != -1:


linux = int(line[6:7])

# if demo mode is enabled, populate lot with demo cars, otherwise, populate
lot based on config

elif line.find("demo_mode") != -1:

if int(line[10:11]) == 1:

demo_mode()

break

else:

for i in range(total_spaces):

spaces.append(Space())

# calculate the number of spaces within a row

space_count = int(total_spaces / rows)

# generate the interface border

border = "|"

for i in range(space_count - 1):

for j in range(4):

border += "-"

border += "---|\n"

break
config.close()

def demo_mode():

global spaces, total_spaces, avail_spaces, rows, space_count, border

for i in range(total_spaces):

spaces.append(Space())

total_spaces = 20

avail_spaces = 20

rows = 4

# calculate the number of spaces within a row

space_count = int(total_spaces / rows)

# generate the interface border

border = "|"

for i in range(space_count - 1):

for j in range(4):

border += "-"

border += "---|\n"
v1 = enter_vehicle(1, "aaa-bbbb", 0, 3)

v2 = enter_vehicle(3, "ccc-dddd", 1, 2)

v3 = enter_vehicle(2, "eee-ffff", 2, 0)

v4 = enter_vehicle(1, "ggg-hhhh", 3, 1)

v5 = enter_vehicle(2, "iii-jjjj", 2, 4)

# custom epoch times

v1.set_entry_time(1620561600)

v2.set_entry_time(1620570600)

v3.set_entry_time(1620577800)

v4.set_entry_time(1620576000)

v5.set_entry_time(1620586800)

def main():

# read config file

read_config()

# begin accepting user commands

command = ""

while command != "Q":

display_lot()
print("Please Select An Option:\n"

"P - Park a Vehicle\n"

"E - Exit the Lot\n"

"V - View a Parked Vehicle\n"

"R - Display Vehicle Rates\n"

"Q - Quit Application\n")

command = input(">")

command_handler(command)

if __name__ == '__main__':

main()

You might also like