class USBCPowerSupplySimulator extends HTMLElement { async init_mp(ctx, stdoutWriter) { let mp = await loadMicroPython({ stdout: stdoutWriter, stderr: stdoutWriter, }); mp.registerJsModule("console", { log: (s) => console.log(s) }); mp.registerJsModule("display", { draw: (buf) => { let bytes = [...buf].flatMap((x) => [x, x, x, 255]); let image = new ImageData(new Uint8ClampedArray(bytes), 240, 240); ctx.putImageData(image, 0, 0); }, }); return mp; } async init_editor() { const resp = await fetch("/assets/blog/micropython/example_micropython.py"); const program = await resp.text(); // Create an initial state for the view const initialState = cm6.createEditorState(program); let view = cm6.createEditorView( initialState, this.shadow.getElementById("editor") ); return view; } async setup() { this.render(); const canvas = this.shadow.querySelector("canvas"); const ctx = canvas.getContext("2d"); const mp_console = this.shadow.getElementById("micropython-stdout"); const stdoutWriter = (line) => { mp_console.innerText += line + "\n"; mp_console.scrollTo(0, mp_console.scrollHeight); }; const view = await this.init_editor(); const runPython = async () => { mp_console.innerText = ""; let mp = await this.init_mp(ctx, stdoutWriter); try { await mp.runPythonAsync(view.state.doc.toString()); } catch (e) { stdoutWriter(e); } }; const run_button = this.shadow.getElementById("run"); run_button.onclick = runPython; runPython(); } constructor() { super(); this.shadow = this.attachShadow({ mode: "open" }); } connectedCallback() { this.setup().catch(console.error); } render() { this.shadow.innerHTML = `

        `;
  }
}

customElements.define("usbc-power-supply-simulator", USBCPowerSupplySimulator);