2022-08-19 14:58:58 +01:00
|
|
|
MicroPython WebAssembly
|
|
|
|
=======================
|
2018-01-19 07:35:42 +00:00
|
|
|
|
2022-08-19 14:58:58 +01:00
|
|
|
MicroPython for [WebAssembly](https://webassembly.org/).
|
2018-01-19 07:35:42 +00:00
|
|
|
|
|
|
|
Dependencies
|
|
|
|
------------
|
|
|
|
|
2022-08-19 14:58:58 +01:00
|
|
|
Building webassembly port bears the same requirements as the standard
|
|
|
|
MicroPython ports with the addition of Emscripten (and uglify-js for the
|
|
|
|
minified file).
|
|
|
|
|
|
|
|
The output includes `micropython.js` (a JavaScript wrapper for the
|
|
|
|
MicroPython runtime) and `firmware.wasm` (actual MicroPython compiled to
|
|
|
|
WASM).
|
2018-01-19 07:35:42 +00:00
|
|
|
|
|
|
|
Build instructions
|
|
|
|
------------------
|
|
|
|
|
|
|
|
In order to build micropython.js, run:
|
|
|
|
|
|
|
|
$ make
|
|
|
|
|
|
|
|
To generate the minified file micropython.min.js, run:
|
|
|
|
|
|
|
|
$ make min
|
|
|
|
|
|
|
|
Running with Node.js
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
Access the repl with:
|
|
|
|
|
|
|
|
$ node build/micropython.js
|
|
|
|
|
|
|
|
Stack size may be modified using:
|
|
|
|
|
2021-06-24 01:04:15 +01:00
|
|
|
$ node build/micropython.js -X stack=64K
|
2018-01-19 07:35:42 +00:00
|
|
|
|
|
|
|
Where stack size may be represented in Bytes, KiB or MiB.
|
|
|
|
|
|
|
|
MicroPython scripts may be executed using:
|
|
|
|
|
2021-06-24 01:04:15 +01:00
|
|
|
$ node build/micropython.js hello.py
|
2018-01-19 07:35:42 +00:00
|
|
|
|
2021-06-24 01:04:15 +01:00
|
|
|
Alternatively micropython.js may by accessed by other javascript programs in node
|
2018-01-19 07:35:42 +00:00
|
|
|
using the require command and the general API outlined below. For example:
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
var mp_js = require('./build/micropython.js');
|
|
|
|
|
|
|
|
mp_js_init(64 * 1024);
|
|
|
|
mp_js_do_str("print('hello world')\n");
|
|
|
|
```
|
|
|
|
|
|
|
|
Running with HTML
|
|
|
|
-----------------
|
|
|
|
|
|
|
|
The prerequisite for browser operation of micropython.js is an element with
|
|
|
|
the id `mp_js_stdout` which receives `print` events. The following code
|
|
|
|
demonstrates basic functionality:
|
|
|
|
|
|
|
|
```html
|
|
|
|
<!doctype html>
|
|
|
|
<html>
|
|
|
|
<head>
|
|
|
|
<script src="build/micropython.js"></script>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id='mp_js_stdout'></div>
|
|
|
|
<script>
|
|
|
|
mp_js_stdout.addEventListener('print', function(e) {
|
|
|
|
document.write(e.data);
|
|
|
|
}, false);
|
|
|
|
|
|
|
|
mp_js_init(64 * 1024);
|
|
|
|
mp_js_do_str('print(\'hello world\')');
|
|
|
|
</script>
|
|
|
|
</body>
|
|
|
|
</html>
|
|
|
|
```
|
|
|
|
|
|
|
|
MicroPython code execution will suspend the browser so be sure to atomize usage
|
2021-06-24 01:04:15 +01:00
|
|
|
within this environment. Unfortunately interrupts have not been implemented for the
|
2018-01-19 07:35:42 +00:00
|
|
|
browser.
|
|
|
|
|
|
|
|
Testing
|
|
|
|
-------
|
|
|
|
|
|
|
|
Run the test suite using:
|
|
|
|
|
|
|
|
$ make test
|
|
|
|
|
|
|
|
API
|
|
|
|
---
|
|
|
|
|
|
|
|
The following functions have been exposed to javascript.
|
|
|
|
|
|
|
|
```
|
|
|
|
mp_js_init(stack_size)
|
|
|
|
```
|
|
|
|
|
|
|
|
Initialize MicroPython with the given stack size in bytes. This must be
|
|
|
|
called before attempting to interact with MicroPython.
|
|
|
|
|
|
|
|
```
|
|
|
|
mp_js_do_str(code)
|
|
|
|
```
|
|
|
|
|
|
|
|
Execute the input code. `code` must be a `string`.
|
|
|
|
|
|
|
|
```
|
|
|
|
mp_js_init_repl()
|
|
|
|
```
|
|
|
|
|
|
|
|
Initialize MicroPython repl. Must be called before entering characters into
|
|
|
|
the repl.
|
|
|
|
|
|
|
|
```
|
|
|
|
mp_js_process_char(char)
|
|
|
|
```
|
|
|
|
|
2021-06-24 01:04:15 +01:00
|
|
|
Input character into MicroPython repl. `char` must be of type `number`. This
|
2018-01-19 07:35:42 +00:00
|
|
|
will execute MicroPython code when necessary.
|