from config import HOME # The three moves the old firmware had baked in, rewritten as keyframes. # They double as examples for the LLM and as an offline fallback. PUSH = [ ((50, 0, 0, 10), 300), ((50, 120, 60, 10), 300), ((50, 120, 60, 10), 2000), (HOME, 1000), ] SPIN = [ ((50, 80, 60, 60), 300), ((180, 80, 60, 60), 1000), ((0, 80, 60, 60), 1350), ((180, 80, 60, 60), 1350), ((0, 80, 60, 60), 1350), ((180, 80, 60, 60), 1350), ((50, 80, 60, 60), 1000), ((50, 80, 60, 60), 2000), (HOME, 1000), ] PENALTY = [ ((50, 0, 0, 10), 300), ((50, 0, 0, 10), 500), ((50, 120, 0, 10), 150), ((50, 120, 0, 10), 2000), (HOME, 1000), ] GO_HOME = [(HOME, 1000)] EXAMPLES = { "push": PUSH, "spin around": SPIN, "penalty kick": PENALTY, } KEYWORDS = [ (("push",), "push", PUSH), (("spin", "spend"), "spin", SPIN), (("penalty", "kick"), "penalty", PENALTY), (("home", "reset", "처음", "홈"), "home", GO_HOME), ] STOP_WORDS = ("stop", "halt", "freeze", "정지", "멈춰", "스톱") def is_stop(text): t = text.lower() return any(w in t for w in STOP_WORDS) def match_keyword(text): t = text.lower() for words, label, steps in KEYWORDS: if any(w in t for w in words): return label, steps return None