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"] +}