diff --git a/src/core.py b/src/core.py --- a/src/core.py +++ b/src/core.py @@ -1,49 +1,61 @@ import multiprocessing +import logging as log import PIL -from corners import Corners from gui import gui +from image_analyzer import ImageAnalyzer +from go import Go class Core: - corners=Corners() - tresW=60.0 - tresB=30.0 + def __init__(self): + self.grid=None + self.go=Go() + self.detector=ImageAnalyzer() + self.tresW=60.0 + self.tresB=30.0 - @staticmethod - def setCorners(corners): - Core.corners=corners + self._msgQueue=multiprocessing.Queue() + self._guiQueue=multiprocessing.Queue() + self._incomingEvent=multiprocessing.Event() + self._guiEvent=multiprocessing.Event() - @staticmethod - def setTresholds(tresB=None,tresW=None): - if tresB is not None: Core.tresB=tresB - if tresW is not None: Core.tresW=tresW + self._frame=PIL.Image.open("../images/7.jpg") + self._guiProc=multiprocessing.Process(name="gui", target=gui, args=(self._guiQueue,self._guiEvent,self._msgQueue,self._incomingEvent)) + self._guiProc.start() + self._guiQueue.put(("setCurrentFrame",(self._frame,),dict())) + self._guiEvent.set() -msgQueue=multiprocessing.Queue() -guiQueue=multiprocessing.Queue() -incomingEvent=multiprocessing.Event() -guiEvent=multiprocessing.Event() + def setCorners(self,corners): + self.detector.setGridCorners(corners) + self.detector.analyze(self._frame) + for r in self.detector.board: log.info(r) -frame=PIL.Image.open("../images/7.jpg") + def setTresholds(self,tresB=None,tresW=None): + if tresB is not None: self.tresB=tresB + if tresW is not None: self.tresW=tresW -guiProc=multiprocessing.Process(name="gui",target=gui,args=(guiQueue,guiEvent,msgQueue,incomingEvent)) -guiProc.start() -guiQueue.put(("setCurrentFrame",(frame,None),dict())) -guiEvent.set() + def listen(self): + while True: + self._incomingEvent.wait() + msg=self._msgQueue.get() + if self._msgQueue.empty(): + self._incomingEvent.clear() + log.info(msg) + self._handleEvent(msg) -while True: - incomingEvent.wait() - msg=msgQueue.get() - if msgQueue.empty(): - incomingEvent.clear() - print(msg) + def _handleEvent(self,e): + actions={"setCorners":self.setCorners, "setTresholds":self.setTresholds} + (actionName,args,kwargs)=e + return actions[actionName](*args,**kwargs) -# !! always pass object copies, don't share instances +core=Core() +core.listen() + """ core ==== -corners grid go imageAnalyzer @@ -51,6 +63,8 @@ imageAnalyzer gui === +corners + a) keeps references to important objects and uses them b) gets and sets all relevant data through method calls with core @@ -61,4 +75,7 @@ GUI BoardView -> redrawState(go) + + +core-gui: just pass messages with relevant data (!! always pass object copies, don't share instances) """ \ No newline at end of file