interface.rs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. use search::apply_move;
  2. use std::io::{self, BufRead};
  3. use std::sync::mpsc::{Receiver, Sender};
  4. use std::process::exit;
  5. use engine::{EngineMsg, InterfaceMsg, SearchInfo};
  6. use game::{Game};
  7. use std::thread::sleep_ms;
  8. use log::info;
  9. pub fn run(r: Receiver<InterfaceMsg>, s: Sender<EngineMsg>) {
  10. //unsafe { debug_log = Box::new(File::open("debug.log").unwrap()); }
  11. //unsafe { debug_log = Arc::new(Some(Mutex::new(File::create("~/debug.log").unwrap()))) };
  12. let stdin = io::stdin();
  13. for line_m in stdin.lock().lines() {
  14. let line = line_m.unwrap();
  15. info!("received line: {}", line);
  16. let split = line.split_whitespace().collect::<Vec<&str>>();
  17. run_command(split, &r, &s);
  18. }
  19. }
  20. fn run_command(mut cmd: Vec<&str>, r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  21. if cmd.len() > 0 {
  22. let command = cmd[0];
  23. cmd.drain(0..1);
  24. match command {
  25. "uci" => cmd_uci(cmd),
  26. "isready" => cmd_isready(cmd),
  27. "position" => cmd_position(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. "quit" | "exit" => cmd_quit(cmd, r, s),
  32. cmd => { println!("unknown command: {}", cmd); }
  33. }
  34. }
  35. }
  36. fn cmd_uci(_args: Vec<&str>) {
  37. println!("id name bishop 1.0");
  38. println!("id author Geile Siech");
  39. println!("uciok");
  40. }
  41. fn cmd_isready(_args: Vec<&str>) {
  42. println!("readyok");
  43. }
  44. fn cmd_position(mut args: Vec<&str>, r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  45. let position = args[0];
  46. args.drain(0..1);
  47. let mut game = Game::default();
  48. if position == "startpos" {
  49. }
  50. else if position == "fen" {
  51. let fen_parts: Vec<&str> = Vec::from(&args[0..6]).into_iter().collect::<Vec<&str>>();
  52. let moves = &args[6..];
  53. game = Game::from_fen(fen_parts.as_slice()).unwrap();
  54. for mov in moves {
  55. let m = game.parse_move(mov);
  56. if let Ok(mm) = m {
  57. game = apply_move(&game, mm);
  58. }
  59. else {
  60. println!("error");
  61. }
  62. }
  63. }
  64. s.send(EngineMsg::SetBoard(game)).unwrap();
  65. }
  66. fn cmd_go(args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  67. s.send(EngineMsg::Search(SearchInfo::Movetime(1000))).unwrap();
  68. }
  69. fn cmd_stop(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  70. s.send(EngineMsg::Stop).unwrap();
  71. }
  72. fn cmd_newgame(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  73. s.send(EngineMsg::NewGame).unwrap();
  74. }
  75. fn cmd_quit(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, _s: &Sender<EngineMsg>) {
  76. exit(0);
  77. }