Changeset - 52d1a214c032
[Not reviewed]
default
1 3 1
Laman - 6 years ago 2018-12-12 22:38:32

refactoring and documenting API
5 files changed with 34 insertions and 46 deletions:
0 comments (0 inline, 0 general)
overview.md
Show inline comments
 
new file 100644
 
Processes and threads
 
=====================
 

	
 
Processes communicate through MsgQueues (a wrapper around multiprocessing.Queue). Each owns one incoming and holds any number of outcoming queues. The queue runs in one thread, reads messages and calls handlers on its owner.
 

	
 
Core
 
----
 
* Main process, starts GUI and VideoCapture. Waits for them to finish.
 
* Runs ImageAnalyzer and StateBag.
 
* Messages API:
 
	* putFrame(frame)
 
	* setParams(params)
 
	* fetchFrame(key)
 
	* fetchParams(params)
 

	
 
GUI
 
---
 
* Presents data for the user, handles user input.
 

	
 
VideoCapture
 
------------
 
* Consumes a video stream, sending captured frames to Core.
 
\ No newline at end of file
project.md
Show inline comments
 
deleted file
src/core.py
Show inline comments
 
import multiprocessing
 
import threading
 
import logging
 

	
 
import PIL
 

	
 
import config as cfg
 
from util import MsgQueue
 
from gui import gui
 
from analyzer import ImageAnalyzer
 
@@ -9,7 +12,6 @@ from analyzer.framecache import FrameCac
 
from go.core import Go, isLegalPosition
 
from statebag import StateBag
 
from video import capVideo
 
import config as cfg
 

	
 
log=logging.getLogger(__name__)
 

	
 
@@ -37,16 +39,16 @@ class Core:
 
		)
 
		self._vidProc.start()
 

	
 
	def showFrame(self,key):
 
	def fetchFrame(self,key):
 
		frame=self._cache.get(key)
 
		if frame is None:
 
			(key,frame)=self._cache.getRelative(10)
 
		self._guiMessages.send("setCurrentFrame", (frame.copy(), gui.PREVIEW, key))
 
		self._guiMessages.send("setFrame", (frame.copy(), gui.PREVIEW, key))
 

	
 
	def putFrame(self,frame):
 
		self._frame=PIL.Image.fromarray(frame)
 
		k=self._cache.put(self._frame)
 
		self._guiMessages.send("setCurrentFrame", (self._frame, gui.RECORDING, k))
 
		self._guiMessages.send("setFrame", (self._frame, gui.RECORDING, k))
 
		self.analyze()
 

	
 
	def sendParams(self):
 
@@ -82,8 +84,7 @@ class Core:
 

	
 
	def _handleEvent(self,e):
 
		actions={
 
			"prevFrame": lambda: self.relativeFrame(-1),
 
			"nextFrame": lambda: self.relativeFrame(1),
 
			"fetchFrame": self.fetchFrame,
 
			"putFrame": self.putFrame,
 
			"fetchParams": self.sendParams,
 
			"setParams": self.setParams
src/gui/__init__.py
Show inline comments
 
@@ -72,7 +72,7 @@ class GUI:
 

	
 
	def _handleEvent(self,e):
 
		actions={
 
			"setCurrentFrame": self._frameHandler,
 
			"setFrame": self._frameHandler,
 
			"setGameState": self._stateHandler,
 
			"setParams": self._paramsHandler
 
		}
 
@@ -80,12 +80,12 @@ class GUI:
 

	
 
		return actions[actionName](*args,**kwargs)
 

	
 
	def _frameHandler(self,newFrame,type,key):
 
	def _frameHandler(self,frame,type,key):
 
		if self._state!=type and self.mainWindow.imgView.isSet():
 
			log.info("ignored setCurrentFrame event, wrong type")
 
			log.info("ignored setFrame event, wrong type")
 
			return
 
		self._frameKey=key
 
		self.mainWindow.setCurrentFrame(newFrame)
 
		self.mainWindow.setFrame(frame)
 
		self.root.event_generate("<<redrawImgView>>")
 

	
 
	def _stateHandler(self,gameState,moves):
src/gui/mainwindow.py
Show inline comments
 
@@ -16,7 +16,7 @@ class MainWindow(tk.Frame,MsgMixin):
 
		self.grid(column=0,row=0,sticky=(N,S,E,W))
 
		self._createWidgets()
 

	
 
	def setCurrentFrame(self,frame):
 
	def setFrame(self,frame):
 
		self.imgView.setImg(frame)
 

	
 
	def _createWidgets(self):
0 comments (0 inline, 0 general)