Add bounded MCP text input for Sprinter programs

This commit is contained in:
Александр Петров
2026-09-17 23:17:38 +03:00
parent 958ad0ae0f
commit e8189b137a
11 changed files with 195 additions and 18 deletions
+35
View File
@@ -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')