Add bounded MCP text input for Sprinter programs
This commit is contained in:
@@ -130,6 +130,41 @@ class McpSession:
|
||||
self.call('input_key', {'tag': release_tag, 'mask': release_mask,
|
||||
'down': False, 'owner': self.owner})
|
||||
|
||||
def type_string(self, value: str):
|
||||
"""Послать строку по физической клавиатуре с паузами между клавишами."""
|
||||
from mame_interactive import resolve
|
||||
|
||||
if not isinstance(value, str) or not value or len(value) > 64:
|
||||
raise SessionError('type_string принимает 1..64 символа')
|
||||
try:
|
||||
for char in value:
|
||||
resolve(char)
|
||||
except ValueError as error:
|
||||
raise SessionError(str(error)) from error
|
||||
if not self.status()['running']:
|
||||
raise SessionError('Ввод строки возможен только при running CPU')
|
||||
typed = 0
|
||||
stopped = False
|
||||
for char in value:
|
||||
result = self.press_key(char)
|
||||
typed += 1
|
||||
stopped = result['stopped']
|
||||
if stopped or typed == len(value):
|
||||
break
|
||||
snapshot = self.call('snapshot')
|
||||
start = snapshot['frame']
|
||||
deadline = time.monotonic() + 4
|
||||
while snapshot['state'] == 'running' and snapshot['frame'] - start < 4:
|
||||
if time.monotonic() >= deadline:
|
||||
raise SessionError('Межклавишная пауза не получила кадры за 4 с')
|
||||
time.sleep(.01)
|
||||
snapshot = self.call('snapshot')
|
||||
stopped = snapshot['state'] != 'running'
|
||||
if stopped:
|
||||
break
|
||||
return {'requested': len(value), 'typed': typed,
|
||||
'complete': typed == len(value), 'stopped': stopped}
|
||||
|
||||
def variables(self):
|
||||
return self.call('variables')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user