""" ui/code_templates.py Code templates for derived channel kinds. BUILTIN_TEMPLATES — shown as read-only previews for built-in kinds. "Edit as Custom Script" copies the template into custom_script. Uses exec-style: assign to `result`. SCRIPT_TEMPLATES — default starter code shown when user picks a script kind. expression → single Python expression (no assignment) function → auto-wrapped as def compute(x, t): ... use return custom_script → exec-style block, assign to `result` Namespace available in all kinds: x — list of source values in source order — each source's channel_id as a named variable (same as x[i]) t — elapsed time (seconds) math — Python math module vars — shared SignalProcessor._script_vars dict (read/write) state — per-channel persistent dict (survives between evaluations) """ BUILTIN_TEMPLATES: dict = { "none": """\ result = x[0] """, "derivative": """\ prev_v = state.get("v", x[0]) prev_t = state.get("t", t) state["v"] = x[0] state["t"] = t result = (x[0] - prev_v) / (t - prev_t) if t != prev_t else 0.0 """, "derivative_channel": """\ prev_v = state.get("v", x[0]) prev_x = state.get("x", x[1]) state["v"] = x[0] state["x"] = x[1] result = (x[0] - prev_v) / (x[1] - prev_x) if x[1] != prev_x else 0.0 """, "second_derivative": """\ prev_v = state.get("v", x[0]) prev_t = state.get("t", t) prev_vel = state.get("vel", 0.0) cur_vel = (x[0] - prev_v) / (t - prev_t) if t != prev_t else 0.0 result = (cur_vel - prev_vel) / (t - prev_t) if t != prev_t else 0.0 state["v"] = x[0] state["t"] = t state["vel"] = cur_vel """, "second_derivative_channel": """\ prev_v = state.get("v", x[0]) prev_x = state.get("x", x[1]) prev_vel = state.get("vel", 0.0) cur_vel = (x[0] - prev_v) / (x[1] - prev_x) if x[1] != prev_x else 0.0 result = (cur_vel - prev_vel) / (x[1] - prev_x) if x[1] != prev_x else 0.0 state["v"] = x[0] state["x"] = x[1] state["vel"] = cur_vel """, "rms": """\ import math as _math buf = state.setdefault("buf", []) buf.append(x[0]) window = 20 if len(buf) > window: buf.pop(0) result = _math.sqrt(sum(v * v for v in buf) / len(buf)) """, "power": """\ result = x[0] * x[1] """, "difference": """\ result = x[0] - x[1] """, "sum": """\ result = sum(x) """, } # Default starter code shown when user selects a script kind SCRIPT_TEMPLATES: dict = { "expression": "x[0]", "function": """\ offset = vars.get("offset", 0) return x[0] - offset """, "custom_script": """\ zero = vars.get("zero", 0) result = x[0] - zero """, }