diff --git a/ArduChess.ino b/ArduChess.ino index 9841703..07fc84e 100644 --- a/ArduChess.ino +++ b/ArduChess.ino @@ -8,6 +8,7 @@ #include "Move.h" #include "Movegen.h" #include "Types.h" +#include "Uci.h" unsigned long pseudo_perft(byte depth) { // only checks pseudolegality @@ -182,4 +183,5 @@ void setup() { void loop() { // put your main code here, to run repeatedly: + handle_uci(); } diff --git a/Uci.h b/Uci.h new file mode 100644 index 0000000..f940b99 --- /dev/null +++ b/Uci.h @@ -0,0 +1,78 @@ +#ifndef __UCI_H_INC +#define __UCI_H_INC + +typedef void uci_return; +typedef uci_return (*uci_handler)(); + +struct uci_cmd { + char* command; + uci_handler handler; +}; + +uci_return uci_hello() { + Serial.println(F("id name ArduChess\nid author Quinten Kock\nuciok")); +} + +uci_return uci_unimpl() { + Serial.println(F("Function not implemented yet")); +} + +uci_return uci_unknown() { + Serial.println(F("Not an UCI command")); +} + +const uci_cmd UCI_COMMANDS[] = { + {"uci", &uci_hello}, + {"debug", &uci_unimpl}, + {"isready", &uci_unimpl}, + {"setoption", &uci_unimpl}, + {"ucinewgame", &uci_unimpl}, + {"position", &uci_unimpl}, + {"go", &uci_unimpl}, + {"stop", &uci_unimpl}, + {"ponderhit", &uci_unimpl}, + {"quit", &uci_unimpl}, +}; + +const uci_cmd UCI_INVALID = {"", &uci_unknown}; + +uci_cmd get_uci_command(char* command) { + size_t command_num = sizeof(UCI_COMMANDS) / sizeof(uci_cmd); + for(int i = 0; i < command_num; i++) { + int ci = 0; + uci_cmd to_try = UCI_COMMANDS[i]; + while(true) { + if(to_try.command[ci] != command[ci]) { + break; + } + if(command[ci] == '\0') { + return to_try; + } + ci++; + } + } + return UCI_INVALID; +} + +String read_word() { + int incoming = Serial.read(); + String str = String(); + do { + if(incoming != -1) { + str += (char)incoming; + } + incoming = Serial.read(); + } while(incoming != '\n' && incoming != ' '); + return str; +} + +uci_return handle_uci() { + if(Serial.available()) { + // There is input available; so likely a command + String command = read_word(); + uci_cmd handler = get_uci_command(command.c_str()); + handler.handler(); + } +} + +#endif