interface.rs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. use std::io::{self, BufRead};
  2. use std::collections::BTreeMap;
  3. use std::sync::mpsc::{Receiver, Sender};
  4. use std::process::exit;
  5. use engine::{EngineMsg, InterfaceMsg, SearchInfo};
  6. use game::{Game};
  7. use log::info;
  8. pub fn run(r: Receiver<InterfaceMsg>, s: Sender<EngineMsg>) {
  9. //unsafe { debug_log = Box::new(File::open("debug.log").unwrap()); }
  10. //unsafe { debug_log = Arc::new(Some(Mutex::new(File::create("~/debug.log").unwrap()))) };
  11. let stdin = io::stdin();
  12. for line_m in stdin.lock().lines() {
  13. let line = line_m.unwrap();
  14. info!("received line: {}", line);
  15. let split = line.split_whitespace().collect::<Vec<&str>>();
  16. run_command(split, &r, &s);
  17. }
  18. }
  19. fn run_command(mut cmd: Vec<&str>, r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  20. if cmd.len() > 0 {
  21. let command = cmd[0];
  22. cmd.drain(0..1);
  23. match command {
  24. "uci" => cmd_uci(cmd),
  25. "isready" => cmd_isready(cmd, r, s),
  26. "position" => cmd_position(cmd, r, s),
  27. "print" => cmd_print(cmd, r, s),
  28. "go" => cmd_go(cmd, r, s),
  29. "stop" => cmd_stop(cmd, r, s),
  30. "ucinewgame" => cmd_newgame(cmd, r, s),
  31. //"setoption" => cmd_setoption(cmd, r, s),
  32. "quit" | "exit" => cmd_quit(cmd, r, s),
  33. cmd => { println!("unknown command: {}", cmd); }
  34. }
  35. }
  36. }
  37. fn cmd_uci(_args: Vec<&str>) {
  38. println!("id name bishop 1.0");
  39. println!("id author Geile Siech");
  40. println!("uciok");
  41. }
  42. fn cmd_isready(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  43. s.send(EngineMsg::IsReady).unwrap();
  44. }
  45. fn cmd_position(mut args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  46. let position = args[0];
  47. args.drain(0..1);
  48. let mut game = Game::default();
  49. if position == "startpos" {
  50. }
  51. else if position == "fen" {
  52. let fen_parts: Vec<&str> = Vec::from(&args[0..6]).into_iter().collect::<Vec<&str>>();
  53. game = Game::from_fen(fen_parts.as_slice()).unwrap_or_else(|| {
  54. info!("invalid fen");
  55. println!("invalid fen");
  56. Game::default()
  57. });
  58. args.drain(0..6);
  59. }
  60. let moves =
  61. if args.len() > 0 {
  62. if args[0] != "moves" {
  63. info!("unexpected {}", args[6]);
  64. println!("unexpected {}", args[6]);
  65. }
  66. args.drain(0..1);
  67. args.into_iter().map(|m| String::from(m)).collect::<Vec<String>>()
  68. }
  69. else {
  70. Vec::new()
  71. };
  72. s.send(EngineMsg::SetBoard{ pos: game, moves }).unwrap();
  73. }
  74. fn cmd_print(mut _args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  75. s.send(EngineMsg::Print).unwrap();
  76. }
  77. fn cmd_go(args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  78. let mut options: BTreeMap<String, String> = BTreeMap::new();
  79. let mut opt_name: Option<&str> = None;
  80. let mut si = SearchInfo::new();
  81. for arg in args {
  82. if let Some(on) = opt_name {
  83. options.insert(on.to_owned(), arg.to_owned());
  84. opt_name = None;
  85. }
  86. else if arg == "infinite" {
  87. si.infinite = true;
  88. }
  89. else if arg == "perft" {
  90. si.perft = true;
  91. }
  92. else {
  93. opt_name = Some(arg);
  94. }
  95. }
  96. si.movetime = options.get("movetime").map(|x| x.parse::<_>().unwrap_or(0));
  97. si.depth = options.get("depth").map(|x| x.parse::<_>().unwrap_or(0));
  98. si.wtime = options.get("wtime").map(|x| x.parse::<_>().unwrap_or(0));
  99. si.btime = options.get("btime").map(|x| x.parse::<_>().unwrap_or(0));
  100. si.winc = options.get("winc").map(|x| x.parse::<_>().unwrap_or(0));
  101. si.binc = options.get("binc").map(|x| x.parse::<_>().unwrap_or(0));
  102. si.movestogo = options.get("movestogo").map(|x| x.parse::<_>().unwrap_or(0));
  103. s.send(EngineMsg::Search(si)).unwrap();
  104. }
  105. fn cmd_stop(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  106. s.send(EngineMsg::Stop).unwrap();
  107. }
  108. fn cmd_newgame(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  109. s.send(EngineMsg::NewGame).unwrap();
  110. }
  111. fn cmd_quit(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, _s: &Sender<EngineMsg>) {
  112. exit(0);
  113. }