diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..872cb24
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,5 @@
+index.html linguist-generated=true
+assets/index.html linguist-generated=true
+assets/js/loader.js linguist-generated=true
+assets/js/binary.js linguist-generated=true
+assets/version.txt linguist-generated=true
diff --git a/.github/workflows/makecode-release.yml b/.github/workflows/makecode-release.yml
new file mode 100644
index 0000000..63802b9
--- /dev/null
+++ b/.github/workflows/makecode-release.yml
@@ -0,0 +1,63 @@
+name: MakeCode Arcade Release
+
+on:
+ release:
+ types:
+ - created
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [8.x]
+
+ steps:
+ - uses: actions/checkout@v1
+ - name: install node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: install makecode
+ run: |
+ npm install -g pxt
+ pxt target arcade
+ - name: build js
+ run: |
+ pxt clean
+ pxt install
+ pxt build --cloud
+ - name: build D51
+ continue-on-error: true
+ run: |
+ pxt clean
+ pxt install --hw samd51
+ pxt build --hw samd51 --cloud
+ cp ./built/binary.uf2 binary-d51.uf2
+ - name: build F4
+ continue-on-error: true
+ run: |
+ pxt clean
+ pxt install --hw stm32f401
+ pxt build --hw stm32f401 --cloud
+ cp ./built/binary.uf2 binary-f4.uf2
+ - name: build P0
+ continue-on-error: true
+ run: |
+ pxt clean
+ pxt install --hw rpi
+ pxt build --hw rpi --cloud
+ cp ./built/binary.uf2 binary-p0.uf2
+ - name: bundle all
+ run: |
+ cat binary-*.uf2 > built/arcade.uf2
+ - name: upload bundled
+ uses: actions/upload-release-asset@v1.0.1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ github.event.release.upload_url }}
+ asset_path: ./built/arcade.uf2
+ asset_name: arcade.uf2
+ asset_content_type: application/octet-stream
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 4feabaa..e428255 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,12 @@
-# Initial
+# MakeCode
+built
+node_modules
+yotta_modules
+yotta_targets
+pxt_modules
+.pxt
+_site
+*.db
+*.tgz
+.header.json
+.simstate.json
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..65a6eec
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["ms-edu.pxt-vscode-web"]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..d865f58
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,29 @@
+{
+ "editor.formatOnType": true,
+ "files.autoSave": "afterDelay",
+ "files.watcherExclude": {
+ "**/.git/objects/**": true,
+ "**/built/**": true,
+ "**/node_modules/**": true,
+ "**/yotta_modules/**": true,
+ "**/yotta_targets": true,
+ "**/pxt_modules/**": true,
+ "**/.pxt/**": true
+ },
+ "files.associations": {
+ "*.blocks": "html",
+ "*.jres": "json"
+ },
+ "search.exclude": {
+ "**/built": true,
+ "**/node_modules": true,
+ "**/yotta_modules": true,
+ "**/yotta_targets": true,
+ "**/pxt_modules": true,
+ "**/.pxt": true
+ },
+ "files.exclude": {
+ "**/pxt_modules": true,
+ "**/.pxt": true
+ }
+}
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..91ceacd
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,2 @@
+source 'https://rubygems.org'
+gem 'github-pages', group: :jekyll_plugins
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..9068464
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+all: deploy
+
+build:
+ pxt build
+
+deploy:
+ pxt deploy
+
+test:
+ pxt test
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c54bd7a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,31 @@
+
+> Open this page at [https://sheila111.github.io/test/](https://sheila111.github.io/test/)
+
+## Use as Extension
+
+This repository can be added as an **extension** in MakeCode.
+
+* open [https://arcade.makecode.com/](https://arcade.makecode.com/)
+* click on **New Project**
+* click on **Extensions** under the gearwheel menu
+* search for **https://github.com/sheila111/test** and import
+
+## Edit this project ![Build status badge](https://github.com/sheila111/test/workflows/MakeCode/badge.svg)
+
+To edit this repository in MakeCode.
+
+* open [https://arcade.makecode.com/](https://arcade.makecode.com/)
+* click on **Import** then click on **Import URL**
+* paste **https://github.com/sheila111/test** and click import
+
+## Blocks preview
+
+This image shows the blocks code from the last commit in master.
+This image may take a few minutes to refresh.
+
+![A rendered view of the blocks](https://github.com/sheila111/test/raw/master/.github/makecode/blocks.png)
+
+#### Metadata (used for search, rendering)
+
+* for PXT/arcade
+
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 0000000..fde3317
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,8 @@
+makecode:
+ target: arcade
+ platform: arcade
+ home_url: https://arcade.makecode.com/
+theme: jekyll-theme-slate
+include:
+ - assets
+ - README.md
diff --git a/assets.json b/assets.json
new file mode 100644
index 0000000..e69de29
diff --git a/assets/index.html b/assets/index.html
new file mode 100644
index 0000000..41e85c8
--- /dev/null
+++ b/assets/index.html
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ⇲
+
+
+
diff --git a/assets/js/custom.js b/assets/js/custom.js
new file mode 100644
index 0000000..f6f1e21
--- /dev/null
+++ b/assets/js/custom.js
@@ -0,0 +1,11 @@
+/**
+ * This will be loaded before starting the simulator.
+ * If you wish to add custom javascript,
+ * ** make sure to add this line to pxt.json**
+ *
+ * "disableTargetTemplateFiles": true
+ *
+ * otherwise MakeCode will override your changes.
+ *
+ * To register a constrol simmessages, use addSimMessageHandler
+ */
diff --git a/assets/js/loader.js b/assets/js/loader.js
new file mode 100644
index 0000000..849eef5
--- /dev/null
+++ b/assets/js/loader.js
@@ -0,0 +1,169 @@
+var channelHandlers = {}
+
+function addSimMessageHandler(channel, handler) {
+ channelHandlers[channel] = handler;
+}
+
+function makeCodeRun(options) {
+ var code = "";
+ var isReady = false;
+ var simState = {}
+ var simStateChanged = false
+ var started = false;
+ var meta = undefined;
+
+ // hide scrollbar
+ window.scrollTo(0, 1);
+ // init runtime
+ initSimState();
+ fetchCode();
+
+ // helpers
+ function fetchCode() {
+ sendReq(options.js, function (c, status) {
+ if (status != 200)
+ return;
+ code = c;
+ // find metadata
+ code.replace(/^\/\/\s+meta=([^\n]+)\n/m, function (m, metasrc) {
+ meta = JSON.parse(metasrc);
+ })
+ var vel = document.getElementById("version");
+ if (meta.version && meta.repo && vel) {
+ var ap = document.createElement("a");
+ ap.download = "arcade.uf2";
+ ap.href = "https://github.com/" + meta.repo + "/releases/download/v" + meta.version + "/arcade.uf2";
+ ap.innerText = "v" + meta.version;
+ vel.appendChild(ap);
+ }
+ // load simulator with correct version
+ document.getElementById("simframe")
+ .setAttribute("src", meta.simUrl);
+ initFullScreen();
+ })
+ }
+
+ function startSim() {
+ if (!code || !isReady || started)
+ return
+ setState("run");
+ started = true;
+ const runMsg = {
+ type: "run",
+ parts: [],
+ code: code,
+ partDefinitions: {},
+ cdnUrl: meta.cdnUrl,
+ version: meta.target,
+ storedState: simState,
+ frameCounter: 1,
+ options: {
+ "theme": "green",
+ "player": ""
+ },
+ id: "green-" + Math.random()
+ }
+ postMessage(runMsg);
+ }
+
+ function stopSim() {
+ setState("stopped");
+ postMessage({
+ type: "stop"
+ });
+ started = false;
+ }
+
+ window.addEventListener('message', function (ev) {
+ var d = ev.data
+ if (d.type == "ready") {
+ var loader = document.getElementById("loader");
+ if (loader)
+ loader.remove();
+ isReady = true;
+ startSim();
+ } else if (d.type == "simulator") {
+ switch (d.command) {
+ case "restart":
+ stopSim();
+ startSim();
+ break;
+ case "setstate":
+ if (d.stateValue === null)
+ delete simState[d.stateKey];
+ else
+ simState[d.stateKey] = d.stateValue;
+ simStateChanged = true;
+ break;
+ }
+ } else if (d.type === "messagepacket" && d.channel) {
+ const handler = channelHandlers[d.channel]
+ if (handler) {
+ try {
+ const buf = d.data;
+ const str = uint8ArrayToString(buf);
+ const data = JSON.parse(str)
+ handler(data);
+ } catch (e) {
+ console.log(`invalid simmessage`)
+ console.log(e)
+ }
+ }
+ }
+ }, false);
+
+ // helpers
+ function uint8ArrayToString(input) {
+ let len = input.length;
+ let res = ""
+ for (let i = 0; i < len; ++i)
+ res += String.fromCharCode(input[i]);
+ return res;
+ }
+
+ function setState(st) {
+ var r = document.getElementById("root");
+ if (r)
+ r.setAttribute("data-state", st);
+ }
+
+ function postMessage(msg) {
+ const frame = document.getElementById("simframe");
+ if (frame)
+ frame.contentWindow.postMessage(msg, meta.simUrl);
+ }
+
+ function sendReq(url, cb) {
+ var xhttp = new XMLHttpRequest();
+ xhttp.onreadystatechange = function () {
+ if (xhttp.readyState == 4) {
+ cb(xhttp.responseText, xhttp.status)
+ }
+ };
+ xhttp.open("GET", url, true);
+ xhttp.send();
+ }
+
+ function initSimState() {
+ try {
+ simState = JSON.parse(localStorage["simstate"])
+ } catch (e) {
+ simState = {}
+ }
+ setInterval(function () {
+ if (simStateChanged)
+ localStorage["simstate"] = JSON.stringify(simState)
+ simStateChanged = false
+ }, 200)
+ }
+
+ function initFullScreen() {
+ var sim = document.getElementById("simframe");
+ var fs = document.getElementById("fullscreen");
+ if (fs && sim.requestFullscreen) {
+ fs.onclick = function() { sim.requestFullscreen(); }
+ } else if (fs) {
+ fs.remove();
+ }
+ }
+}
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..4293de6
--- /dev/null
+++ b/index.html
@@ -0,0 +1,187 @@
+---
+# this is an empty front matter
+---
+
+
+
+
+
+ {{ site.github.project_title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/main.blocks b/main.blocks
new file mode 100644
index 0000000..eb39f70
--- /dev/null
+++ b/main.blocks
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/main.ts b/main.ts
new file mode 100644
index 0000000..0519ecb
--- /dev/null
+++ b/main.ts
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/pxt.json b/pxt.json
new file mode 100644
index 0000000..02bb5ae
--- /dev/null
+++ b/pxt.json
@@ -0,0 +1,25 @@
+{
+ "name": "test",
+ "version": "0.0.0",
+ "description": "",
+ "dependencies": {
+ "device": "*"
+ },
+ "files": [
+ "README.md",
+ "main.blocks",
+ "main.ts"
+ ],
+ "testFiles": [
+ "test.ts"
+ ],
+ "public": true,
+ "targetVersions": {
+ "target": "1.13.9",
+ "targetId": "arcade"
+ },
+ "supportedTargets": [
+ "arcade"
+ ],
+ "preferredEditor": "blocksprj"
+}
diff --git a/test.ts b/test.ts
new file mode 100644
index 0000000..7bf240c
--- /dev/null
+++ b/test.ts
@@ -0,0 +1 @@
+// tests go here; this will not be compiled when this package is used as an extension.
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..46f831b
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "target": "ES5",
+ "noImplicitAny": true,
+ "outDir": "built",
+ "rootDir": "."
+ },
+ "exclude": ["pxt_modules/**/*test.ts"]
+}