diff --git a/DroidFish/res/values/strings.xml b/DroidFish/res/values/strings.xml index 7d236e4..e9e5181 100644 --- a/DroidFish/res/values/strings.xml +++ b/DroidFish/res/values/strings.xml @@ -409,6 +409,7 @@ you are not actively using the program.\ CuckooChess Failed to start engine Engine terminated + UCI protocol error Too few spaces Invalid piece diff --git a/DroidFish/src/org/petero/droidfish/engine/ExternalEngine.java b/DroidFish/src/org/petero/droidfish/engine/ExternalEngine.java index 5a6e0ba..799a876 100644 --- a/DroidFish/src/org/petero/droidfish/engine/ExternalEngine.java +++ b/DroidFish/src/org/petero/droidfish/engine/ExternalEngine.java @@ -41,22 +41,26 @@ public class ExternalEngine extends UCIEngineBase { private static final String exePath = "/data/data/org.petero.droidfish/engine.exe"; private final Report report; private Process engineProc; + private Thread startupThread; private Thread exitThread; private Thread stdInThread; private Thread stdErrThread; private List inLines; private boolean startedOk; + private boolean isRunning; public ExternalEngine(Context context, String engine, Report report) { this.context = context; this.report = report; engineFileName = new File(engine); engineProc = null; + startupThread = null; exitThread = null; stdInThread = null; stdErrThread = null; inLines = new LinkedList(); startedOk = false; + isRunning = false; } /** @inheritDoc */ @@ -68,11 +72,26 @@ public class ExternalEngine extends UCIEngineBase { ProcessBuilder pb = new ProcessBuilder(exePath); engineProc = pb.start(); + startupThread = new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + return; + } + if (startedOk && isRunning && !isUCI) + report.reportError(context.getString(R.string.uci_protocol_error)); + } + }); + startupThread.start(); + exitThread = new Thread(new Runnable() { @Override public void run() { try { engineProc.waitFor(); + isRunning = false; if (!startedOk) report.reportError(context.getString(R.string.failed_to_start_engine)); else { @@ -96,13 +115,18 @@ public class ExternalEngine extends UCIEngineBase { BufferedReader br = new BufferedReader(isr, 8192); String line; try { + boolean first = true; while ((line = br.readLine()) != null) { if ((ep == null) || Thread.currentThread().isInterrupted()) return; synchronized (inLines) { inLines.add(line); inLines.notify(); - startedOk = true; + if (first) { + startedOk = true; + isRunning = true; + first = false; + } } } } catch (IOException e) { @@ -138,6 +162,7 @@ public class ExternalEngine extends UCIEngineBase { /** @inheritDoc */ @Override public void initOptions() { + super.initOptions(); setOption("Hash", 16); } @@ -187,6 +212,8 @@ public class ExternalEngine extends UCIEngineBase { /** @inheritDoc */ @Override public void shutDown() { + if (startupThread != null) + startupThread.interrupt(); if (exitThread != null) exitThread.interrupt(); super.shutDown(); diff --git a/DroidFish/src/org/petero/droidfish/engine/InternalStockFish.java b/DroidFish/src/org/petero/droidfish/engine/InternalStockFish.java index e99f57a..7144495 100644 --- a/DroidFish/src/org/petero/droidfish/engine/InternalStockFish.java +++ b/DroidFish/src/org/petero/droidfish/engine/InternalStockFish.java @@ -38,12 +38,6 @@ public class InternalStockFish extends ExternalEngine { super(context, "", report); } - /** @inheritDoc */ - @Override - public final void initOptions() { - setOption("Hash", 16); - } - /** @inheritDoc */ @Override public final void setStrength(int strength) { diff --git a/DroidFish/src/org/petero/droidfish/engine/UCIEngineBase.java b/DroidFish/src/org/petero/droidfish/engine/UCIEngineBase.java index 61ca19d..1c3e702 100644 --- a/DroidFish/src/org/petero/droidfish/engine/UCIEngineBase.java +++ b/DroidFish/src/org/petero/droidfish/engine/UCIEngineBase.java @@ -30,6 +30,7 @@ public abstract class UCIEngineBase implements UCIEngine { private boolean processAlive; private HashSet allOptions; private HashMap currOptions; + protected boolean isUCI; public static UCIEngine getEngine(Context context, String engine, Report report) { if ("stockfish".equals(engine) && (EngineUtil.internalStockFishName() == null)) @@ -46,6 +47,7 @@ public abstract class UCIEngineBase implements UCIEngine { processAlive = false; allOptions = new HashSet(); currOptions = new HashMap(); + isUCI = false; } protected abstract void startProcess(); @@ -58,6 +60,11 @@ public abstract class UCIEngineBase implements UCIEngine { } } + @Override + public void initOptions() { + isUCI = true; + } + @Override public void shutDown() { if (processAlive) { diff --git a/DroidFish/src/org/petero/droidfish/engine/cuckoochess/CuckooChessEngine.java b/DroidFish/src/org/petero/droidfish/engine/cuckoochess/CuckooChessEngine.java index c12bc0b..46911a6 100644 --- a/DroidFish/src/org/petero/droidfish/engine/cuckoochess/CuckooChessEngine.java +++ b/DroidFish/src/org/petero/droidfish/engine/cuckoochess/CuckooChessEngine.java @@ -84,6 +84,7 @@ public class CuckooChessEngine extends UCIEngineBase { /** @inheritDoc */ @Override public final void initOptions() { + super.initOptions(); } /** @inheritDoc */