/* * Copyright (c) 2018. Developed by Hedgecode. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.hedgecode.chess.hedgefish; import org.hedgecode.chess.uci.CommandExecutor; import org.hedgecode.chess.uci.Engine; import org.hedgecode.chess.uci.EngineException; import org.hedgecode.chess.uci.EngineRunner; import org.hedgecode.chess.uci.Transmitter; import org.hedgecode.chess.uci.UCIConstants; import org.hedgecode.chess.uci.annotation.CommandDirection; /** * Hedgefish UCI Engine Runner. * * @author Dmitry Samoshin aka gotty */ public final class HedgefishEngineRunner implements EngineRunner { private HedgefishEngine engine; private boolean isRunning; HedgefishEngineRunner() { engine = new HedgefishEngine(); isRunning = false; } @Override public Engine init() throws EngineException { if (isRunning) throw new EngineException("uci.engine.already.run"); return engine; } @Override public void run(final CommandExecutor commandExecutor) throws EngineException { if (isRunning) throw new EngineException("uci.engine.already.run"); Thread engineThread = new Thread( new Runnable() { public void run() { Transmitter engineTransmitter = engine.transmitter(); try { while (engineTransmitter.isActive()) { if (engineTransmitter.hasCommand()) { HedgefishCommand command = engineTransmitter.transmitCommand(); commandExecutor.exec( command.getName(), CommandDirection.FROM_ENGINE, command.getParams() ); } } } finally { commandExecutor.exec( UCIConstants.TERMINATE, CommandDirection.FROM_ENGINE, null ); engineTransmitter.close(); isRunning = false; } } } ); engineThread.start(); isRunning = true; } }