waiter goes to kitchen after collected orders

This commit is contained in:
= 2020-05-12 10:52:56 +02:00
parent 90a9644a32
commit a2e474d520
6 changed files with 82 additions and 44 deletions

View File

@ -77,8 +77,8 @@ drawableManager.add(waiter1)
# TODO: create kitchen # TODO: create kitchen
#kitchen = Kitchen(5, GridCountX-5, 5, GridCountY-5, CellSize, PaintOffset) kitchen = Kitchen(5, GridCountX-5, 5, GridCountY-5, CellSize, PaintOffset)
#drawableManager.add(kitchen) drawableManager.add(kitchen)
#My comment #My comment
# initialize a number of tables given in range # initialize a number of tables given in range

View File

@ -10,22 +10,23 @@ import os
class Kitchen(Drawable): class Kitchen(Drawable):
def __init__(self, minX, maxX, minY, maxY, cellSize, offset): def __init__(self, minX, maxX, minY, maxY, cellSize, offset):
# call base class constructor # call base class constructor
super().__init__(0, 0, minX, maxX, minY, maxY, cellSize, offset) super().__init__(14, 0, minX, maxX, minY, maxY, cellSize, offset)
self._preparing_orders = [] self._preparing_orders = []
self._ready_orders = [] self._ready_orders = []
self._photos_path = os.path.join(os.getcwd(), 'foodImages') self._photos_path = os.path.join(os.getcwd(), 'foodImages')
def get_new_orders(self, orders): def get_new_orders(self, orders):
self._preparing_orders.append(orders) pass
def draw(self, screen): def draw(self, screen):
xBase = self.getX() * self.getCellSize() + self.getOffset() xBase = self.getX() * self.getCellSize() + self.getOffset()
yBase = self.getY() * self.getCellSize() + self.getOffset() yBase = self.getY() * self.getCellSize() + self.getOffset()
tableXYOffset = int(0.2 * self.getCellSize()) # tableXYOffset = int(0.2 * self.getCellSize())
tableXYOffset = 0
image = self.getImage(Images.Kitchen) image = self.getImage(Images.Kitchen)
screen.blit(image, (xBase - tableXYOffset, yBase - tableXYOffset)) screen.blit(image, (xBase - tableXYOffset, yBase - tableXYOffset))
def drawAux(self, screen): def drawAux(self, screen):
pass pass

View File

@ -21,8 +21,9 @@ class Waiter(Drawable):
super().__init__(x, y, minX, maxX, minY, maxY, cellSize, offset) super().__init__(x, y, minX, maxX, minY, maxY, cellSize, offset)
self.__dx = Direction.Down[0] self.__dx = Direction.Down[0]
self.__dy = Direction.Down[1] self.__dy = Direction.Down[1]
self.__acceptedOrders = [] self.__acceptedOrders = dict()
self.__currentPath = [] self.__currentPath = []
self._ready = True
def moveUp(self): def moveUp(self):
if self.getY() > self.getMinY(): if self.getY() > self.getMinY():
@ -75,6 +76,7 @@ class Waiter(Drawable):
def getDirection(self): def getDirection(self):
return self.__dx, self.__dy return self.__dx, self.__dy
def setDirection(self, dx, dy): def setDirection(self, dx, dy):
self.__dx = dx self.__dx = dx
self.__dy = dy self.__dy = dy
@ -103,7 +105,7 @@ class Waiter(Drawable):
# accepts orders from the table and stores them in queue # accepts orders from the table and stores them in queue
def addOrder(self, table, order): def addOrder(self, table, order):
self.__acceptedOrders += [(table, order)] self.__acceptedOrders[table] = order
def getAcceptedOrders(self): def getAcceptedOrders(self):
return self.__acceptedOrders return self.__acceptedOrders
@ -117,6 +119,20 @@ class Waiter(Drawable):
def popStepFromPath(self): def popStepFromPath(self):
return self.__currentPath.pop(0) return self.__currentPath.pop(0)
def get_current_path(self):
return self.__currentPath
def make_busy(self):
self._ready = False
def make_ready(self):
self._ready = True
def get_state(self):
return self._ready
def draw(self, screen): def draw(self, screen):
direction = self.getDirection() direction = self.getDirection()
imageKind = None imageKind = None

View File

@ -3,6 +3,7 @@ from threading import Lock
from kelner.src.components.Table import Table from kelner.src.components.Table import Table
from kelner.src.components.Waiter import Waiter from kelner.src.components.Waiter import Waiter
from kelner.src.components.Kitchen import Kitchen
# drawable objects manager # drawable objects manager
@ -59,6 +60,14 @@ class DrawableCollection:
result += [item] result += [item]
return result return result
def get_kitchen(self):
kitchen = None
for item in self.__drawables:
if isinstance(item, Kitchen):
kitchen = item
return kitchen
# gets all waiters from collection # gets all waiters from collection
def getWaiters(self): def getWaiters(self):
result = [] result = []

View File

