!7 cmodule PipelinedRecognizer > DynImageSurface { transient ChessOCR_Pipeline activePipeline; transient JTable tblBoardsFound; transient ChessPieceRecognizer pieceRecognizer; transient ReliableSingleThread rst = dm_rst(module(), r newRecognition); start { if (!hasImage()) setImage(whiteImage(100)); onNewImage = rst; rst.trigger(); } void newRecognition { dispose activePipeline; if (!hasImage()) ret; new ChessOCR_Pipeline pipeline; pipeline.inputImage = getImage(); if (pieceRecognizer == null) pieceRecognizer = chessOCR_pieceRecognizer(); pipeline.pieceRecognizer = pieceRecognizer; pipeline.boardsFound.onChange.add(r updateTable); activePipeline = pipeline; pipeline.addSegmenter(parameterizedSegmenterFromAGIBlue("GingerGM fullscreen find chess board #1")); } void updateTable { dataToTable(tblBoardsFound, sortedByMapElementDesc Score(map(activePipeline.boardsFound.byFEN, (fen, data) -> litorderedmap("Score" := data.bestScore, "FEN" := fen)))); } visual jvsplit(super, jCenteredSection("Boards found", tblBoardsFound = sexyTable())); }