// -- private methods private void ChangeState(UsiEngineState state) { switch (state) { case UsiEngineState.Connected: // 接続されたので"usi"と送信 // これ、接続タイムアウトがある。 connected_time = DateTime.Now; SendCommand("usi"); break; case UsiEngineState.UsiOk: // このタイミングで状態が変更になったことを通知すべき // エンジン設定時には、この状態で待たせておけば良い。 // 対局時には、このあと "isready"を送信して readyokを待つ。 if (!EngineSetting) { // これ時間制限はなく、タイムアウトは監視しない。どこかでisreadyは完了するものとする。 SendCommand("isready"); } break; case UsiEngineState.InTheGame: // "readyok"が来たのでusinewgameを送信して、対局の局面を送信できるようにしておく。 SendCommand("usinewgame"); break; } var oldState = State; State = state; Log.Write(LogInfoType.UsiServer, $"ChangeState()で{oldState.ToString()}から{state.ToString()}に状態が変化した。"); }
// -- private methods private void ChangeState(UsiEngineState state) { var oldState = State; State = state; // この瞬間にイベントが発生するので、これを先にやっておかないとSendSetOptionList()などで困る。 Log.Write(LogInfoType.UsiServer, $"ChangeState()で{oldState.ToString()}から{state.ToString()}に状態が変化した。"); switch (state) { case UsiEngineState.Connected: // 接続されたので"usi"と送信 SendCommand("usi"); State = UsiEngineState.WaitUsiOk; // これ、応答タイムアウトがある。15秒。 // これを超えるなら定期的に改行などkeep alive的な何かをエンジン側から定期的に送信すべきである。 ResetTimeOutTime(); break; case UsiEngineState.UsiOk: // このタイミングで状態が変更になったことを通知すべき // エンジン設定時には、この状態で待たせておけば良い。 // 対局時には、このあと "isready"を送信して readyokを待つ。 if (!EngineSetting) { // このタイミングでoptionを先に送らないとEvalDirの変更などが間に合わない。 SendSetOptionList(); SendCommand("isready"); State = UsiEngineState.WaitReadyOk; // これもタイムアウトがある。30秒。 // これを超えるなら定期的に改行などkeep alive的な何かをエンジン側から定期的に送信すべきである。 ResetTimeOutTime(); } break; case UsiEngineState.InTheGame: // "readyok"が来たのでusinewgameを送信して、対局の局面を送信できるようにしておく。 SendCommand("usinewgame"); break; // -- time out case UsiEngineState.ConnectionTimeout: throw new Exception("エンジンからの応答がtimeoutになりました。エンジンのusiコマンドに対する応答が遅すぎます。" + "毎回タイムアウトになるなら、設定→エンジン補助設定でusiコマンドに対するタイムアウトまでの時間を増やしてください。"); case UsiEngineState.IsReadyTimeout: throw new Exception("エンジンからの応答がtimeoutになりました。エンジンのisreadyコマンドに対する応答が遅すぎます。" + "毎回タイムアウトになるなら、設定→エンジン補助設定でisreadyコマンドに対するタイムアウトまでの時間を増やしてください。"); // これ以外の変化に対する応答は必要ない。 } }
// -- private methods private void ChangeState(UsiEngineState state) { var oldState = State; State = state; // この瞬間にイベントが発生するので、これを先にやっておかないとSendSetOptionList()などで困る。 Log.Write(LogInfoType.UsiServer, $"ChangeState()で{oldState.ToString()}から{state.ToString()}に状態が変化した。"); switch (state) { case UsiEngineState.Connected: // 接続されたので"usi"と送信 // これ、応答タイムアウトがあるので現在時刻を保存。 connected_time = DateTime.Now; SendCommand("usi"); break; case UsiEngineState.UsiOk: // このタイミングで状態が変更になったことを通知すべき // エンジン設定時には、この状態で待たせておけば良い。 // 対局時には、このあと "isready"を送信して readyokを待つ。 if (!EngineSetting) { // このタイミングでoptionを先に送らないとEvalDirの変更などが間に合わない。 SendSetOptionList(); // これ時間制限はなく、タイムアウトは監視しない。どこかでisreadyは完了するものとする。 SendCommand("isready"); } break; case UsiEngineState.InTheGame: // "readyok"が来たのでusinewgameを送信して、対局の局面を送信できるようにしておく。 SendCommand("usinewgame"); break; case UsiEngineState.ConnectionTimeout: throw new Exception("エンジンからの応答がtimeoutになりました。エンジンのusiコマンドに対する応答が遅すぎます。"); // これ以外の変化に対する応答は必要ない。 } }