ArduChess/Uci.h

80 lines
1.6 KiB
C

#ifndef __UCI_H_INC
#define __UCI_H_INC
typedef void uci_return;
typedef uci_return (*uci_handler)();
struct uci_cmd {
const 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(const char* command) {
size_t command_num = sizeof(UCI_COMMANDS) / sizeof(uci_cmd);
for(size_t i = 0; i < command_num; i++) {
size_t ci = 0;
uci_cmd to_try = UCI_COMMANDS[i];
while(true) {
char reference = to_try.command[ci];
if(reference != 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