Skip to content

Commit e432ee7

Browse files
authored
Merge pull request #6 from haklein/wip-move-event
Wip move event
2 parents 6841faf + 453d557 commit e432ee7

File tree

4 files changed

+65
-27
lines changed

4 files changed

+65
-27
lines changed

certabo-lichess.py

+5-8
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,10 @@ def handle_state_change(self, game_state):
9292
self.certabo.set_board_from_fen(tmp_chessboard.fen())
9393
if tmp_chessboard.turn == self.certabo.get_color():
9494
logging.info('it is our turn')
95-
while self.certabo.has_user_move() == []:
96-
time.sleep(0.1)
97-
ucimove = self.certabo.has_user_move()[0]
98-
logging.info(f'our move: {ucimove}')
95+
moves = self.certabo.get_user_move()
96+
logging.info(f'our move: {moves}')
9997
try:
100-
self.client.board.make_move(self.certabo.get_reference(), ucimove)
98+
self.client.board.make_move(self.certabo.get_reference(), moves[0])
10199
except:
102100
e = sys.exc_info()[0]
103101
logging.info(f'exception on make_move: {e}')
@@ -193,9 +191,8 @@ def setup_new_gameid(gameId):
193191
if mycertabo.get_state() == 'myturn':
194192
logging.info(f'starting new game, checking for user move')
195193
mycertabo.set_state('init')
196-
while mycertabo.has_user_move() == []:
197-
time.sleep(0.1)
198-
client.board.make_move(mycertabo.get_reference(), mycertabo.has_user_move()[0])
194+
moves = mycertabo.get_user_move()
195+
client.board.make_move(mycertabo.get_reference(), moves[0])
199196

200197
except berserk.exceptions.ResponseError as e:
201198
print(f'ERROR: Invalid server response: {e}')

certabo/certabo.py

+28-7
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ def __init__(self, port='auto', calibrate=False, **kwargs):
4141
self.board_state_usb = ""
4242
self.mystate = "init"
4343
self.reference = ""
44+
self.move_event = threading.Event()
45+
self.wait_for_move = False
46+
self.pending_moves = []
4447

4548
# internal values for CERTABO board
4649
self.calibration_samples_counter = 0
@@ -60,12 +63,14 @@ def __init__(self, port='auto', calibrate=False, **kwargs):
6063
self.serialthread.daemon = True
6164
self.serialthread.start()
6265

63-
def has_user_move(self):
64-
try:
65-
moves = codes.get_moves(self.chessboard, self.board_state_usb)
66-
return moves
67-
except:
68-
return []
66+
def get_user_move(self):
67+
self.wait_for_move = True
68+
logging.debug('waiting for event signal')
69+
self.move_event.wait()
70+
self.move_event.clear()
71+
logging.debug(f'event signal received, pending moves: {self.pending_moves}')
72+
self.wait_for_move = False
73+
return self.pending_moves
6974

7075
def get_reference(self):
7176
return self.reference
@@ -122,9 +127,25 @@ def handle_usb_data(self, data):
122127
if self.usb_data_processed != []:
123128
test_state = codes.usb_data_to_FEN(self.usb_data_processed, self.rotate180)
124129
if test_state != "":
130+
if self.board_state_usb != test_state:
131+
new_position = True
132+
else:
133+
new_position = False
125134
self.board_state_usb = test_state
126-
# logging.info(f'info string FEN {test_state}')
127135
self.diff_leds()
136+
if new_position:
137+
# new board state via usb
138+
# logging.info(f'info string FEN {test_state}')
139+
if self.wait_for_move:
140+
logging.debug('trying to find user move in usb data')
141+
try:
142+
self.pending_moves = codes.get_moves(self.chessboard, self.board_state_usb, 1) # only search one move deep
143+
if self.pending_moves != []:
144+
logging.debug('firing event')
145+
# self.chessboard.push_uci(self.pending_moves[0])
146+
self.move_event.set()
147+
except:
148+
self.pending_moves = []
128149

129150
def calibrate_from_usb_data(self, usb_data):
130151
self.calibration_samples.append(usb_data)

certabo/codes.py

+12-11
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ class InvalidMove(Exception):
592592
pass
593593

594594

595-
def get_moves(board, fen):
595+
def get_moves(board, fen, max_depth =2):
596596
"""
597597
:param board:
598598
:type board: chess.Board
@@ -613,16 +613,17 @@ def get_moves(board, fen):
613613
logging.debug('Single move detected - {}'.format(move.uci()))
614614
return [move.uci()]
615615
copy_board.pop()
616-
for move in moves:
617-
copy_board.push(move)
618-
legal_moves2 = list(copy_board.generate_legal_moves())
619-
for move2 in legal_moves2:
620-
copy_board.push(move2)
621-
if board_fen == copy_board.board_fen():
622-
logging.debug('Double move detected - {}, {}'.format(move.uci(), move2.uci()))
623-
return [move.uci(), move2.uci()]
616+
if max_depth > 1:
617+
for move in moves:
618+
copy_board.push(move)
619+
legal_moves2 = list(copy_board.generate_legal_moves())
620+
for move2 in legal_moves2:
621+
copy_board.push(move2)
622+
if board_fen == copy_board.board_fen():
623+
logging.debug('Double move detected - {}, {}'.format(move.uci(), move2.uci()))
624+
return [move.uci(), move2.uci()]
625+
copy_board.pop()
624626
copy_board.pop()
625-
copy_board.pop()
626-
# logging.debug('Unable to detect moves')
627+
logging.debug('Unable to detect moves')
627628
raise InvalidMove()
628629

certabo/serialreader.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,31 @@ def __init__ (self, handler, device='auto'):
5555
self.connected = False
5656
self.handler = handler
5757
self.uart = None
58+
self.buf = bytearray()
5859

5960
def send_led(self, message: bytes):
6061
# logging.debug(f'Sending to serial: {message}')
6162
if self.connected:
6263
return self.uart.write(message)
6364
return None
6465

66+
def readline(self):
67+
i = self.buf.find(b"\n")
68+
if i >= 0:
69+
r = self.buf[:i+1]
70+
self.buf = self.buf[i+1:]
71+
return r
72+
while True:
73+
i = max(1, min(2048, self.uart.in_waiting))
74+
data = self.uart.read(i)
75+
i = data.find(b"\n")
76+
if i >= 0:
77+
r = self.buf + data[:i+1]
78+
self.buf[0:] = data[i+1:]
79+
return r
80+
else:
81+
self.buf.extend(data)
82+
6583
def run(self):
6684
while True:
6785
if not self.connected:
@@ -97,7 +115,8 @@ def run(self):
97115
try:
98116
while True:
99117
# logging.debug(f'serial data pending')
100-
raw_message = self.uart.readline()
118+
#raw_message = self.uart.readline()
119+
raw_message = self.readline()
101120
try:
102121
message = raw_message.decode("ascii")[1: -3]
103122
#if DEBUG:

0 commit comments

Comments
 (0)