@ -4,20 +4,14 @@ import sys
# creates new thread # creates new thread
class KitchenManager(threading.Thread): class KitchenManager():
def __init__(self, drawable_manager, images_storage): def __init__(self, drawable_manager):
super().__init__()
self._drawable_manager = drawable_manager self._drawable_manager = drawable_manager
self._runThread = True
self._images_storage = images_storage
def prepare_dish(self): def prepare_dish(self):
pass pass
def run(self): def receive_orders(self, orders, kitchen):
while self._runThread: kitchen.get_new_orders(orders)
pass
def stop(self):
self._runThread = False

View File

@ -3,7 +3,8 @@ import time
import sys import sys
from kelner.src.components.Table import Status from kelner.src.components.Table import Status
from kelner.src.algorithms.AStar.Finder import Finder from kelner.src.algorithms.AStar.Finder import Finder
from kelner.src.algorithms.BFS.BFS import BFS
from kelner.src.managers.KitchenManager import KitchenManager
# creates new thread # creates new thread
class WaiterManager (threading.Thread): class WaiterManager (threading.Thread):
@ -13,8 +14,10 @@ class WaiterManager (threading.Thread):
self.__drawableManager = drawableManager self.__drawableManager = drawableManager
self.__waiters = waiters self.__waiters = waiters
self.__runThread = True self.__runThread = True
self._kitchen_manager = KitchenManager(drawableManager)
def __getNearestTargetPath(self, waiter):
def __getNearestTargetPath(self, waiter, target):
distance = sys.maxsize distance = sys.maxsize
nearestTargetPath = None nearestTargetPath = None
tables = self.__drawableManager.getTables(Status.Ready) tables = self.__drawableManager.getTables(Status.Ready)
@ -22,17 +25,20 @@ class WaiterManager (threading.Thread):
reservedPlaces = self.__drawableManager.getReservedPlaces(waiter) reservedPlaces = self.__drawableManager.getReservedPlaces(waiter)
finder = Finder(reservedPlaces) finder = Finder(reservedPlaces)
origin = (waiter.getX(), waiter.getY()) origin = (waiter.getX(), waiter.getY())
for table in tables: if target == 'kitchen':
if table.hasOrder(): path = finder.getPath(origin, (14, 1), True)
targets = finder.getNeighbours((table.getX(), table.getY()), False) else:
for target in targets: for table in tables:
if target is not None: if table.hasOrder():
path = finder.getPath(origin, target, True) targets = finder.getNeighbours((table.getX(), table.getY()), False)
if path: for target in targets:
result = len(path) if target is not None:
if result < distance: path = finder.getPath(origin, target, True)
distance = result if path:
nearestTargetPath = path result = len(path)
if result < distance:
distance = result
nearestTargetPath = path
return nearestTargetPath return nearestTargetPath
def __changeWaiterDirection(self, waiter, x, y): def __changeWaiterDirection(self, waiter, x, y):
@ -52,7 +58,7 @@ class WaiterManager (threading.Thread):
def __collectOrder(self, waiter): def __collectOrder(self, waiter):
doCollectOrder = True doCollectOrder = True
while doCollectOrder: while doCollectOrder and waiter.get_state():
tables = self.__drawableManager.getNearestTables(waiter, Status.Ready) tables = self.__drawableManager.getNearestTables(waiter, Status.Ready)
turns = sys.maxsize turns = sys.maxsize
lessTurnsTable = None lessTurnsTable = None
@ -77,24 +83,36 @@ class WaiterManager (threading.Thread):
self.__drawableManager.forceRepaint() self.__drawableManager.forceRepaint()
doCollectOrder = len(tables) > 0 doCollectOrder = len(tables) > 0
def pass_orders_to_kitchen(self, orders):
kitchen = self.__drawableManager.get_kitchen()
self._kitchen_manager.receive_orders(orders, kitchen)
# changes the status of a random table from NotReady to Ready # changes the status of a random table from NotReady to Ready
def run(self): def run(self):
while self.__runThread: while self.__runThread:
if self.__waiters: if self.__waiters:
for waiter in self.__waiters: for waiter in self.__waiters:
if len(waiter.getAcceptedOrders()) < 5: target = 'table'
path = self.__getNearestTargetPath(waiter) if len(waiter.getAcceptedOrders()) > 0:
waiter.setPath([] if path is None else path) target = 'kitchen'
path = self.__getNearestTargetPath(waiter, target=target)
waiter.make_busy()
if not waiter.isPathEmpty():
step = waiter.popStepFromPath()
self.__changeWaiterDirection(waiter, step[0], step[1])
self.__moveWaiter(waiter, step[0], step[1])
if waiter.isPathEmpty():
self.__collectOrder(waiter)
else: else:
waiter.goToKitchen() path = self.__getNearestTargetPath(waiter, target='table')
waiter.setPath([] if path is None else path)
if not waiter.isPathEmpty():
step = waiter.popStepFromPath()
self.__changeWaiterDirection(waiter, step[0], step[1])
self.__moveWaiter(waiter, step[0], step[1])
if len(waiter.get_current_path()) == 0 and target == 'kitchen':
self.pass_orders_to_kitchen(waiter.getAcceptedOrders)
print(waiter.getAcceptedOrders())
else:
self.__collectOrder(waiter)
def stop(self): def stop(self):
self.__runThread = False self.__runThread = False