diff --git a/doc/assets/manta-1.0.0-py3-none-any.whl b/doc/assets/manta-1.0.0-py3-none-any.whl new file mode 100644 index 0000000..2989d1c Binary files /dev/null and b/doc/assets/manta-1.0.0-py3-none-any.whl differ diff --git a/doc/assets/trigger_positions.png b/doc/assets/trigger_positions.png deleted file mode 100644 index be1ac1a..0000000 Binary files a/doc/assets/trigger_positions.png and /dev/null differ diff --git a/doc/javascripts/serial.js b/doc/javascripts/serial.js new file mode 100644 index 0000000..7f7f283 --- /dev/null +++ b/doc/javascripts/serial.js @@ -0,0 +1,65 @@ +// serial.js +let port; + +async function connect() { + try { + port = await navigator.serial.requestPort(); + await port.open({ baudRate: 115200 }); + console.log('Connected to serial device:', port); + } catch (error) { + console.error('Error connecting to serial device:', error); + } +} + +async function write(addr, data) { + try { + if (!port) { + console.error('Serial port not connected'); + return; + } + + // Format the data to be sent + const sendData = `W${addr.toString(16).padStart(4, '0')}${data.toString(16).padStart(4, '0')}\r\n`; + + // Example: Sending data to the device + const writer = port.writable.getWriter(); + await writer.write(new TextEncoder().encode(sendData)); + await writer.releaseLock(); + console.log('Sent:', sendData); + } catch (error) { + console.error('Error sending data:', error); + } +} + +async function read(addr) { + try { + if (!port) { + console.error('Serial port not connected'); + return; + } + + // Format the read command + const readCmd = `R${addr.toString(16).padStart(4, '0')}\r\n`; + + // Send the read command to the device + const writer = port.writable.getWriter(); + await writer.write(new TextEncoder().encode(readCmd)); + await writer.releaseLock(); + console.log('Sent:', readCmd); + + // Read back the response + const reader = port.readable.getReader(); // Create a new reader + const { value, done } = await reader.read(); // Read from the stream + reader.releaseLock(); // Release the reader's lock + + if (!done) { + const responseData = new TextDecoder().decode(value); + console.log('Received:', responseData); + return responseData; + } + } catch (error) { + console.error('Error reading data:', error); + } +} + +document.getElementById('connectButton').addEventListener('click', connect); \ No newline at end of file diff --git a/doc/javascripts/upload.js b/doc/javascripts/upload.js new file mode 100644 index 0000000..f075e9e --- /dev/null +++ b/doc/javascripts/upload.js @@ -0,0 +1,24 @@ +let data; +let fileUploaded = false; + +document.getElementById('fileInput').addEventListener('change', function(event) { + const file = event.target.files[0]; + const reader = new FileReader(); + reader.onload = function(e) { + data = e.target.result; + fileUploaded = true; // Set the flag to indicate file upload completion + }; + reader.readAsText(file); +}); + +function runAfterUpload() { + if (!fileUploaded) { + setTimeout(runAfterUpload, 100); // Check again after 100ms + return; + } + + // Your additional JavaScript code to run after file upload + web_terminal(data); +} + +runAfterUpload(); // Start checking for file upload completion \ No newline at end of file diff --git a/doc/javascripts/web_terminal.js b/doc/javascripts/web_terminal.js new file mode 100644 index 0000000..3bd91a6 --- /dev/null +++ b/doc/javascripts/web_terminal.js @@ -0,0 +1,57 @@ +async function web_terminal(data){ + let pyodide = await loadPyodide(); + + // Load Manta.yaml into pyodide's file system + pyodide.FS.writeFile("/manta.yaml", data, { encoding: "utf8" }); + + // Load micropip, setuptools, manta + await pyodide.loadPackage("micropip"); + await pyodide.loadPackage("setuptools"); + const micropip = pyodide.pyimport("micropip"); + await micropip.install('../assets/manta-1.0.0-py3-none-any.whl'); + + pyodide.runPythonAsync(` + import asyncio + import time + + from js import read, write + from manta.utils import value_to_words + + from manta import Manta + m = Manta("/manta.yaml") + print(m.my_io_core) + + async def set_probe(name, value): + # Write value to core + probe = m.my_io_core._memory_map.get(name) + addrs = probe["addrs"] + datas = value_to_words(value, len(addrs)) + for a, d in zip(addrs, datas): + await write(a, d) + + # Pulse strobe register + await write(m.my_io_core._base_addr, 0) + await write(m.my_io_core._base_addr, 1) + await write(m.my_io_core._base_addr, 0) + + async def foobar(): + for i in range(10): + await set_probe(f"LED{i%4}", 1) + await set_probe(f"LED{i%4}", 0) + print(i) + + #loop = asyncio.get_event_loop() + #loop.run_until_complete(foobar()) + + async def barfoo(): + print("entering barfoo") + print(await read(m.my_io_core._base_addr)) + print(await read(m.my_io_core._base_addr + 1)) + + loop = asyncio.get_event_loop() + loop.run_until_complete(barfoo()) + #asyncio.run(foobar()) # doesn't work! asyncio.run() cannot be called from a running event loop + #await foobar() # doesn't work either! await outside function + #await barfoo() # doesn't work either! await outside function + `); +} \ No newline at end of file diff --git a/doc/web_terminal.md b/doc/web_terminal.md new file mode 100644 index 0000000..7bb3285 --- /dev/null +++ b/doc/web_terminal.md @@ -0,0 +1,36 @@ + + +## Open Serial Port + + +## Load Manta Configuration File + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index a82ea34..912cf09 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -66,6 +66,7 @@ nav: - Getting Started: getting_started.md - Alternatives: alternatives.md - Architecture: architecture.md + - Web Terminal: web_terminal.md - Usage: - IO Core: io_core.md - Logic Analyzer Core: logic_analyzer_core.md