From 6b04258f95ab3e58539fbd0485d180aae81c51ec Mon Sep 17 00:00:00 2001 From: Peter Osterlund Date: Sat, 7 Jan 2012 10:33:20 +0000 Subject: [PATCH] DroidFish: Don't send UCI options that an engine doesn't understand. --- .../droidfish/engine/DroidComputerPlayer.java | 28 +++++++++++-------- .../petero/droidfish/engine/UCIEngine.java | 6 ++++ .../droidfish/engine/UCIEngineBase.java | 24 +++++++++++++--- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/DroidFish/src/org/petero/droidfish/engine/DroidComputerPlayer.java b/DroidFish/src/org/petero/droidfish/engine/DroidComputerPlayer.java index a6c3d5f..55f800d 100644 --- a/DroidFish/src/org/petero/droidfish/engine/DroidComputerPlayer.java +++ b/DroidFish/src/org/petero/droidfish/engine/DroidComputerPlayer.java @@ -570,6 +570,7 @@ public class DroidComputerPlayer { }); engineMonitor.start(); + uciEngine.clearOptions(); uciEngine.writeLineToEngine("uci"); int nThreads = getNumCPUs(); if (nThreads > 8) nThreads = 8; @@ -615,9 +616,8 @@ public class DroidComputerPlayer { switch (engineState.state) { case READ_OPTIONS: { - if (readUCIOption(s)) { + if (readUCIOption(uci, s)) { uci.initOptions(); - uci.setOption("Ponder", false); uci.writeLineToEngine("ucinewgame"); uci.writeLineToEngine("isready"); engineState.state = MainState.WAIT_READY; @@ -666,7 +666,7 @@ public class DroidComputerPlayer { } /** Handle reading of UCI options. Return true when finished. */ - private final boolean readUCIOption(String s) { + private final boolean readUCIOption(UCIEngine uci, String s) { String[] tokens = tokenize(s); if (tokens[0].equals("uciok")) return true; @@ -681,15 +681,19 @@ public class DroidComputerPlayer { } listener.notifyEngineName(engineName); } - } else if ((tokens.length > 2) && tokens[2].toLowerCase().equals("multipv")) { - try { - for (int i = 3; i < tokens.length; i++) { - if (tokens[i].equals("max") && (i+1 < tokens.length)) { - maxPV = Math.max(maxPV, Integer.parseInt(tokens[i+1])); - break; + } else if (tokens.length > 2) { + String optName = tokens[2].toLowerCase(); + uci.registerOption(optName); + if (optName.equals("multipv")) { + try { + for (int i = 3; i < tokens.length; i++) { + if (tokens[i].equals("max") && (i+1 < tokens.length)) { + maxPV = Math.max(maxPV, Integer.parseInt(tokens[i+1])); + break; + } } - } - } catch (NumberFormatException nfe) { } + } catch (NumberFormatException nfe) { } + } } return false; } @@ -882,7 +886,7 @@ public class DroidComputerPlayer { return; lastGUIUpdate = now; - if (searchRequest == null) + if ((searchRequest == null) || (searchRequest.currPos == null)) return; int id = engineState.searchId; diff --git a/DroidFish/src/org/petero/droidfish/engine/UCIEngine.java b/DroidFish/src/org/petero/droidfish/engine/UCIEngine.java index d38cc16..c9ed733 100644 --- a/DroidFish/src/org/petero/droidfish/engine/UCIEngine.java +++ b/DroidFish/src/org/petero/droidfish/engine/UCIEngine.java @@ -59,4 +59,10 @@ public interface UCIEngine { /** Set an engine string option. */ public void setOption(String name, String value); + + /** Clear list of supported options. */ + public void clearOptions(); + + /** Register an option as supported by the engine. */ + public void registerOption(String optName); } diff --git a/DroidFish/src/org/petero/droidfish/engine/UCIEngineBase.java b/DroidFish/src/org/petero/droidfish/engine/UCIEngineBase.java index 0caab3c..61ca19d 100644 --- a/DroidFish/src/org/petero/droidfish/engine/UCIEngineBase.java +++ b/DroidFish/src/org/petero/droidfish/engine/UCIEngineBase.java @@ -19,6 +19,7 @@ package org.petero.droidfish.engine; import java.util.HashMap; +import java.util.HashSet; import org.petero.droidfish.engine.cuckoochess.CuckooChessEngine; @@ -27,6 +28,8 @@ import android.content.Context; public abstract class UCIEngineBase implements UCIEngine { private boolean processAlive; + private HashSet allOptions; + private HashMap currOptions; public static UCIEngine getEngine(Context context, String engine, Report report) { if ("stockfish".equals(engine) && (EngineUtil.internalStockFishName() == null)) @@ -41,6 +44,8 @@ public abstract class UCIEngineBase implements UCIEngine { protected UCIEngineBase() { processAlive = false; + allOptions = new HashSet(); + currOptions = new HashMap(); } protected abstract void startProcess(); @@ -61,6 +66,16 @@ public abstract class UCIEngineBase implements UCIEngine { } } + @Override + public void clearOptions() { + allOptions.clear(); + } + + @Override + public void registerOption(String optName) { + allOptions.add(optName); + } + @Override public void setOption(String name, int value) { setOption(name, String.format("%d", value)); @@ -71,14 +86,15 @@ public abstract class UCIEngineBase implements UCIEngine { setOption(name, value ? "true" : "false"); } - private HashMap options = new HashMap(); - @Override public void setOption(String name, String value) { - String currVal = options.get(name.toLowerCase()); + String lcName = name.toLowerCase(); + if (!allOptions.contains(lcName)) + return; + String currVal = currOptions.get(lcName); if (value.equals(currVal)) return; writeLineToEngine(String.format("setoption name %s value %s", name, value)); - options.put(name.toLowerCase(), value); + currOptions.put(lcName, value); } }