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 */